三子棋の分析と実現——C言語
三子棋は1种の経典の小さいゲームとして、初めてC言语を学ぶ私达に対してもし熟练してそのゲームの机能を理解して実现することができるならば、后で更に系統的なC言语の学习に対してとても良い助けがあります.私がプログラミングしたときの悟りとコードを共有します
まず、三子棋のルールを紹介します.自分の碁を一本の線(行、列、斜線)に結ぶだけで、勝つために図のようになります.
まず図と遊び方によって大体考えがあります.
1.碁盤は3行3列の2次元配列と見なすことができ、各行の各列を線で区切って2を区別することができる.コンピューター将棋とプレイヤー将棋(コンピューター先下とプレイヤー先下)に分けられる.判定勝ち(プレイヤー勝ち、コンピューター勝ち、引き分け)
大まかな考え方は上の分析で、次はコードを書き始めます.
tsetを作成します.c,game.cとhead.h 3つのファイル
1.test.cで主関数を記述し、ゲームメニューを書く
ここで私はコンピュータの先とプレイヤーの先に分けて、コードは以下の通りです.
2.次から次へとgame.cで必要な機能を実現しgame関数で呼び出す
先にディスクを印刷し、ディスクをスペースに初期化します.コードは以下の通りです.
効果は図のようだ
3.プレイヤー落子のコード作成
プレイヤー数は2次元配列の座標を入力し、この場合、プレイヤーの入力座標が合理的かどうか、およびこの座標に駒があるかどうかを判断する必要があります.コードは以下の通りです.
4.パソコンで遊ぶ
ここで実現したのは,コンピュータがスペースの配列にランダムに落子することである.コードは以下の通りです.
5.最後は勝負を判断するだけ
まずプレイヤーやパソコンが勝つ状況を議論します.コードは以下の通りです.
これは引き分けを考慮した場合,引き分けは碁盤がいっぱいで負けていないため,配列全体(碁盤)を遍歴してスペースがなければ引き分けとなる.コードは以下の通りです.
初歩的なテスト結果は以下の通りです.
図の中で、コンピュータが勝つ機会があるのにランダムにやっていることがわかります.このようなゲームは挑戦していません.そのため、コンピューターのサブコードを修正し、インテリジェント化しなければならない.コンピュータが落子したときに、同業者、同列または斜線に同じ駒がある場合、コンピュータが落子を1本の線にならないスペースに優先し、簡単なインテリジェント化を実現すると判断できます.
コードは以下の通りです.
効果は図のようです;
すべての結果を検出
コンピュータはプレーヤーに勝って引き分けます
すべてのコード
tese.c
game.c
head.h
まず、三子棋のルールを紹介します.自分の碁を一本の線(行、列、斜線)に結ぶだけで、勝つために図のようになります.
まず図と遊び方によって大体考えがあります.
1.碁盤は3行3列の2次元配列と見なすことができ、各行の各列を線で区切って2を区別することができる.コンピューター将棋とプレイヤー将棋(コンピューター先下とプレイヤー先下)に分けられる.判定勝ち(プレイヤー勝ち、コンピューター勝ち、引き分け)
大まかな考え方は上の分析で、次はコードを書き始めます.
tsetを作成します.c,game.cとhead.h 3つのファイル
1.test.cで主関数を記述し、ゲームメニューを書く
ここで私はコンピュータの先とプレイヤーの先に分けて、コードは以下の通りです.
void menu()
{
printf("***************************************
");
printf("* 1.play 0.exit *
");
printf("***************************************
");
}
void first_move()
{
printf("***************************************
");
printf("* 1.computer first 2.player first *
");
printf("***************************************
");
}
void game()
{
return 0;
}
int main()
{
int choice;
srand((unsigned int)time(NULL));//
do
{
menu();
printf(" :");
scanf("%d", &choice);
switch (choice)
{
case 1:
game();
break;
case 0:
break;
default:
printf(" .
");
break;
}
} while (choice);
return 0;
}
2.次から次へとgame.cで必要な機能を実現しgame関数で呼び出す
先にディスクを印刷し、ディスクをスペースに初期化します.コードは以下の通りです.
void show_board(char board[ROWS][COLS], int rows, int cols)//
{
int i;
for (int i = 0; i < rows; i++)
{
printf(" %c | %c | %c
", board[i][0], board[i][1], board[i][2]);
if (i != rows - 1)
printf(" ---|---|---
");
}
}
void init_board(char board[ROWS][COLS], int rows, int cols)//
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ' ';
}
}
}
効果は図のようだ
3.プレイヤー落子のコード作成
プレイヤー数は2次元配列の座標を入力し、この場合、プレイヤーの入力座標が合理的かどうか、およびこの座標に駒があるかどうかを判断する必要があります.コードは以下の通りです.
void player_move(char board[ROWS][COLS], int rows, int cols)//
{
int x, y;
printf(" :
");
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= rows && y >= 1 && y <= cols)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else printf(" ! 。
");
}
else printf(" ! .
");
}
}
4.パソコンで遊ぶ
ここで実現したのは,コンピュータがスペースの配列にランダムに落子することである.コードは以下の通りです.
void computer_move(char board[ROWS][COLS], int rows, int cols)//
{
int x, y;
printf(" :
");
while (1)
{
x = rand() % rows;
y = rand() % cols;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
5.最後は勝負を判断するだけ
まずプレイヤーやパソコンが勝つ状況を議論します.コードは以下の通りです.
char check_win(char board[ROWS][COLS], int rows, int cols)//
{
int i;
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
for (i = 0; i < cols; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
else if (is_full(board, rows, cols))
return 'q';
return 0;
}
これは引き分けを考慮した場合,引き分けは碁盤がいっぱいで負けていないため,配列全体(碁盤)を遍歴してスペースがなければ引き分けとなる.コードは以下の通りです.
static int is_full(char board[ROWS][COLS], int rows, int cols)//
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
初歩的なテスト結果は以下の通りです.
図の中で、コンピュータが勝つ機会があるのにランダムにやっていることがわかります.このようなゲームは挑戦していません.そのため、コンピューターのサブコードを修正し、インテリジェント化しなければならない.コンピュータが落子したときに、同業者、同列または斜線に同じ駒がある場合、コンピュータが落子を1本の線にならないスペースに優先し、簡単なインテリジェント化を実現すると判断できます.
コードは以下の通りです.
void computer_move(char board[ROWS][COLS], int rows, int cols)//
{
int x, y, i;
printf(" :
");
while (1)
{
x = rand() % rows;
y = rand() % cols;
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ')
{
board[i][2] = '#';
goto flag1;
}
else if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ')
{
board[i][0] = '#';
goto flag1;
}
else if (board[i][0] == board[i][2] && board[i][2] == '#' && board[i][1] == ' ')
{
board[i][1] = '#';
goto flag1;
}
else if (board[0][i] == board[1][i] && board[0][i] == '#' && board[2][i] == ' ')
{
board[2][i] = '#';
goto flag1;
}
else if (board[1][i] == board[2][i] && board[1][i] == '#' && board[0][i] == ' ')
{
board[0][i] = '#';
goto flag1;
}
else if (board[0][i] == board[2][i] && board[2][i] == '#' && board[1][i] == ' ')
{
board[1][i] = '#';
goto flag1;
}
else if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ')
{
board[2][2] = '#';
goto flag1;
}
else if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ')
{
board[0][0] = '#';
goto flag1;
}
else if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
else if (board[0][2] == board[1][1] && board[1][1] == '#' && board[2][0] == ' ')
{
board[2][0] = '#';
goto flag1;
}
else if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ')
{
board[0][2] = '#';
goto flag1;
}
else if (board[2][0] == board[0][2] && board[2][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
}
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ')
{
board[i][2] = '#';
goto flag1;
}
else if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ')
{
board[i][0] = '#';
goto flag1;
}
else if (board[i][0] == board[i][2] && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
goto flag1;
}
else if (board[0][i] == board[1][i] && board[0][i] == '*' && board[2][i] == ' ')
{
board[2][i] = '#';
goto flag1;
}
else if (board[1][i] == board[2][i] && board[1][i] == '*' && board[0][i] == ' ')
{
board[0][i] = '#';
goto flag1;
}
else if (board[0][i] == board[2][i] && board[2][i] == '*' && board[1][i] == ' ')
{
board[1][i] = '#';
goto flag1;
}
else if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ')
{
board[2][2] = '#';
goto flag1;
}
else if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ')
{
board[0][0] = '#';
goto flag1;
}
else if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
else if (board[0][2] == board[1][1] && board[1][1] == '*' && board[2][0] == ' ')
{
board[2][0] = '#';
goto flag1;
}
else if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ')
{
board[0][2] = '#';
goto flag1;
}
else if (board[2][0] == board[0][2] && board[2][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
}
if (board[x][y] == ' ')
{
board[x][y] = '#';
goto flag1;
}
}
flag1:;
}
効果は図のようです;
すべての結果を検出
コンピュータはプレーヤーに勝って引き分けます
すべてのコード
tese.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"head.h"
void menu()
{
printf("***************************************
");
printf("* 1.play 0.exit *
");
printf("***************************************
");
}
void first_move()
{
printf("***************************************
");
printf("* 1.computer first 2.player first *
");
printf("***************************************
");
}
void game()
{
int choice, win;
char board[ROWS][COLS];
init_board(board, ROWS, COLS);
first_move();
flag:
printf(" ");
scanf("%d", &choice);
switch (choice)
{
case 1: //
do
{
computer_move(board, ROWS, COLS); //
show_board(board, ROWS, COLS); //
win = check_win(board, ROWS, COLS);
if (win != 0) //
break;
player_move(board, ROWS, COLS); //
show_board(board, ROWS, COLS); //
win = check_win(board, ROWS, COLS);
} while (win == 0);
if (win == '#')
printf(" , !
");
if (win == '*')
printf(" , !
");
if (win == 'q')
printf("
");
break;
case 2: //
show_board(board, ROWS, COLS);
do
{
player_move(board, ROWS, COLS);
show_board(board, ROWS, COLS);
win = check_win(board, ROWS, COLS);
if (win != 0)
break;
computer_move(board, ROWS, COLS);
show_board(board, ROWS, COLS);
win = check_win(board, ROWS, COLS);
} while (win == 0);
if (win == '#')
printf(" , !
");
if (win == '*')
printf(" , !
");
if (win == 'q')
printf("
");
break;
default:
printf(" ,
");
goto flag;
}
}
int main()
{
int choice;
srand((unsigned int)time(NULL));//
do
{
menu();
printf(" :");
scanf("%d", &choice);
switch (choice)
{
case 1:
game();
break;
case 0:
break;
default:
printf(" .
");
break;
}
} while (choice);
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"head.h"
void show_board(char board[ROWS][COLS], int rows, int cols)//
{
int i;
for (int i = 0; i < rows; i++)
{
printf(" %c | %c | %c
", board[i][0], board[i][1], board[i][2]);
if (i != rows - 1)
printf(" ---|---|---
");
}
}
void init_board(char board[ROWS][COLS], int rows, int cols)//
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = ' ';
}
}
}
//void computer_move(char board[ROWS][COLS], int rows, int cols)//
//{
//
// int x, y;
// printf(" :
");
// while (1)
// {
// x = rand() % rows;
// y = rand() % cols;
// if (board[x][y] == ' ')
// {
// board[x][y] = '#';
// break;
// }
// }
//}
void computer_move(char board[ROWS][COLS], int rows, int cols)//
{
int x, y, i;
printf(" :
");
while (1)
{
x = rand() % rows;
y = rand() % cols;
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '#' && board[i][2] == ' ')
{
board[i][2] = '#';
goto flag1;
}
else if (board[i][1] == board[i][2] && board[i][1] == '#' && board[i][0] == ' ')
{
board[i][0] = '#';
goto flag1;
}
else if (board[i][0] == board[i][2] && board[i][2] == '#' && board[i][1] == ' ')
{
board[i][1] = '#';
goto flag1;
}
else if (board[0][i] == board[1][i] && board[0][i] == '#' && board[2][i] == ' ')
{
board[2][i] = '#';
goto flag1;
}
else if (board[1][i] == board[2][i] && board[1][i] == '#' && board[0][i] == ' ')
{
board[0][i] = '#';
goto flag1;
}
else if (board[0][i] == board[2][i] && board[2][i] == '#' && board[1][i] == ' ')
{
board[1][i] = '#';
goto flag1;
}
else if (board[0][0] == board[1][1] && board[0][0] == '#' && board[2][2] == ' ')
{
board[2][2] = '#';
goto flag1;
}
else if (board[1][1] == board[2][2] && board[1][1] == '#' && board[0][0] == ' ')
{
board[0][0] = '#';
goto flag1;
}
else if (board[0][0] == board[2][2] && board[0][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
else if (board[0][2] == board[1][1] && board[1][1] == '#' && board[2][0] == ' ')
{
board[2][0] = '#';
goto flag1;
}
else if (board[1][1] == board[2][0] && board[1][1] == '#' && board[0][2] == ' ')
{
board[0][2] = '#';
goto flag1;
}
else if (board[2][0] == board[0][2] && board[2][0] == '#' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
}
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == '*' && board[i][2] == ' ')
{
board[i][2] = '#';
goto flag1;
}
else if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ')
{
board[i][0] = '#';
goto flag1;
}
else if (board[i][0] == board[i][2] && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
goto flag1;
}
else if (board[0][i] == board[1][i] && board[0][i] == '*' && board[2][i] == ' ')
{
board[2][i] = '#';
goto flag1;
}
else if (board[1][i] == board[2][i] && board[1][i] == '*' && board[0][i] == ' ')
{
board[0][i] = '#';
goto flag1;
}
else if (board[0][i] == board[2][i] && board[2][i] == '*' && board[1][i] == ' ')
{
board[1][i] = '#';
goto flag1;
}
else if (board[0][0] == board[1][1] && board[0][0] == '*' && board[2][2] == ' ')
{
board[2][2] = '#';
goto flag1;
}
else if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ')
{
board[0][0] = '#';
goto flag1;
}
else if (board[0][0] == board[2][2] && board[0][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
else if (board[0][2] == board[1][1] && board[1][1] == '*' && board[2][0] == ' ')
{
board[2][0] = '#';
goto flag1;
}
else if (board[1][1] == board[2][0] && board[1][1] == '*' && board[0][2] == ' ')
{
board[0][2] = '#';
goto flag1;
}
else if (board[2][0] == board[0][2] && board[2][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
goto flag1;
}
}
if (board[x][y] == ' ')
{
board[x][y] = '#';
goto flag1;
}
}
flag1:;
}
void player_move(char board[ROWS][COLS], int rows, int cols)//
{
int x, y;
printf(" :
");
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= rows && y >= 1 && y <= cols)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else printf(" ! 。
");
}
else printf(" ! .
");
}
}
static int is_full(char board[ROWS][COLS], int rows, int cols)//
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
char check_win(char board[ROWS][COLS], int rows, int cols)//
{
int i;
for (i = 0; i < rows; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
for (i = 0; i < cols; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[1][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
else if (is_full(board, rows, cols))
return 'q';
return 0;
}
head.h
#include
#include
#include
#define ROWS 3
#define COLS 3
void show_board(char board[ROWS][COLS], int rows, int cols);//
void init_board(char board[ROWS][COLS], int rows, int cols);//
void computer_move(char board[ROWS][COLS], int rows, int cols);//
void player_move(char board[ROWS][COLS], int rows, int cols);//
char check_win(char board[ROWS][COLS], int rows, int cols);//