見出し画像

数日後にゲーム作るタニ みっかめ 〜プレイヤー登場〜

さてさて、オセロ制作進めていますが、今バグが大量発生して、どよーんとなっております、ははは。

今日は、プレイヤーに盤面上に『ある程度自由に』オセロを置いてもらえるようにします。入力は、横の座標と縦の座標の入力を受け取ります。

まず、○のターンと●のターンを区別します。これは、ゲームプログラミングあるあるの余りを用いた条件分岐で。

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ならば"そこにはおけないよ!"という文を表示するコードが実行されます。

これで『ある程度自由に』プレイヤーがものを置けるようになりました。これで一応プレイヤーが入る隙が登場しました!

次回は、挟めるところだけ置けるようにします。

この記事が気に入ったらサポートをしてみませんか?