tic tac toe php,二维数组应用举例:游戏“一担挑”(tic-tac-toe)

本例游戏示范二维数组的用法。二维数组常常用以模拟棋盘博弈。

游戏规则:

(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

#include

//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 ' ';

}

游戏截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值