読者です 読者をやめる 読者になる 読者になる

i remember nothing

文章の練習も兼ねています

プログラミングを教えながらイカのゲームを作った

この記事は 学生エンジニア Advent Calendar 2015 - Adventar 24日目の記事です。

友人がとあるイカのゲームを欲しがっていたので、人に教えつつ一緒に(シミュレータを)作る事にした。

Processing

今回は、Unityなどのゲームフレームワークでなく敢えてProcessingを使う事にした。 Processing は Java のsubset(?)で構文をほぼそのまま用いることができる。

理由

  • ゲームではなくシミュレータを作るから
  • 人にものを教える際に、重いIDEを使いたくなかった
  • わたし自身のフレームワークの学習のため (Unity, cocos-2dx 等は普段からやっているので)

環境構築

プログラミングをあまりやらない人にとって、最初につまづきがちなのは環境の構築です。 うまく構築できたとしても、キュートなやりかたを知らないと非効率な作業の繰り返しになってしまいます。 ここで経験している人が助けを出せると非本質的なところで消耗することが減ります。

  • Processing 3をDL
    付属のエディタが補完まわりだるいので、Atomでprocessing-javaを実行できるようにする。
  • ProcessingのToolsメニューからInstall Command Line Toolsを選ぶ。
  • Atomprocessingprocessing-language を入れる。
    これでatomctrl-alt-bでprocessingが実行できる。あとprocessing-lintなんかも入れるとハッピー

ちなみにわたしはシェルから実行したいのでMakefileを作った。

SHELL=/bin/sh

ifndef SKETCH_DIRECTORY
SKETCH_DIRECTORY = ${CURDIR}
endif

ifndef OUTPUT_FOLDERNAME
OUTPUT_FOLDERNAME = output
endif

ifndef OUTPUT_DIRECTORY
OUTPUT_DIRECTORY = $(SKETCH_DIRECTORY)/$(OUTPUT_FOLDERNAME)
endif

define CLEAN_RULE
   @echo "rm -rf '${1}'"
   $(shell rm -rf ${1})
endef

define BUILD_RULE
   processing-java --sketch=$(SKETCH_DIRECTORY) --output=$(OUTPUT_DIRECTORY) --${1} --force
endef

.PHONY: run
run:
  $(call BUILD_RULE,run)

.PHONY: clean
clean:
  $(call CLEAN_RULE, $(OUTPUT_DIRECTORY))

シミュレーション内容

  • マウスで壁を描くことができるステージが用意されている。
  • イカがランダムウォーク + 少しの知性をもってステージ上を動く。壁は通り抜けられない。
  • イカが2~8人でチームを組み、2~4チームで対戦する。
  • 各イカは初めに体力を3もっており、これが0になると死亡しリスポン地点に戻される。
  • 最終的に自分のインクで塗られた範囲の多いチームが勝ち。
  • 各チームはそれぞれ異なるインク色があり、自分のインクの中では早く動ける。
  • イカはブキというものをもっていて、これでステージを塗る。
  • 各イカはそれぞれランダムに異なるブキを与えられる。
  • ブキはシューター、チャージ、コロコロに大別され、ブキクラスはそれぞれ射程、射程幅、移動速度、射撃時間、射撃間隔のパラメータをもっていて、例えばチャージは射程は長いが射撃間隔は長く、移動速度が遅い。コロコロが射程は短いが射程幅が広く、射撃時間が長いなどの特性を持っている。

知性と性格

各イカは生成時にランダムで知性が与えられるか、与えられず無知性になる。 無知性なイカは完全に速度ランダムウォークで動く。 イカに与えられた知性には2種類あり、攻撃的か保守的かである。 攻撃的なイカは敵イカの方を向く傾向があり保守的なイカは味方とつるむ。

できたもの


イカシミュレータ0.0.1

所感

  • デス数が多いイカはキル数が多くてもゲームに貢献していないなど、本物の某ゲーと似た傾向が表れている部分もあり面白かった。
  • 自分がプレイしているわけではないのにぼーっと見てしまう謎の面白さがあった。
  • イカにもう少し知性を与えたり、インクを踏んで死ぬのではなく打たれて死ぬ判定にしてもいいかもしれないが、今回はこれで上出来だと思う。

プログラミングを教えてみて

  • 教えられる側は、プログラミングが本業でなく php、jsを少し書いた経験はあるがオブジェクト指向言語の経験はない。
  • そういう背景を踏まえて、まずクラス設計を例を出しながら一緒に考えつつ、それをコードに起こす作業をした。
  • オブジェクト指向言語を(厳密にでなければ)教えるのにこのような形のシミュレータを作るのは比較的いい手段だと思った。この場合だとプレイヤークラス、ブキクラスなどの説明・イメージが比較的しやすくわかりやすかったと思う。
  • 一度コードを書いているところを説明をしながら見せると、理解してもらいやすい。プログラムをどのように書いているのか、過程を具体的に見せることが理解の深化につながると思った。
  • わたしは3割くらいしかコード書いてないけど、わからないところや非効率に書いている部分を一度指摘して例を見せながら書くと、他の部分も応用して自分で書けるようになっていて、良さがあった
  • そのような点から、メンターつけてペアプロという形は学習がしやすいのではと思った。

ソースコード

まだ公開していません。processing.js を利用してwebにjsベースで載せられる段階になったら載せます。