三子棋游戏的实现

三子棋游戏:

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

  1. 先是主函数

 

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

利用dowhile写一个界面函数

#include

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

#include

#include



#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:\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';

下面是我们的讲解:

三子棋游戏的实现_第1张图片

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

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

三子棋游戏的实现_第3张图片

首先这里声明函数,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如果想要使用要引入头文件

三子棋游戏的实现_第4张图片

<>是库  “ ”是自己写的

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

三子棋游戏的实现_第5张图片

三子棋游戏的实现_第6张图片

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将这个头文件放入game.h因为每个都引入game.h

三子棋游戏的实现_第7张图片

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

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

三子棋游戏的实现_第8张图片经过新的调试

三子棋游戏的实现_第9张图片

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

三子棋游戏的实现_第10张图片

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

会得到这样的界面

三子棋游戏的实现_第11张图片

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

三子棋游戏的实现_第12张图片

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

三子棋游戏的实现_第13张图片

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

三子棋游戏的实现_第14张图片

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

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

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

三子棋游戏的实现_第15张图片

三子棋游戏的实现_第16张图片

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

三子棋游戏的实现_第17张图片

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

三子棋游戏的实现_第18张图片

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

三子棋游戏的实现_第19张图片

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

三子棋游戏的实现_第20张图片

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

三子棋游戏的实现_第21张图片

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

三子棋游戏的实现_第22张图片

这是最终游戏的实现

你可能感兴趣的:(游戏,p2p,蓝桥杯,c语言,算法)