Giter Club home page Giter Club logo

chainreaction's People

Contributors

haroldpirschner avatar juangamnik avatar maikmerten avatar windmueller avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

chainreaction's Issues

UICell: ArrayIndexOutOfBoundsException

When tinkering around and having some bigger chain reactions some cells barf out with the following exception. Afterwards there are cells without atoms but with a player color still assigned.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4
at de.maikmerten.chainreaction.swing.UICell.putAtomInternal(UICell.java:126)
at de.maikmerten.chainreaction.swing.UICell.addAdtom(UICell.java:67)
at de.maikmerten.chainreaction.swing.UICell.moveTo(UICell.java:77)
at de.maikmerten.chainreaction.swing.UIField.onAtomsMoved(UIField.java:90)
at de.maikmerten.chainreaction.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at de.maikmerten.chainreaction.swing.UICell.removeAtom(UICell.java:71)
at de.maikmerten.chainreaction.swing.UICell.moveTo(UICell.java:76)
at de.maikmerten.chainreaction.swing.UIField.onAtomsMoved(UIField.java:90)
at de.maikmerten.chainreaction.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:371)
at java.util.ArrayList.get(ArrayList.java:384)
at de.maikmerten.chainreaction.swing.UICell.removeAtom(UICell.java:71)
at de.maikmerten.chainreaction.swing.UICell.moveTo(UICell.java:76)
at de.maikmerten.chainreaction.swing.UIField.onAtomsMoved(UIField.java:90)
at de.maikmerten.chainreaction.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at de.maikmerten.chainreaction.swing.UICell.putAtomInternal(UICell.java:126)
at de.maikmerten.chainreaction.swing.UICell.addAdtom(UICell.java:67)
at de.maikmerten.chainreaction.swing.UICell.moveTo(UICell.java:77)
at de.maikmerten.chainreaction.swing.UIField.onAtomsMoved(UIField.java:90)
at de.maikmerten.chainreaction.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:371)
at java.util.ArrayList.get(ArrayList.java:384)
at de.maikmerten.chainreaction.swing.UICell.removeAtom(UICell.java:71)
at de.maikmerten.chainreaction.swing.UICell.moveTo(UICell.java:76)
at de.maikmerten.chainreaction.swing.UIField.onAtomsMoved(UIField.java:90)
at de.maikmerten.chainreaction.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Nice Logo

We sure need a logo for the splash screen and a small version for the other windows

RetroFont renders with mixed colors

I added retrofont support for the status text in dee95e8, but there are still rendering issues (see image). I added in UIStatus:97ff an ImageIO.write() that writes to /tmp/status<round>.png, so that you can see the result:

status2

Please remove that block after fixing this bug.

C64 font support

API for drawing C64 font on graphics2d, like this:

/**
 * @return 8x8 pixel Image
 */ 
public static Image getC64Char(char theChar);

/**
 * @return a FAST_SCALE scaled image for given font size (kind of multiplicator for 8x8 size image)
 */
public static Image getC64Char(char theChar, int fontSize);

New package name

Currently all code is contained in subpackages of de.maikmerten. Given that this project is now under the stewardship of several persons we perhaps should choose a package name that reflects this. Thoughts?

Game references

I would like to add this game (and the C64 version) to osgameclones.com but I'm needing references to the original game. I can't find any references on MobyGames or Wikipedia, could you possibly point me in the right direction? I can only find the original game to download, plus a couple of YouTube videos.

Still some update issue regarding FieldListener

Once I had a constellation leading to the following stack trace:

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: You cannot create an atom for no player
        at de.freewarepoint.cr.swing.UIPlayer.createAtom(UIPlayer.java:54)
        at de.freewarepoint.cr.swing.UICell.putAtomInternal(UICell.java:123)
        at de.freewarepoint.cr.swing.UICell.addAtom(UICell.java:64)
        at de.freewarepoint.cr.swing.UICell.moveTo(UICell.java:74)
        at de.freewarepoint.cr.swing.UIField.onAtomsMoved(UIField.java:95)
        at de.freewarepoint.cr.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:682)
        at java.awt.EventQueue$3.run(EventQueue.java:680)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at de.freewarepoint.cr.swing.UICell.draw(UICell.java:88)
        at de.freewarepoint.cr.swing.UIField.paint(UIField.java:160)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
        at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
        at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:682)
        at java.awt.EventQueue$3.run(EventQueue.java:680)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at de.freewarepoint.cr.swing.UICell.draw(UICell.java:88)
        at de.freewarepoint.cr.swing.UIField.paint(UIField.java:160)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
        at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
        at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:682)
        at java.awt.EventQueue$3.run(EventQueue.java:680)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
        at java.util.ArrayList.elementData(ArrayList.java:371)
        at java.util.ArrayList.get(ArrayList.java:384)
        at de.freewarepoint.cr.swing.UICell.removeAtom(UICell.java:68)
        at de.freewarepoint.cr.swing.UICell.moveTo(UICell.java:73)
        at de.freewarepoint.cr.swing.UIField.onAtomsMoved(UIField.java:95)
        at de.freewarepoint.cr.swing.SwingFieldListener$2.run(SwingFieldListener.java:46)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:682)
        at java.awt.EventQueue$3.run(EventQueue.java:680)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

RetroFont as a dedicated project or package

The retro font is very cool and by the way very retro. Perhaps it become a dedicated project. I could imagine that there might be many project with a need for such a retro font. And the library could grow (e.g., wobbling, color changing, fading (retro) text).

Tournament mode

In order to check, which AI is best, the game should have a tournament mode, where it starts the game in headless mode and plays e.g. a hundret games between each pairing of AIs available and builds then a ranking from the results

Structure the Project

The Game should be divided in some artifacts in order to separate GUI, backend, API, and AI. This will help to implement other clients/AIs.

More OO in backend

'byte player' and similar constructs seem to be artifacts from the C64. They should be replaced with OO concepts as needed

Save config

configurations (see #10, #9) should be saved in ~/.chainReaction/settings.properties

Support for additional AIs

  • Enhance the AI interface by a name
  • Add new AIs via ServiceLoader:
    • jar-File with corresponding service description has to be in the subfolder AIs/
    • URLClassLoader loads all jars in this folder during startup
    • ServiceLoader searches for AI services and adds their implementation to a AI-list (besides standard AI)

Nice little home page on freewarepoint.de

Shouldn't we have a static Homepage, with a short description, link to the github project, some screenshot and a "binary" (jar) download? It should have a black background. As soon as we have a logo, we should add it to the page.

What do you mean?

Configure speed

In SwingFieldListener there is a 'delay' attribute. It could be configured to be set to different predefined values in order to have fast game play or comprehensible chain reactions (e.g., no time, very fast, fast, normal, slow, really slow, unbelievably slow)

Polish main window

C64-ish main (game) window with nice images for the current player aside the game field. Status "bar" and Settings "bar" should be in a separate menu

Configure animations

Cell-bg (as it has an owner) and ball animation (enter, leave, idle) should be toggable.

AbstractMethodError when using loaded AI

When an AI is used which was loaded from the config directory, this exception is thrown:

Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: de.maikmerten.chainreaction.ai.DummyAI.setGame(Lde/maikmerten/chainreaction/Game;)V
    at de.maikmerten.chainreaction.swing.UIGame.startNewGame(UIGame.java:60)
    at de.maikmerten.chainreaction.swing.UIGame.<init>(UIGame.java:36)
    at de.maikmerten.chainreaction.swing.UIGame$3.run(UIGame.java:127)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:711)
    at java.awt.EventQueue.access$000(EventQueue.java:104)
    at java.awt.EventQueue$3.run(EventQueue.java:672)
    at java.awt.EventQueue$3.run(EventQueue.java:670)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:681)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

To reproduce this:

  1. mvn clean package in exampleAI directory
  2. mkdir ~/.chainReaction/AIs
  3. cp target/exampleAI-1.0-SNAPSHOT.jar ~/.chainReaction/AIs
  4. Replace "ai = new StandardAI();" with "ai = ais.get(0);" in UIGame.java

ThreadPoolExecutor exceptions

Exception in thread "Thread-138" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@69e4d7d rejected from java.util.concurrent.ThreadPoolExecutor@2f14cf0[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 63]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2013)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:816)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1337)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
    at java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:639)
    at de.freewarepoint.cr.swing.SwingFieldListener.executeDelayed(SwingFieldListener.java:85)
    at de.freewarepoint.cr.swing.SwingFieldListener.onAtomAdded(SwingFieldListener.java:37)
    at de.freewarepoint.cr.Field.fireOnAtomAdded(Field.java:234)
    at de.freewarepoint.cr.Field.putAtom(Field.java:109)
    at de.freewarepoint.cr.Game.selectMove(Game.java:61)
    at de.freewarepoint.cr.ai.StandardAI.doMove(StandardAI.java:106)
    at de.freewarepoint.cr.ai.AIThread.run(AIThread.java:27)

How should we Test the game?

How should we test the game? Is there a github or other free continuous integration server solution available, we could use? Should we add unit tests and integrate them in the maven build cycle?

Ideas?

AI testing mode

Every AI should give a score to every cell, and the game does the move of the cell with the highest score (this is a change of the AI API).

Then in 'AI testing' mode the game interrupts after the AI has calculated cell scores, shows them in the uifield, preselects the field it will choose and waits for the user to click anywhere or press enter or something similar (like a breakpoint). This way a AI developer can test his AI in various situations (and against other AIs) and track its decisions.

Refine Threading in Backend

  • By now there is a move blocker that is not thread safe and every move opens its own thread, which seems to be unnecessary. Perhaps a ThreadExecutor (SingleThread) is adequate like in SwingFieldListener?
  • The AI sleeps always 1,5s although the actual think-time should be substracted (will be more interesting if there are AIs which need more time to think)
  • If the Animation takes more than 1,5s, then the AI "answers" before the animation has ended. So you do not recognize what the AI did.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.