![見出し画像](https://assets.st-note.com/production/uploads/images/23564671/rectangle_large_type_2_89db954848be0be36fa7e14d801b5777.png?width=1200)
数日後にゲーム作るタニ みっかめ 〜プレイヤー登場〜
さてさて、オセロ制作進めていますが、今バグが大量発生して、どよーんとなっております、ははは。
今日は、プレイヤーに盤面上に『ある程度自由に』オセロを置いてもらえるようにします。入力は、横の座標と縦の座標の入力を受け取ります。
まず、○のターンと●のターンを区別します。これは、ゲームプログラミングあるあるの余りを用いた条件分岐で。
int turn = 0;
int player = 9;
while(true){
if(turn % 2 == 0){
player = 9;
play_turn(player, board);
} else {
player = 1;
play_turn(player, board);
}
turn++;
}
play_turn関数は後ほど。前回の通り、○を1、●を9に対応させたので、turnの偶奇によって、playerの値を変えて、play_turnに渡すことにしました。
void play_turn(int turn, int board[8][8]){
int x, y;
switch(turn){
case 9:
while(true){
printf("Where ●? (横 縦)");
scanf("%d %d", &x, &y);
if(judge_place(x, y, turn, board)){
puts("そこにはおけないよ!");
} else {
break;
}
}
board[y][x] = 9;
break;
case 1:
while(true){
printf("Where ○? (横 縦)");
scanf("%d %d", &x, &y);
if(judge_place(x, y, turn, board)){
puts("そこにはおけないよ!");
} else {
break;
}
}
board[y][x] = 1;
}
}
play_turn関数。返り値なし、引数は整数とint型の2次元リスト。switch文をつかて、○と●のターンを区別しました。ただ、よく考えれば、playerを与えてるので、board[y][x]にplayerを代入すれば、もっと簡潔に書けますね。修正しとこう。
この中に、judge_place関数が使われてます。これは、その場所におけるかどうかを判定する関数です。本来のルールでは、①盤面の中にある。 ②まだおかれていない。③挟めるというのを満たさないとおけませんが、今回は①と②のみ実装。
int judge_place(int x, int y, int turn, int board[8][8]){
if(x < 0 || y < 0 || x > 7 || y > 7){ // 範囲外
return 1;
}
if(board[y][x] != 0){ //置いてある
return 1;
}
return 0;
}
judge_place関数。戻り値はint型。引数は、board上の座標であるint型2つ、playerを表すint型、int型2次元リスト。まだシンプルですね。座標が外側にある場合、すでにおかれている(0じゃない)場合は1を返します。すると、play_turn関数内では、if(この中)に直接この関数を入れていたので、1ならば"そこにはおけないよ!"という文を表示するコードが実行されます。
これで『ある程度自由に』プレイヤーがものを置けるようになりました。これで一応プレイヤーが入る隙が登場しました!
次回は、挟めるところだけ置けるようにします。