一人二役でのオセロプログラムは書けたのですが、
相手(ここでは白)に自動でコマを置かせる方法がどうしてもわかりません。
ひとまず配列のどれかを選んでから置けるか置けないかの判断をする流れになっているのですが・・・
以下私の書いたコードです。
終了判定の部分もあやふやですが、まず自動で配列の一つを選んでくれるという機能をつけたいです。どうぞよろしくお願い致します。
#include <stdio.h>
#define NONE 0 /何も置かれていないところ/
#define BLACK 1
#define WHITE 2
#define CLASS 8 /マス目の数/
#define TRUE 1 /置けるところ/
#define FALSE 0 /置けないところ/
void start(); //スタートの状態
void othello_print(); //オセロ盤を出力する
int othello_reverse(int black, int i, int j, int iline, int jline);
int check(int black, int i, int j);//裏返せるかチェック
int put(int black, int i, int j); //置く
char othello[CLASS][CLASS];
int turn; /ターン/
int main()
{
int i, j, black, bl, wh;
black = BLACK;
bl = wh = 0; /●と○の数/
char s[50]; /入力を受け付ける文字数/
start();
othello_print();
printf("先手なら1、後手なら0を入力してください→");
scanf("%s", s);
while (1){ //無条件にループに入る
if (black == BLACK){
printf("%sのターンです 相手の手を入力してください(i j)→", "BLACK");
scanf("%d %d", &i, &j);
printf("私の手は(%d %d)です\n", i, j);
}
if (black == WHITE){
choice(i,j);
printf("%sのターンです COMの手を入力してください(i j)→", "WHITE");
scanf("%d %d", &i, &j);
printf("COMの手は(%d %d)です\n", i, j);
}
if (put(black, i, j)){
black = black == WHITE ? BLACK : WHITE;
othello_print();
}
else{
printf("そこにはおけません\n");
}
}
if (othello[i][j] != NONE && (othello[i][j]==BLACK || othello[i][j]==WHITE)){
while (othello[i][j] != EOF){
if (othello[i][j] == BLACK)
++bl;
if (othello[i][j] == WHITE)
++wh;
}
printf("● %dこ ○%dこ", bl, wh);
if (bl > wh){ printf("●の勝ちです"); } if (bl < wh){ printf("○の勝ちです"); } if (bl == wh){ printf("引き分けです"); }
}
else;
return 0;
}
void start()
{
int i, j;
for (i = 0; i < CLASS; i++){
for (j = 0; j < CLASS; j++){
othello[i][j] = NONE;
}
}
othello[3][3] = BLACK;
othello[4][4] = BLACK;
othello[3][4] = WHITE;
othello[4][3] = WHITE;
turn = 0;
}
void othello_print()
{
int i, j;
printf(" 01234567\n");
for (i = 0; i < CLASS; i++){
printf("%d", i);
for (j = 0; j < CLASS; j++){
switch (othello[i][j]){
case NONE:
printf("*");
break;
case BLACK:
printf("●");
break;
case WHITE:
printf("○");
break;
default:
break;
}
}
printf("\n");
}
}
int put(int black, int i, int j)
{
//置ける場所かチェック
if (i < 0 || i >= CLASS) //オセロ盤の外なら置けない
return FALSE;
if (j < 0 || j >= CLASS)
return FALSE;
if (othello[i][j] != NONE)
return FALSE;
if (check(black, i, j) > 0){
othello[i][j] = black;
turn++;
return TRUE;
}
else
return FALSE;
}
int check(int black, int i, int j)//裏返せるかチェック
{
int count;
count = 0;
count += othello_reverse(black, i - 1, j, -1, 0); //上
count += othello_reverse(black, i + 1, j, 1, 0); //下
count += othello_reverse(black, i, j - 1, 0, -1); //左
count += othello_reverse(black, i, j + 1, 0, 1); //右
count += othello_reverse(black, i - 1, j - 1, -1, -1); //左上
count += othello_reverse(black, i - 1, j + 1, -1, 1); //右上
count += othello_reverse(black, i + 1, j - 1, 1, -1); //左下
count += othello_reverse(black, i + 1, j + 1, 1, 1); //右下
return count;
}
//ひとつ先の座標が裏返せるかどうかを返す
int othello_reverse(int black, int i, int j, int iline, int jline)
{
//置ける場所かチェック
if (i < 0 || i >= CLASS) //オセロ盤の外なら置けない
return FALSE;
if (j < 0 || j >= CLASS)
return FALSE;
if (othello[i][j] == NONE)
return FALSE;
if (othello[i][j] == black) //同じ色のコマがあった
return TRUE;
else{
if (othello_reverse(black, i + iline, j + jline, iline, jline)){
othello[i][j] = black;
return TRUE;
}
else
return FALSE;
}
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。