二维数组应用举例:游戏“一担挑”(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 <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 ' ';
}

游戏截图:




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值