49
ゲームAIプログラミングコンテスト 「SamurAI Coding」ワークショップ 九州大学大学院システム情報科学府 金子晃介 [email protected] @PumpkinKaneko Kosuke Kaneko 2012/10/21

SamurAI Coding Workshop @Fukuoka

Embed Size (px)

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.

Citation preview

Page 1: SamurAI Coding Workshop @Fukuoka

ゲームAIプログラミングコンテスト 「SamurAI Coding」ワークショップ

九州大学大学院システム情報科学府

金子晃介

[email protected]

@PumpkinKaneko

Kosuke Kaneko 2012/10/21

Page 2: SamurAI Coding Workshop @Fukuoka

自己紹介

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

名前: 金子晃介(PumpkinKaneko)

所属: 九州大学大学院システム情報科学府

リサーチャー

エンジニア コーディ ネーター

2

Page 3: SamurAI Coding Workshop @Fukuoka

今日やること: プログラミング

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

プログラミングって何?

コンピューターに指示を与えること

コンピューター上で動くものは、プログラマーが作っています

命令(プログラム)

プログラマー コンピューター

プログラマーが指示した通りに、 コンピューターが動くように、

命令を書いてる 3

Page 4: SamurAI Coding Workshop @Fukuoka

例(ゲームプログラマー)

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

では、敵キャラクターは

だれが操作しているのでしょう?

マリオを動かしているのは、 ゲームをしている人です。

4

Page 5: SamurAI Coding Workshop @Fukuoka

例(ゲームプログラマー)

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

町の人は、だれが操作して、 しゃべらせているのでしょう?

5

Page 6: SamurAI Coding Workshop @Fukuoka

プログラミング

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

コンピューターは自分で考えることができません

プログラマーに指示されたように、キャラクターを動かしているだけです

命令(プログラム)

6

Page 7: SamurAI Coding Workshop @Fukuoka

プログラミング

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

ゲームプログラマー = ゲームの世界の神様的存在

今日は、皆さんに プログラミングをしてもらいます!

7

Page 8: SamurAI Coding Workshop @Fukuoka

今日やること: プログラミング

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

といっても、いきなりプログラミングする難しいので・・・・ 今日はプログラミングコンテストに参加をしながら、プログラムの基礎を学びます

8

Page 9: SamurAI Coding Workshop @Fukuoka

SamurAI Codingとは

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

情報処理学会主催のプログラミングコンテスト

ゲームAI(人工知能)プログラミングコンテストの世界大会

世界中のチームとチームバトル(後でチームを組みます)

複数のキャラクターをプログラムで動かして陣取りをやります 他のチームに負けないようにキャラクターを動かしてください。

9

Page 10: SamurAI Coding Workshop @Fukuoka

今日やることまとめ

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

1. ゲームのルールを知る

2. プログラムの基礎を勉強する

3. 書いたプログラムをコンテストに提出する

プログラミングコンテストの世界大会に参加して ゲームAI(人工知能)のプログラムを書こう!

10

Page 11: SamurAI Coding Workshop @Fukuoka

第一部 ゲームのルールを理解しよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

1. ゲームのルールを知る

2. プログラムの基礎を勉強する

3. 書いたプログラムをコンテストに提出する

11

Page 12: SamurAI Coding Workshop @Fukuoka

ルール概要

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

陣取りゲーム 4チームでバトル 一番多く陣地を取ったチームが勝ち

12

Page 13: SamurAI Coding Workshop @Fukuoka

とりあえず触ってみよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

SamurAI Codingのサイトにログイン

https://samuraicoding.org/

ゲームを触りながら説明をしていきます!

13

Page 14: SamurAI Coding Workshop @Fukuoka

各チーム(4チーム)にサムライと犬がおり、キャラクタを移動して陣地を広げていく陣取りゲーム

図1. ゲームイメージ

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 14

Page 15: SamurAI Coding Workshop @Fukuoka

ゲームはラウンドを繰り返す

1つのラウンドの中では、どのチームのどのキャラクタも1回だけ行動することができる

2つ以上のキャラクタが同じマスに移動しようとすると、どれも元の場所から動けなくなる

ラウンドは、1000~2000の間でランダムに設定される

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 15

Page 16: SamurAI Coding Workshop @Fukuoka

このゲームのフィールドは、六角のマスを長方形に並べて作成されている

図2. フィールド

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 16

Page 17: SamurAI Coding Workshop @Fukuoka

図3. ゲートの例

対応する上と下のゲート、右と左のゲートは空間のねじれによってつながっており、両者間でワープが可能

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 17

Page 18: SamurAI Coding Workshop @Fukuoka

【キャラクタ】

このゲームにはサムライと犬の2種類のキャラクタがある

図4. サムライ 図5. 犬

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 18

Page 19: SamurAI Coding Workshop @Fukuoka

【サムライのアクション】

-隣り合った(あるいはワープで飛べる)空いているマスへ移動してそのマスを占拠する

-または、現在のマスにとどまる

図6. サムライの移動の例

サムライが通ったマスを足跡と呼ぶ。他陣営の護衛された領地の内部でない限り、サムライのチームの領地になり、チームの色がつく (領地の項を参照)

足跡

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 19

Page 20: SamurAI Coding Workshop @Fukuoka

【犬のアクション】

-隣り合った(あるいはワープで飛べる)空いているマスへ移動する

-または、現在のマスにとどまる

図7. 犬の移動

犬が移動したマスは、領地にはならない。足跡も残さない

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 20

Page 21: SamurAI Coding Workshop @Fukuoka

【犬の脅威】

- サムライは、他のチームの犬に隣接したマスには移動できない。犬にはその制限はない

図8. 犬の脅威

赤いサムライは、青の犬を中心とする青い線内には移動できない

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 21

Page 22: SamurAI Coding Workshop @Fukuoka

フリーズ

キャラクタは次の場合フリーズする

サムライが他のチームの犬の脅威にとどまろうとした

他のキャラクタと移動先で衝突した

壁にぶつかった

フリーズしたキャラクターはパス命令を出すまで動けない

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 22

Page 23: SamurAI Coding Workshop @Fukuoka

図11. 取り囲み関連の例

A.取り囲み直前 B.取り囲み状態 C.取り囲み完了

D.護衛がいなくなった E.抵抗活動 F.護衛が現れた

G.辺境での足跡は残る H.侵入者が接近 I.侵入

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 23

Page 24: SamurAI Coding Workshop @Fukuoka

大陸横断

マスの左右もしくは上下をつないだら、その時点で勝ちになる

図では赤のチームが上辺と下辺をつないで大陸横断を完成させた!角のマスは両方の辺の一部とみなす

図12. 大陸横断

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 24

Page 25: SamurAI Coding Workshop @Fukuoka

次の二つの条件のうち、いずれかの条件が発生した場合にゲームは終了し、勝ち負けが決定する

1. あるチームが大陸横断を完成させた!

2. 所定のラウンド数が経過したが、どのチームも大陸横断を完成させなかった

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 25

Page 26: SamurAI Coding Workshop @Fukuoka

大陸横断が完成した場合、

完成したチームが勝者。複数同時に完成した場合は、領地面積の合計の多いほうが上位

他のチームはそれに続くが、順位は領地面積の合計の多いほうが上位

所定のラウンド数が終わった場合、

領地面積の合計の多い順に順位を決める

SamurAI Coding Workshop @Fukuoka Institute of Technology,

Junior College 26

Page 27: SamurAI Coding Workshop @Fukuoka

第二部 プログラムを書こう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

1. ゲームのルールを知る

2. プログラムの基礎を勉強する

3. 書いたプログラムをコンテストに提出する

休憩 27

Page 28: SamurAI Coding Workshop @Fukuoka

プログラミングをしよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

キャラクターを動かそう!

いろんなプログラミング言語

指示できる内容がそれぞれ違う

しかし基本的な命令はみんな同じ

今日はプログラミングの基本的な考え方を学ぶ

C/C++

Java

HTML

PHP

28

Page 29: SamurAI Coding Workshop @Fukuoka

プログラミングをしよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

キャラクターを操作しよう!

命令

Move Pass Wait

命令は、この3つだけ

29

Page 30: SamurAI Coding Workshop @Fukuoka

プログラミングをしよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

move 命令

キャラクターを動かすための命令

move 0, 5

キャラクター番号

方向

30

Page 31: SamurAI Coding Workshop @Fukuoka

プログラミングをしよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

pass 命令

キャラクターのフリーズを解除する命令

pass 0

キャラクター番号

31

Page 32: SamurAI Coding Workshop @Fukuoka

プログラミングをしよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

wait 命令

キャラクターにその場で待機させる命令

wait 0

キャラクター番号

32

Page 33: SamurAI Coding Workshop @Fukuoka

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

プログラミングをしよう!

33

とりあえずキャラクターへの命令を書いてみよう! move 0, 0

move 1, 2

move 2, 4

move 3, 5

※プログラムは

上から順に実行されます!

Page 34: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

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

Page 35: SamurAI Coding Workshop @Fukuoka

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

プログラミングの基礎

35

代入

kotae = 10

keisan = kotae + 2

keisan

kotae

10

2

kotae

10

Page 36: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

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

Page 37: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

teamID = get_hexel_owner ( x, y )

引数 返り値

get_hexel_owner 返り値 引数

𝑦 = 𝑓 𝑥

37

Page 38: SamurAI Coding Workshop @Fukuoka

関数リスト

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

Page 39: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

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

Page 40: SamurAI Coding Workshop @Fukuoka

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()

Page 41: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

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

Page 42: SamurAI Coding Workshop @Fukuoka

プログラミングの基礎

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

Page 43: SamurAI Coding Workshop @Fukuoka

第三部 コンテストに挑戦しよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

1. ゲームのルールを知る

2. プログラムの基礎を勉強する

3. 書いたプログラムをコンテストに提出する

休憩

43

Page 44: SamurAI Coding Workshop @Fukuoka

みんなで賢い動きを考えよう!

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

自由にワークショップ

チームを組んで作戦を考えよう!

まずは、どういう動きをすると強いか考えよう!

最後にチームごとに対戦しよう!

わからないことがあったら聞いてください!

44

Page 45: SamurAI Coding Workshop @Fukuoka

例えば

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

Page 46: SamurAI Coding Workshop @Fukuoka

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

Page 47: SamurAI Coding Workshop @Fukuoka

終わりに

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

コンピュータの世界の神への道の第一歩を踏み出しました

ここからプログラミングの世界に飛び込んでみましょう!

47

Page 48: SamurAI Coding Workshop @Fukuoka

プログラムの学習のために

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College

ウェブサイトで独学

Life is Tech! in 九州

iPhone アプリの開発

来月開催予定

八耐:八時間耐久作品制作会(仮) 月に一度モノづくりをやってます

Global Game Jam Fukuoka 世界最大のハッカソン

@PumpkinKaneko

Kosuke Kaneko

48

Page 49: SamurAI Coding Workshop @Fukuoka

SamurAI Coding Workshop @Fukuoka Institute of Technology, Junior College 49

参加していただいて ありがとうございました!