通过键盘定位实现井字棋(C语言)

  大家好,想必大家都知道井字棋吧,通常井字棋的定位是靠坐标来实现的,比如说你输入一个坐标(两个数字)比如1,3,那么在井字棋的最左下就填充了一个棋子。井字棋所需要的棋盘并不大,只需要9个格子就可以完成,所以说通过通过坐标定位并不复杂,也可以快速的进行定位。但有没有一种更好,更简洁的定位方式呢?

  下面我就来介绍一个更方便的定位方法——通过键盘定位。

  我们观察我们的键盘就以QWE,ASD,ZXC这九个按键为例,你可以发现他们恰好形成了一个九宫格,和我们的井字棋刚好符合。

e7172812e3234407a3082805d19cb09e.png

 

  下面我们通过代码来实现。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*我们需要的头文件*/

  首先我们要定义一个全局变量将我们的按键表示成棋盘中的位置

char key[3][3]={"qwe","asd","zxc"};

然后,我们需要设置一个菜单来美化和提示我们的井字棋

void menu()
{
    printf("\t****************\n");
    printf("\t*****1.GAME*****\n");
    printf("\t*****2.BACK*****\n");
    printf("\t****************\n");
    putchar('\n');
    printf("通过九宫格控制棋子\n");
    printf("\tq\tw\te\n\n\n\ta\ts\td\n\n\n\tz\tx\tc\n");
}

a371b67495a1418cac39d58c9af4a5f9.png

 

接下来我们要打印和初始化我们的棋盘,这里我将其分为两个函数

void print_board(char board[3][3]) //打印棋盘和棋子
{
    printf("\n");
    for(int i=0;i<3;i++)
    {
        printf("\t%c | %c | %c\n",board[i][0],board[i][1],board[i][2]);
        if(i<2)
        {
            printf("\t--|---|--\n");
        }
    }
}

void put_firstboard(char board[3][3]) //初始化棋盘
{
    int i,s;
    for(i=0;i<3;i++)
    {
        for(s=0;s<3;s++)
        {
            board[i][s]=' '; //先将每个棋子赋值为空格
        }
    }
}

  接下来我们来实现玩家的操作

void player1_move(char board[3][3])//玩家1是先手且他对应的棋子为符号‘o’
{
    int i,s;
    int back=1;
    char player1move;
    while(back)
    {
    printf("请玩家1操作\n");
    player1move=getchar();
    for(i=0;i<3;i++)
    {
        for(s=0;s<3;s++)
        {
            if(player1move==key[i][s])//判断是否是指定的按键
            {
                if(board[i][s]==' ')//如果棋盘中没棋子就填入棋子
                {
                    board[i][s]='o';
                    back=0;
               break;
                }
                if(board[i][s]!=' ')//判断棋盘中是否有棋子,有棋子就报错
                {
                    printf("已经填入棋子!!");
                    break;
                }
            }
        }
    }
    }
}

void player2_move(char board[3][3])//玩家2后手且他对应的棋子为字符‘x’
{
    int i,s;
    int back=1;
    char player2move;
    while(back)
    {
    printf("请玩家2操作\n");
    player2move=getchar();
    for(i=0;i<3;i++)
    {
        for(s=0;s<3;s++)
        {
            if(player2move==key[i][s])
            {
                if(board[i][s]==' ')
                {
                    board[i][s]='x';
                    back=0;
               break;
                }
                if(board[i][s]!=' ')
                {
                    printf("已经填入棋子!!");
                    break;
                }
            }
            }
        }
    }
}

  这里我们可以用随机函数来实现简单的电脑对战

void playercomputer_move(char board[3][3])
{
    srand(time(0));
    int x=rand()%3;
    int y=rand()%3;
    printf("请电脑玩家操作\n");
    while(1)
  { 
       if(board[x][y]==' ')//持续判断键盘是否被填入
    {
      board[x][y]='x';
      break;
    }
     x=rand()%3;//如果棋盘是被填入的,那么再重新定位键盘
     y=rand()%3;
    }
}

  下面,我们需要建立一个函数来实现判断游戏是否结束

char judgement(char board[3][3])//这里需要返回一个值来判断胜利者
{

        if(board[0][0]==board[1][1]&&board[2][2]==board[1][1]&&board[1][1]!=' ')
        {
            return board[1][1];
        }

        if(board[0][2]==board[1][1]&&board[2][0]==board[1][1]&&board[1][1]!=' ')
        {
            return board[1][1];
        }

        for(int i=0;i<3;i++)
        {
         if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
            {
                return board[i][1];
            }
        }

        for(int i=0;i<3;i++)
        {
        if(board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[2][i]!=' ')
            {
                return board[1][i];
            }
        }
        return 'p';
}

  根据上面创建的函数,接着我们要实现游戏的运行,这里我用了两个函数来实现运行

void game_person_run()
{
    int time=9;//用来判断棋盘是否占满
    char board[3][3];
    put_firstboard(board);
    print_board(board);//输入,初始化棋盘
    while(time)
    {
    player1_move(board);
    print_board(board);
    getchar();
    time--;
    if(judgement(board)!='p')//判断是否结束
        break;
        if(time==0)
            break;
    player2_move(board);
    print_board(board);
    getchar();
    time--;
    if(judgement(board)!='p')
        break;
    }
    judgement(board);
    if(time==0&&judgement(board)=='p')//判断是否平局
    printf("平局\n");
    else if(time!=0)//判断谁是胜利者
    {
        if(judgement(board)=='o')
            printf("恭喜玩家1获胜!");
        else if(judgement(board)=='x')
            printf("恭喜玩家2获胜!");
    }
    if(time==0&&judgement(board)!='p')//判断棋子占满后谁是胜利者
    {
        if(judgement(board)=='o')
            printf("恭喜玩家1获胜!");
        else if(judgement(board)=='x')
            printf("恭喜玩家2获胜!");
    }
}

void game_computer_run()//与双人对战相似
{
    int time=9;
    char board[3][3];
    put_firstboard(board);
    print_board(board);
    while(time)
    {
    player1_move(board);
    print_board(board);
    getchar();
    time--;
    if(judgement(board)!='p')
        break;
    if(time==0)
        break;
    playercomputer_move(board);
    print_board(board);
    time--;
    if(judgement(board)!='p')
        break;
    }
    judgement(board);
    if(time==0&&judgement(board)=='p')
    printf("平局\n");
    else if(time!=0)
    {
        if(judgement(board)=='o')
            printf("恭喜玩家获胜!");
        else if(judgement(board)=='x')
            printf("恭喜电脑获胜!");
    }
    if(time==0&&judgement(board)!='p')
    {
        if(judgement(board)=='o')
            printf("恭喜玩家获胜!");
        else if(judgement(board)=='x')
            printf("恭喜电脑获胜!");
    }
}

   最后就是主函数了,上面我们已经将各种功能通过函数代替,接下来我们只需要包装一下就可以实现通过按键定位实现井字棋了。

int main()
{
    int mode;
    int back=1;
    menu();
    putchar('\n');
    printf("请选择您所需要的模式\n\t1.preson_game\n\t2.computer_game\n\t3.back\n");
    while(back)
    {
    scanf("%d",&mode);
    switch(mode)
    {
        case 1:game_person_run();break;
        case 2:game_computer_run();break;
        case 3:back=0;break;
        default:printf("选择模式错误!!");
    }
    }
}

  好了,我们实验一下我们的小游戏

 

e1d82e9409664f75bd2c20863d1419ec.png

上面就完成了

c语言小白一枚,代码比较简单,不喜勿喷,如果代码有不对的地方欢迎大家能指出。

感谢大家的观看,希望大家能多多点赞支持一下吧。

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

润润润润润润_r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值