ゲームのメイン部分を実装していきます
完了したら三目並べで遊べるようになります
ゲームの進行部分の実装を考えよう
今まで実装してきたメソッド群を使って、ゲームの進行部分を実装してみましょう
初期値の定義
plyaer変数, board変数の初期値を定義します
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
ゲームループの実装
loop構文を使いゲームのループを表現します
以前に実装したcontinue?メソッドを使います
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
break if ! continue?(player , board)
end
入力部分の実装
プレイヤーがコマを配置できるようにします
以前に実装したgets_positionメソッドを使います
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
row , col = gets_piece_location()
break if ! continue?(player , board)
end
ゲーム板の更新
入力できるようになったのでゲーム板にコマを置けるようにします
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
row , col = gets_piece_location()
place_piece(board , player , row , col)
break if ! continue?(player , board)
end
プレイヤーの入れ替え
プレイヤーの入れ替え部分を実装します。
相手のプレイヤーを取得するメソッドがあれば便利そうです。
コピー # 説明: 対戦中の相手プレイヤーを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
# 戻り値: 1の時 => 2
# 2の時 => 1
def get_opponent_player player
return player == 1 ? 2 : 1
end
このget_opponent_playerメソッドを適用します。
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
row , col = gets_piece_location()
place_piece(board , player , row , col)
break if ! continue?(player , board)
player = get_opponent_player(player)
end
ゲーム画面の出力
今のままでは、何が起こっているのか分からないのでゲーム画面を出力しましょう。
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
row , col = gets_piece_location()
place_piece(board , player , row , col)
print_board(board)
break if ! continue?(player , board)
player = get_opponent_player(player)
end
試合結果の出力
試合結果の出力メソッドを実装しましょう。
コピー # 説明: ゲームの結果をコンソールに出力する
# 引数: board: ゲーム板, 3 x 3の二次元配列
# 戻り値: なし
def print_result board
if win?( 1 , board)
puts "Player1が勝利しました!"
elsif win?( 2 , board)
puts "Player2が勝利しました!"
else
puts "引き分けです!"
end
end
上記で実装したメソッドをメイン部分に適用させて完了です。
コピー player = 1
board = [
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ] ,
[ 0 , 0 , 0 ]
]
loop do
row , col = gets_piece_location()
place_piece(board , player , row , col)
print_board(board)
break if over?(player , board)
player = get_opponent_player(player)
end
print_result(board)
基本ロジックの実装はこれで完了です!
以下にプログラムを動作させた例をのせておきます。
コピー 行を入力してください:0
列を入力してください:0
o N N
N N N
N N N
行を入力してください:1
列を入力してください:1
o N N
N x N
N N N
行を入力してください:0
列を入力してください:1
o o N
N x N
N N N
行を入力してください:1
列を入力してください:0
o o N
x x N
N N N
行を入力してください:0
列を入力してください:2
o o o
x x N
N N N
Player1が勝利しました!
この章で実装した内容のフルセットは以下のリポジトリに乗せておきました。
なにかトラブルが発生した場合は、参照してみてください。
このプログラムの問題点
お気づきの方もいると思いますが、このプログラムは入力部分に欠点があり不完全です。
相手が置いた場所にも上書きして置けるし、ゲーム板の外にも置くことができます(エラーになりますが)。
ここら辺の問題を四章のリファクタリングで修正していきたいと思います。