三子棋游戏的实现

三子棋游戏:

首先先看看源码,下面是关于整个游戏的一些讲解

  1. 先是主函数

 

首先建立好一个.c文件用来放主函数,这里的while里面放入input,选择正好设计成1/0当0的时候while正好结束,1的时候可以持续循环;

利用dowhile写一个界面函数

#include<stdio.h>

void meau()

{

    printf("*****************************\n");

    printf("**********  1.play **********\n");

    printf("**********  0.exit **********\n");

    printf("*****************************\n");



}

void test()

{

    int input = 0;

    do

    {

         printf("请选择;>");

         scanf("%d", &input);

         meau();

         switch (input)

         {

         case 1:

             printf("三子棋\n");

             break;

         case 0:

             printf("结束游戏\n");

             break;

         defult:

             printf("输入错了请重新输入\n");

         }

    } while (input);

}

int main()

{

    test();

    return 0;

}

由于函数太多,我们分模块来写,game.h的部分

#include<stdio.h>

#include<stdlib.h>

#include<time.h>



#define Row 3

#define Col 3

//初始化棋盘

void initboard(char board[Row][Col], int row, int col);

//打印棋盘

void displayboard(char board[Row][Col], int row, int col);

//玩家下棋

void player_move(char board[Row][Col], int row,int col);

//电脑下棋

void computer_move(char board[Row][Col], int row, int col);

//判断输赢的函数

char  is_win(char board[Row][Col],int row, int col);

下面是game.c函数的实现

#include"game.h"

void initboard(char board[Row][Col], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

         int j = 0;

         for (j = 0; j < col; j++)

         {

             board[i][j] = ' ';

         }

    }

}

//void displayboard(char board[Row][Col], int row, int col)

//{

//  int i = 0;

//  for (i = 0; i < row; i++)

//  {

//       int j = 0;

//       for (j = 0; j < col; j++)

//       {

//           printf("%c", board[i][j]);//这是打印一行

//       }

//       printf("\n");

//  }

//}







//void displayboard(char board[Row][Col], int row, int col)

//{

//  int i = 0;

//  for (i = 0; i < row; i++)

//  {

//       //打印数据

//       printf(" %c | %c | %c\n",board[i][0],board[i][1],board[i][2]);

//       //打印分割行

//       if(i<row-1)

//       printf("---|---|---\n");

//  }

//}







void displayboard(char board[Row][Col], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

         //打印数据

         int j = 0;

         for(j = 0; j < col; j++)

          {

                  printf(" %c ", board[i][j]);

                  if(j<col-1)

                  printf("|");

          }

          printf("\n");

         //打印分割行

          if (i < row - 1)

          {

              for(j=0;j<col;j++)

             {

               printf("---");

               if (j < col - 1)

               printf("|");

             }

              printf("\n");

         }

    }

}







void player_move(char board [Row][Col], int row, int col)

{

    int x = 0;

    int y = 0;

    printf("玩家下棋\n");

    while (1)

    {

         printf("请输入坐标>:\n");

         scanf("%d %d", &x, &y);

         if (x >= 1 && x <= row && y>=1&&y <= col)

         {

             //下棋

             if (board[x - 1][y - 1] == ' ')

             {

                  board[x - 1][y - 1] = '*';

                  break;

             }

             else

             {

                  printf("该坐标被占用,请重新输入\n");

             }

         }

         else

         {

             printf("坐标非法请重新输入\n");

         }

    }

}





void computer_move(char board[Row][Col], int row, int col)

{

    int x = 0;

    int y = 0;

   

    while (1)

    {

         printf("电脑下棋\n");

         x = rand() % row;//0-2

         y = rand() % col;//0-2

         if (board[x][y] == ' ')

         {

             board[x][y] = '#';

             break;

         }



    }

   

}



 static int is_full(char board[Row][Col], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

         int j = 0;

         for (j = 0; j < col; j++)

         {

             if (board[i][j] == ' ')

             {

                  return 0;//棋盘没满

             }

         }

    }

    return 1;//棋盘满了

}

char is_win(char board[Row][Col], int row, int col)

{

    int i = 0;

    //判断行

    for (i = 0; i < row; 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 < col; i++)

    {

         if (board[0][i] == board[1][i] && board[i][1] == 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];

    }

    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')

    {

         return board[1][1];

    }

    //判断平局

    if (is_full(board, row, col)==1)

    {

         return 'Q';

    }

    //继续

    return 'C';

下面是我们的讲解:

对于游戏的实现,三子棋实则是一个3x3的数组,刚开始可以将数组的内容打印成空格,调试出来就看不见,之后我们只需要将下的棋替换我们的空格即可。这里我们为了模块化更强,将函数分开来写

三子棋.c用来游戏的实现,test.c测试游戏的逻辑,game.h函数声明,符号定义。

首先这里声明函数,row-行,col-列

这里新加上row跟col的定义方便以后三子棋的表格变成5x5等你想要的数字

void initboard(char board[3][3], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

         int j = 0;

         for (j = 0; j < col; j++)

         {

             board[i][j] = ' ';

         }

    }

}

三子棋主文件里面的Row跟Col如果想要使用要引入头文件

<>是库  “ ”是自己写的

下面是打印棋盘的函数实现

void displayboard(char board[3][3], int row, int col)

{

    int i = 0;

    for (i = 0; i < row; i++)

    {

         int j = 0;

         for (j = 0; j < col; j++)

         {

            printf("%c", board[i][j]);//这是打印一行

         }

    }

}

这里因为函数每个都要用#include<stdio.h>将这个头文件放入game.h因为每个都引入game.h

当程序开始运行的时候没有出现我们想要的棋盘格界面,因为我们只是打印了九个空格,空格又无法被看见

所以我们需要重新设计打印棋盘的函数

经过新的调试

得到了打印的棋盘但是为了优化我们的界面我们将最后一行的虚线不打印,从而得到新的界面

如果之后我们想自定义10x10的

会得到这样的界面

原因在于在这里我们打印了三列并非是自定义的

所以为了我们代码灵活性可以自定义棋盘格

新代码设计完当我们将定义改成10

这时我们的目的就达到了,

下面就是下棋函数的设计分为玩家下和电脑下

我们在设计下棋的时候假设玩家不懂数组方面的数字,输入的坐标单纯为看见的坐标并非从0开始

之后我们在来设计电脑下棋

这里应用了时间戳的概念,关于时间戳的问题之前在猜数字游戏中已经讲的过,不懂的同学可以去内篇文章进行了解

这里进行判断使用这样的逻辑

*是我们自己下,#是电脑下,这样返回就不需要判断返回值,返回这两个直接就可以得到谁赢或输

这里的is_full仅用于对is_win函数的判断我们不想让这函数在其他文件中使用,所以使用static修饰

这是判断输赢的函数,逻辑是赢的话是横着三个相同或者竖着或者对角线

这是最终游戏的实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

-Taco-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值