samurai coding workshop @fukuoka
DESCRIPTION
This slide is for a game AI programming contest 'SamurAI Coding' which is hold by Information Processing Society of Japan. I hold a workshop for the contest to high school students. It maybe useful not only the contest but also a basic programming education.TRANSCRIPT
ゲームAIプログラミングコンテスト 「SamurAI Coding」ワークショップ
九州大学大学院システム情報科学府
金子晃介
@PumpkinKaneko
Kosuke Kaneko 2012/10/21
自己紹介
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
名前: 金子晃介(PumpkinKaneko)
所属: 九州大学大学院システム情報科学府
リサーチャー
エンジニア コーディ ネーター
2
今日やること: プログラミング
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
プログラミングって何?
コンピューターに指示を与えること
コンピューター上で動くものは、プログラマーが作っています
命令(プログラム)
プログラマー コンピューター
プログラマーが指示した通りに、 コンピューターが動くように、
命令を書いてる 3
例(ゲームプログラマー)
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
では、敵キャラクターは
だれが操作しているのでしょう?
マリオを動かしているのは、 ゲームをしている人です。
4
例(ゲームプログラマー)
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
町の人は、だれが操作して、 しゃべらせているのでしょう?
5
プログラミング
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
コンピューターは自分で考えることができません
プログラマーに指示されたように、キャラクターを動かしているだけです
命令(プログラム)
6
プログラミング
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
ゲームプログラマー = ゲームの世界の神様的存在
今日は、皆さんに プログラミングをしてもらいます!
7
今日やること: プログラミング
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
といっても、いきなりプログラミングする難しいので・・・・ 今日はプログラミングコンテストに参加をしながら、プログラムの基礎を学びます
8
SamurAI Codingとは
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
情報処理学会主催のプログラミングコンテスト
ゲームAI(人工知能)プログラミングコンテストの世界大会
世界中のチームとチームバトル(後でチームを組みます)
複数のキャラクターをプログラムで動かして陣取りをやります 他のチームに負けないようにキャラクターを動かしてください。
9
今日やることまとめ
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
1. ゲームのルールを知る
2. プログラムの基礎を勉強する
3. 書いたプログラムをコンテストに提出する
プログラミングコンテストの世界大会に参加して ゲームAI(人工知能)のプログラムを書こう!
10
第一部 ゲームのルールを理解しよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
1. ゲームのルールを知る
2. プログラムの基礎を勉強する
3. 書いたプログラムをコンテストに提出する
11
ルール概要
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
陣取りゲーム 4チームでバトル 一番多く陣地を取ったチームが勝ち
12
とりあえず触ってみよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
SamurAI Codingのサイトにログイン
https://samuraicoding.org/
ゲームを触りながら説明をしていきます!
13
各チーム(4チーム)にサムライと犬がおり、キャラクタを移動して陣地を広げていく陣取りゲーム
図1. ゲームイメージ
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 14
ゲームはラウンドを繰り返す
1つのラウンドの中では、どのチームのどのキャラクタも1回だけ行動することができる
2つ以上のキャラクタが同じマスに移動しようとすると、どれも元の場所から動けなくなる
ラウンドは、1000~2000の間でランダムに設定される
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 15
このゲームのフィールドは、六角のマスを長方形に並べて作成されている
図2. フィールド
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 16
図3. ゲートの例
対応する上と下のゲート、右と左のゲートは空間のねじれによってつながっており、両者間でワープが可能
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 17
【キャラクタ】
このゲームにはサムライと犬の2種類のキャラクタがある
図4. サムライ 図5. 犬
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 18
【サムライのアクション】
-隣り合った(あるいはワープで飛べる)空いているマスへ移動してそのマスを占拠する
-または、現在のマスにとどまる
図6. サムライの移動の例
サムライが通ったマスを足跡と呼ぶ。他陣営の護衛された領地の内部でない限り、サムライのチームの領地になり、チームの色がつく (領地の項を参照)
足跡
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 19
【犬のアクション】
-隣り合った(あるいはワープで飛べる)空いているマスへ移動する
-または、現在のマスにとどまる
図7. 犬の移動
犬が移動したマスは、領地にはならない。足跡も残さない
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 20
【犬の脅威】
- サムライは、他のチームの犬に隣接したマスには移動できない。犬にはその制限はない
図8. 犬の脅威
赤いサムライは、青の犬を中心とする青い線内には移動できない
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 21
フリーズ
キャラクタは次の場合フリーズする
サムライが他のチームの犬の脅威にとどまろうとした
他のキャラクタと移動先で衝突した
壁にぶつかった
フリーズしたキャラクターはパス命令を出すまで動けない
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 22
図11. 取り囲み関連の例
A.取り囲み直前 B.取り囲み状態 C.取り囲み完了
D.護衛がいなくなった E.抵抗活動 F.護衛が現れた
G.辺境での足跡は残る H.侵入者が接近 I.侵入
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 23
大陸横断
マスの左右もしくは上下をつないだら、その時点で勝ちになる
図では赤のチームが上辺と下辺をつないで大陸横断を完成させた!角のマスは両方の辺の一部とみなす
図12. 大陸横断
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 24
次の二つの条件のうち、いずれかの条件が発生した場合にゲームは終了し、勝ち負けが決定する
1. あるチームが大陸横断を完成させた!
2. 所定のラウンド数が経過したが、どのチームも大陸横断を完成させなかった
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 25
大陸横断が完成した場合、
完成したチームが勝者。複数同時に完成した場合は、領地面積の合計の多いほうが上位
他のチームはそれに続くが、順位は領地面積の合計の多いほうが上位
所定のラウンド数が終わった場合、
領地面積の合計の多い順に順位を決める
SamurAI Coding Workshop @Fukuoka Institute of Technology,
Junior College 26
第二部 プログラムを書こう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
1. ゲームのルールを知る
2. プログラムの基礎を勉強する
3. 書いたプログラムをコンテストに提出する
休憩 27
プログラミングをしよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
キャラクターを動かそう!
いろんなプログラミング言語
指示できる内容がそれぞれ違う
しかし基本的な命令はみんな同じ
今日はプログラミングの基本的な考え方を学ぶ
C/C++
Java
HTML
PHP
28
プログラミングをしよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
キャラクターを操作しよう!
命令
Move Pass Wait
命令は、この3つだけ
29
プログラミングをしよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
move 命令
キャラクターを動かすための命令
move 0, 5
キャラクター番号
方向
30
プログラミングをしよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
pass 命令
キャラクターのフリーズを解除する命令
pass 0
キャラクター番号
31
プログラミングをしよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
wait 命令
キャラクターにその場で待機させる命令
wait 0
キャラクター番号
32
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
プログラミングをしよう!
33
とりあえずキャラクターへの命令を書いてみよう! move 0, 0
move 1, 2
move 2, 4
move 3, 5
※プログラムは
上から順に実行されます!
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
演算子
演算子 意味 例
+ 足し算 kotae = 1 + 2
- 引き算 kotae = 3 – 4
* 掛け算 kotae = 5 * 6
/ 割り算(商) kotae = 10 / 8
% 割り算(余り) kotae = 10 % 8
= 代入 kotae = 10
==, != 等しい、等しくない kotae == 10 kotae != 10
<, <=, >, >= 不等号 kotae < 10 kotae >= 10
34
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
プログラミングの基礎
35
代入
kotae = 10
keisan = kotae + 2
keisan
kotae
10
2
kotae
10
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
関数 便利な道具
get_remaining_rounds
get_hexel_owner
get_agent_positions
get_agent_status
get_team_id
get_random_number
get_rounds_to_next_syzygy
get_map_size
get_gates
move 0, get_random_number(4)+1
alert get_agent_positions()
36
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
teamID = get_hexel_owner ( x, y )
引数 返り値
get_hexel_owner 返り値 引数
𝑦 = 𝑓 𝑥
37
関数リスト
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
関数名 使用目的 使用例
get_remaining_rounds 残りのラウンド数を 知りたいときに使う nokori = get_remaining_rounds()
get_hexel_owner マスが誰にどのチームに占領されて
いるかを知りたいときに使う teamID = get_hexel_owner(10, 12)
get_agent_positions キャラクターのポジションを
知りたいときに使う positions = get_agent_positions()
get_agent_status キャラクターがフリーズしてるかを
知りたいときに使う ZeroOrOne = get_agent_status(0, 1)
get_team_id 自分たちのチームの番号を
知りたいときに使う teamID = get_team_id()
get_random_number 0~n までのランダムな番号が
ほしいときに使う random = get_random_number(5)
get_rounds_to_next_syzygy 次の朔望が起こるまでのラウンド数を
知りたいときに使う next = get_rounds_to_next_syzygy()
get_map_size マップのサイズを知りたいときに使う size = get_map_size()
get_gates ゲートの位置を
知りたいときに使う gate_positions = get_gates()
38
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
配列
size = get_map_size()
sizeには、マップの大きさが入ってます
例:xが30, yが40
しかし、返り値は、一つしか値を返せない
なので、2つつながった箱に入れていっぺんに返します
[30, 40]
配列の値を代入するときは、 size[0]として値を取ります
例:x = size[0], y = size[1]
39
size
30 40
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
プログラミングの基礎
40
例 キャラクターの位置情報を取ってくる関数
positionsは3次元配列になってる(箱の中に箱がある)
[
[ [10,2], [5,19], [23,11], [36,8] ],
[ [2,6], [3,4], [15,2], [27,3] ],
[ [33,6], [5,7], [2,7], [34,6] ],
[ [12,6], [24,15], [22,15], [12,24] ],
] 代入するときは、x = positions[0][0][1]
positions = get_agent_positions()
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
条件文
例:フリーズを回避する
team = get_team_id() status = get_agent_status(team, 0) if status == 1 pass 0 endif
41
プログラミングの基礎
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
繰り返し
みんなでランダムに動く
move 0, get_random_number(5) move 1, get_random_number(5) move 2, get_random_number(5) move 3, get_random_number(5)
i = 0 while i < 4 move i, get_random_number(5) i = i +1 endwhile
42
第三部 コンテストに挑戦しよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
1. ゲームのルールを知る
2. プログラムの基礎を勉強する
3. 書いたプログラムをコンテストに提出する
休憩
43
みんなで賢い動きを考えよう!
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
自由にワークショップ
チームを組んで作戦を考えよう!
まずは、どういう動きをすると強いか考えよう!
最後にチームごとに対戦しよう!
わからないことがあったら聞いてください!
44
例えば
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
1ターン目に右
2ターン目に右下
3ターン目に左下
4ターン目に左
5ターン目に左上
6ターン目に右上
こういう一周回るような命令を書くには・・・
round = get_remaining_rounds() if round % 6 == 0 move 0, 0 endif if round % 6 == 1 move 0, 1 endif if round % 6 == 2 move 0, 2 endif if round % 6 == 3 move 0, 3 endif if round % 6 == 4 move 0, 4 endif if round % 6 == 5 move 0, 5 endif
45
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
ぼくのかんがえたさいきょうのえーあい
46
team_id = get_team_id() if team_id == 0 gete_id = 4 horizon = 3 endif if team_id == 1 gete_id = 5 horizon = 0 endif if team_id == 2 gete_id = 6 horizon = 3 endif if team_id == 3 gete_id = 7 horizon = 0 endif gate_positions = get_gates() gy = gate_positions[gete_id][1] agent_positions = get_agent_positions() i = 0 while i < 3 status = get_agent_status(team, i) if status == 1 pass i endif ay = agent_positions[team_id][i][1] if gy < ay if team_id == 0 move i, 5 endif if team_id == 1 move i, 4 endif if team_id == 2 move i, 5 endif if team_id == 3 move i, 4 endif endif if gy > ay if team_id == 0 move i, 1 endif if team_id == 1 move i, 2 endif if team_id == 2 move i, 1 endif if team_id == 3 move i, 2 endif endif if gy == ay move i, horizon endif i = i + 1 endwhile
終わりに
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
コンピュータの世界の神への道の第一歩を踏み出しました
ここからプログラミングの世界に飛び込んでみましょう!
47
プログラムの学習のために
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College
ウェブサイトで独学
Life is Tech! in 九州
iPhone アプリの開発
来月開催予定
八耐:八時間耐久作品制作会(仮) 月に一度モノづくりをやってます
Global Game Jam Fukuoka 世界最大のハッカソン
@PumpkinKaneko
Kosuke Kaneko
48
SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College 49
参加していただいて ありがとうございました!