Hello Battleships!

Hello Battleships!

Hello Battleships is a collaborative educational experience making networked multiplayer turn based games.

Battleships was the first implemented game, Memory the second.

Since it is primaryly an educational experience we focus on doing interesting things, like coding the server in Clojure, and writing clients in also interesting ways.

If you want to join in, we would be extatic.

license

http://www.gnu.org/licenses/agpl-3.0.html

So, basically it would be nice if you would contribute back code to the project if you feel like using it.

Discussion about game structures

What should the game structure look like? We would like to be able to support several different game types.

game example in this case eacsh player has separate boards for different aspects, ships, shots, etc

#+BEGIN_SRC clojure { :p1 {:name "joakim" :board [[0 0 0 (:ship 2 d)] [0 0 0 0] [0 0 0 0] [0 0 0 0]]} :p2 {:name "mattias" :board [[0 0 1 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]} } #+END_SRC clojure

another game example in this case the grid is shared for both(or more) players

#+BEGIN_SRC clojure { {:name "joakim" :id :p1} {:name "mattias" :id :p2}

:board [[0 0 :p2 :p1] [0 0 0 0] [0 0 {:p1 {:ship :l 2 :d d} :p2} 0] [0 0 0 0]]

}

#+END_SRC clojure

a layer approach

#+BEGIN_SRC clojure { {:name "joakim" :id :p1} {:name "mattias" :id :p2}

;;ships :entities { :p1 [[0 0 (:s 2 d) 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]] :p2 [[0 0 (:s 2 d) 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]}

;; shots that were fired :shots { :p1 [[0 0 1 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]] :p2 [[0 0 1 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]]}

} #+END_SRC clojure

again a shared grid example here im thinking that it feels like its nicer with a shared world and views of the world, that might have fog of war and stuff

#+BEGIN_SRC clojure { :players {{:name "joakim" :id :p1} {:name "mattias" :id :p2}}

;; 0 should be nil :board [[0 0 {:type :shot :owner :p2 } {:type :ship :owner :p1 :l 2 :dir 'd} 0 0 0 0] [0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0]

]

} #+END_SRC clojure

so, is this useful for other games? heres Go , seems ok. :type and :owner are generic enough to be usable across games

#+BEGIN_SRC clojure { :players {{:name "joakim" :id :p1} {:name "mattias" :id :p2}}

;; 0 should be nil :board [[{:type 'stone :owner :p1} 0 0] 0 [0 0 0 0 ] [0 0 0 0 ] [0 0 0 {:type 'stone :owner :p2} ] ]

} #+END_SRC clojure currently the structure looks like this:

#+BEGIN_SRC clojure {:board [[{:view #{mv}} {:view #{mv}} {:entities ({:type ship, :owner mv}), :view #{mv}} {:view #{mv}}] [{:view #{mv}} {:view #{mv}} {:view #{mv}} {:view #{mv}}] [{:view #{mv}} {:entities ({:type ship, :owner mv}), :view #{mv}} {:view #{mv}} {:view #{mv}}] [{:entities ({:type ship, :owner mv}), :view #{mv}} {:view #{mv}} {:view #{mv}} {:entities ({:type ship, :owner mv}), :view #{mv}}] [{:view #{jv}} {:view #{jv}} {:entities ({:type ship, :owner jv}), :view #{jv}} {:view #{jv}}] [{:view #{jv}} {:view #{jv}} {:view #{jv}} {:entities ({:type ship, :owner jv}), :view #{jv}}] [{:view #{jv}} {:entities ({:type ship, :owner jv}), :view #{jv}} {:view #{jv}} {:view #{jv}}] [{:entities ({:type ship, :owner jv}), :view #{jv}} {:view #{jv}} {:view #{jv}} {:view #{jv}}]], :players #{jv mv}, :turn 0, :last-player nil} #+END_SRC clojure

:view determines if a player can see the cell or not. :entities is a list of things in a cell.

General technology discussion

The server uses http-kit, because its lightweight, simple to work with, and supports websockets nicely.

As of now theres no security implemented, but the friend library seems nice.

There are some beginnings of a json interface, and it just uses plain Clojure and json lib. If we want to do anything more advanced, we are eyeing fnhouse.

Buildinng and running the server

lein run

the web port is atm 7890.

making a self contained jar: lein uberjar

Clients

The idea is to write fat clients using a json rest interface.

There is also a primitive inbuilt html client to test game logic.

Also there is a client done with reagent.

working with clojurescript

Do this in a separate shell, and the cljs files will be compiled to js files automatically. then they will be served from the static dir by httpkit.

lein cljsbuild auto

we use austin as the brepl backend.

cljx for sharing code between clj and cljs.

games

in progress

  • battleships
  • memory

should be pretty easy

  • gomuko

other games

were looking for similar games, with perhaps some simple extra facilities, so we wind up with a toolbox.