Codenjoy - CodingDojo framework for developers. Its goal is to organize fun teambuilding activities and/or train how to code. Already now we have a lot of games on board. And you can write one that will be your own.
All you need to develop a game is jdk8, maven3, git, and IDE Idea.
- install a git client locally, for example, tortoise git
- create an account on github or bitbucket
- make a fork (or copy the sample project) from the current repository
- pull the project to your computer
- install maven3 (download the archive and unzip it to
c:\java) - add the
M2_HOMEenvironment variable that points to the root ofc:\java\apache-maven-3.x.x - add the
;%M2_HOME%\binstring at the end of thePathvariable - install jdk8, if necessary (also to the folder
c:\java) - add the
JAVA_HOMEenvironment variable that points to the root ofc:\java\jdk1.8.x_xx - add the
;%JAVA_HOME%\binstring at the end of the Path variable - check by running cmd.exe with the
mvn -versioncommand. If installation is successful, you will see the command output the version of aven and java, rather than "command not found"
C:\Users\user>mvn -version
Apache Maven 3.x.x
Maven home: C:\java\apache-maven-3.x.x
Java version: 1.8.x_x, vendor: Oracle Corporation
Java home: C:\java\jdk1.8.x_xx\jre
Default locale: xxxxx, platform encoding: xxxxxxx
OS name: "xxxxxxxxxx", version: "xxx", arch: "xxxxx", family: "xxxxxxx"
C:\Users\user>
- download and install IntelliJ IDEA Community version
- install Lombok plugin for idea
You have to install the engine dependency located in the engine folder.
Watch out: its version may be updated, so you will have
to update it and your game's source code. To do this:
- open the
CodingDojo/games/enginefolder - run
setup.bat - make sure installation is successful - the dependency should be
installed under
C:\Users\<UserName>\.m2\repository\com\codenjoy\engine
Invent/recall a game that might interest others, does not involve following complicated rules, and people played it in childhood.
The game might have the same rules as the original, or might provide some variation. For example, you can turn a two-player game, such as the battleship, into a multiplayer game. Make sure the gamer will enjoy writing the AI algorithm (the challenges should be reasonably tough).
Do not hesitate to contact us If stumped, get in touch and we'll help you.
Then proceed to writing a model of the game you selected. The following section contains the required how-to.
Here is an example (in russian) of how a 'reversi'
model was written: part1,
part2,
par3.
You can investigate commits with this command
git log --oneline 71090be..8a12c53
Unit testing coverage is expected. It'd be still better to write the code following TDD, and if you don't know how watch this video (in russian).
And then email us. We'll arrange for code review if necessary. And once the model is ready, we'll integrate it to our framework, and help your arrange your first Codenjoy event.
Here is the repository https://github.com/codenjoyme/codenjoy-game. You should find out how to fork a project, how to commit in git.
Project Sample is a sample of a one-board game with all requisite artefacts. Learn how a project operates.
- import the
sampleproject asmaven projectto Idea - run all tests; as they progress, you should observe the green bar
- get sample/src/test/java/com/codenjoy/dojo/sample/model/SampleTest.java and see how tests for games are written.
- get sample/src/main/java/com/codenjoy/dojo/sample and see what are the minimum code requirements for a new game.
- the package here sample/src/main/java/com/codenjoy/dojo/sample/client has client code, with a part of it to be sent to the player as a game template
- the package sample/src/main/java/com/codenjoy/dojo/sample/client/ai has your AI algorithm that will automatically connect to the player and play with him or her.
- all the rest is the game engine.
- before you can implement your new game, take some time to familiarize
yourself with the main interfaces and framework classes. All of them are
located in the dependency engine. You should be interested in these:
- engine/src/main/java/com/codenjoy/dojo/services/Game.java
- engine/src/main/java/com/codenjoy/dojo/services/Joystick.java
- engine/src/main/java/com/codenjoy/dojo/services/Printer.java
- engine/src/main/java/com/codenjoy/dojo/services/GameType.java
- engine/src/main/java/com/codenjoy/dojo/services/multiplayer/GameField.java
- engine/src/main/java/com/codenjoy/dojo/services/multiplayer/GamePlayer.java
- engine/src/main/java/com/codenjoy/dojo/services/Tickable.java
- engine/src/main/java/com/codenjoy/dojo/services/PlayerScores.java
- engine/src/main/java/com/codenjoy/dojo/services/Point.java
- engine/src/main/java/com/codenjoy/dojo/services/GamePrinter.java
- engine/src/main/java/com/codenjoy/dojo/services/EventListener.java
- engine/src/main/java/com/codenjoy/dojo/services/Dice.java
- engine/src/main/java/com/codenjoy/dojo/services/State.java
- engine/src/main/java/com/codenjoy/dojo/services/Direction.java
- engine/src/main/java/com/codenjoy/dojo/services/settings/Settings.java
- engine/src/main/java/com/codenjoy/dojo/client/AbstractBoard.java
- engine/src/main/java/com/codenjoy/dojo/client/Solver.java
- engine/src/main/java/com/codenjoy/dojo/client/ClientBoard.java
- all of these are basic interfaces/classes that you use to integrate the new game into the main framework (like inserting a cartridge into a Dendy console).
- explore their description in java docs for the interfaces and classes of the dependency engine and the project sample.
To develop your game, you don't have to write all classes from
scratch - just base it off the sample project.
- copy the contents of the
samplefolder into themygamefolder (any name) and replace theSampleword toMyGameword in all classes. - your goal is to have your code well covered with tests, so that we can trust it. That's why you should develop the game using TDD. If this is an unfamiliar concept, we recommend this book by Ken Beck.
- maven will automatically assemble the game source for the client
in a zip file, as shown here
sample-clients.zip
Note that the
pom.xmlfile has amaven-antrun-pluginsection, where ant assembles this zip. It includes the pom.xml file, theElementsclass from the model package, and everything from theclientpackage except theaipackage. - write a manual for the game, see an example here:
- draw sprites - square-like pictures that will serve as the basis for rendering the game in the browser. Normally, they are freely available on the net. Png files with sprites can be found in the folder sample/src/main/webapp/resources/sprite/sample/. Important! Sprite names are not random, they should be associated with enum fields sample/src/main/java/com/codenjoy/dojo/sample/model/Elements.java. All names should be lowercase
- then implement your bot by analogy with sample/src/main/java/com/codenjoy/dojo/sample/client/ai/AISolver.java
- run DryRunGame class to see how your game works. You can check your bot also.
public class DryRunGame {
public static void main(String[] args) {
new LocalGameRunner()
.with(new GameRunner())
.add(new KeyboardSolver(),
// new AISolver(new RandomDice()),
new Board())
.run();
}
}
- another way to check how it's works is run sample/src/test/java/com/codenjoy/dojo/sample/SmokeTest.java
- assemble a jar file by running the
mvn packagecommand in the sample folder root - the jar file will be
sample\target\sample-engine.jar - email it to us at [email protected] with the
New game for codenjoysubject - than we will make a code review and you can improve the game
- Thanks!
- renname
samplefolder toyour-game - remove everything except
your-gamefolder - commit this changes
- push it to GitHub
- then go to another folder (outside game proect)
git clone https://github.com/codenjoyme/codenjoy.gitcd codenjoygit subtree add --prefix=CodingDojo/games2 https://github.com/yourgithub/your-game.git master- renname
CodingDojo/games2toCodingDojo/gameswith accept merging of two folders git add CodingDojo/games2git add CodingDojo/games/your-game- in the
CodingDojo/server/pom.xmlfile, add new profile according to the template specified in the comment. Profile name should represent game name for simplicity:
<!-- this is your new game
<profile>
<id>yourgame</id>
<activation>
<property>
<name>allGames</name>
</property>
</activation>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>yourgame-engine</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</profile>
-->- you must add a new game to the
CodingDojo/games/pom.xmlparent project in the modules section
<modules>
<module>games/engine</module>
<module>games/sample</module>
...
<module>games/yourgame</module> <!-- this is your new game -->
</modules>git add .- `git commit -m "[your-game] Added new game YourGame"
git push --all origin- then you can run codenjoy with this game
- if everything is OK, please prepare Pull Request with your game
There are several ways how you can build a game in jar. Each of them is used for its specific purpose.
To package an existing java client into an executable jar, run the following command:
mvn clean compile assembly:single -DskipTests=true -DgitDir=. -Pjar-with-dependencies
Here the gitDir parameter is used to specify the
location of the .git directory. You can also use
-Pjar-with-dependencies,noGit to skip git-info phase.
After assembly, a file <GAMENAME>-engine-exec.jar
will appear in target so you can run it:
java -jar ./target/<GAMENAME>-engine-exec.jar "<CONNECTION_URL>"
Here the <GAMENAME> is game name that you try to build.
Parameter <CONNECTION_URL> is optional - you can override connection URL hardcoded inside YourSolver class
java -jar ./target/<GAMENAME>-engine-exec.jar "http://codenjoy.com:80/codenjoy-contest/board/player/3edq63tw0bq4w4iem7nb?code=1234567890123456789"
You can run the game without a codenjoy server so that it will fully communicate with the ws client, as if the server were up. This is useful during game development.
To do this, the game must be able to implement it. For example MollyMage game contains a startup class Main in which the game starts. If your game has the same file, you can run the command:
mvn clean compile assembly:single -DskipTests=true -DgitDir=. -Pjar-local
Here the gitDir parameter is used to specify the
location of the .git directory. You can also use
-Pjar-local,noGit to skip git-info phase.
After assembly, a file <GAMENAME>-engine.jar will
appear in target so you can run it:
- for windows
java -jar -Dhost=127.0.0.1 -Dport=8080 -Dtimeout=1000 -DlogDisable=false -Dlog="output.txt" -DlogTime=true -DshowPlayers="2,3" -Drandom="random-soul-string" -DwaitFor=2 -Dsettings="{'boardSize':11, 'potionPower':7} <GAMENAME>-engine.jar"
- for linux
java -jar --host=127.0.0.1 --port=8080 --timeout=1000 --logDisable=false --log="output.txt" --logTime=true --showPlayers="2,3" --random="random-soul-string" --waitFor=2 --settings="{'boardSize':11, 'potionPower':7} <GAMENAME>-engine.jar"
Here:
<GAMENAME>is game name that you try to build.hostis always127.0.0.1portany port you wanttimeoutmilliseconds between tickslogDisabledisable log outputloglog filelogTimetrue if you want to print timestamp of each message in logshowPlayerstrue if you want to print player id of each message in lograndompseudo random soul string - it will affect pseudo random. For same string soul pseudo random will work the same.waitForlist of players that we are waiting for for before the startsettingsjson of game settings