本例游戏示范二维数组的用法。二维数组常常用以模拟棋盘博弈。
游戏规则:
(1)轮到计算机下子时,使用get_computer_move()函数扫描棋盘矩阵,寻找未占空格;发现空格后,将其置为"O";所有空格均被占满,则报告平局后退出。
(2)轮到人类选手时,get_player_move()函数要求对弈者输入想要落子的坐标(左上角是(1,1),右下角是(3,3))。
游戏刚开始时,矩阵数组全部被初始化为空格,机器和人类选手每下一步都会使空格变成O或X,然后在屏幕上刷新显示出来。
每下一步,程序都调用check()函数,用以检查是否有一方获胜,check()函数会扫描各行、各列和2条对角线,找到全“O”或全“X”时判定机器或人类胜出。若尚未分出胜负,check()函数返回空格;若机器胜,返回“O”;若人类胜,则返回“X”。
为教学目的,本例中的各个子程序都用不同方法访问数组matrix,以便于加强理解。
#include <stdio.h>
#include <stdlib.h>
//3×3的矩阵,保存游戏棋盘
char matrix[3][3];
char check(void);
void init_matrix(void);
void get_player_move(void);
void get_computer_move(void);
void disp_matrix(void);
main(void)
{
char done;
printf("This is the game of Tic Tac Toe.\n");
printf("You will be playing against the computer.\n");
done=' ';
init_matrix();
do{
disp_matrix();
get_player_move();
done=check();
if(done!=' ')
break;
get_computer_move();
done=check();
}while(done==' ');
if(done=='X')
printf("You won!\n");
else
printf("I won!!!\n");
disp_matrix();
}
//初始化游戏棋盘,将每个格子初始化为空格
void init_matrix(void)
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
matrix[i][j]=' ';
}
//获取人类棋手的走棋,用x、y(横纵坐标)表示在棋盘上的走子
void get_player_move(void)
{
int x,y;
printf("Enter X,Y coordinates for your move: \n");
scanf("%d%d",&x,&y);
x--;
y--;
if(matrix[x][y]!=' '){
printf("Invalid move,try again.\n");
get_player_move();
}
else
matrix[x][y]='X';
}
//获取机器的走棋
void get_computer_move(void)
{
//机器的策略非常简单而“白痴”,它是从头到尾挨个儿找有没有空格,只要找到第一个空格,就停止搜索
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
if(matrix[i][j]==' ')
break;
if(matrix[i][j]==' ')
break;
}
if(i*j==4){
printf("draw \n"); //如果走到了第3行第3列尚未决出胜负,则判定为平局
exit(0);
}
else
matrix[i][j]='O'; //将上面找到的空格标记上代表机器走棋的“O”
}
//显示当前棋盘的最新态势
void disp_matrix(void)
{
int t;
//将人、机双方走棋的态势按照矩阵输出到屏幕
for(t=0;t<3;t++){
printf("%c | %c | %c",matrix[t][0],matrix[t][1],matrix[t][2]);
if(t!=2)
printf("\n---|---|---\n");
}
printf("\n");
}
//检查人机双方是否有一方已经率先走出了连续的行、列,或对角线
//人获胜,返回一个X,机器获胜,返回一个O,尚未决出胜负,返回一个空格
char check(void)
{
int i;
//检查是否连续走出了同一行
for(i=0;i<3;i++){
if(matrix[i][0]==matrix[i][1]&&matrix[i][0]==matrix[i][2])
return matrix[i][0];
}
//检查是否连续走出了同一列
for(i=0;i<3;i++){
if(matrix[0][i]==matrix[1][i] && matrix[0][i]==matrix[2][i])
return matrix[0][i];
}
//检查是否连续走出了左上到右下的对角线
if(matrix[0][0]==matrix[1][1] && matrix[1][1]==matrix[2][2])
return matrix[0][0];
//检查是否连续走出了右上到左下的对角线
if(matrix[0][2]==matrix[1][1] && matrix[1][1]==matrix[2][0])
return matrix[0][2];
//如果上述所有条件都未满足,则尚未有任何一方获胜,则返回一个空格
return ' ';
}
游戏截图: