c/c++语言开发共享C语言实现三子棋游戏(棋盘可变)

本文实例为大家分享了c语言实现三子棋游戏的具体代码,供大家参考,具体内容如下思路:main函数结构部署game函数功能的实现①创建存储空间②初始化存储空间为空格③打印棋盘④实现玩家下棋⑤实现电脑下棋⑥

c/c++开发分享C语言实现三子棋游戏(棋盘可变)实例为大家分享了c语言实现三子棋游戏的具体代码,供大家参考,具体内容如下

思路:

main函数结构部署
game函数功能的实现
①创建存储空间
②初始化存储空间为空格
③打印棋盘
④实现玩家下棋
⑤实现电脑下棋
⑥实现玩家和电脑下棋后的输赢判断

所使用的文件:

test.c—–用于测试游戏
game.c—-用于实现游戏中的一些函数
game.h—–头文件

test.c

  #define _crt_secure_no_warnings 1  #include<stdio.h>  #include"game.h"  #include<stdlib.h>    void menu()  {   printf("%sn", "**********");   printf("%sn", "* 1.play *");   printf("%sn", "* 0.exit *");   printf("%sn", "**********");  }  void game()  {   //建立存储空间--二维数组   char ch[row][col];//我们想让数组空间变得灵活,就要保证行和列可变,单数组不接受变量,只能使用define定义的常量-----最好放在头文件里---从而改变头文件实现数组空间灵活变化   //初始化存储空间----显示正常   innit(ch,row,col);   //打印棋盘   pri_board(ch, row, col);   char re='';//接收游戏结果   //玩家和电脑博弈   while (1)   {    //玩家下棋    pla_move(ch, row, col);    pri_board(ch, row, col);    //使用函数判断是否产生输赢     re=is_win(ch,row,col);    //只要不等于"c"说明产生了结果,直接结束博弈    if (re != 'c')     break;    //电脑下棋    com_move(ch, row, col);    pri_board(ch, row, col);    //使用函数判断是否产生输赢        re=is_win(ch, row, col);    if (re != 'c')     break;     }   if (re == '*')    printf("玩家获胜!n");   else if (re == '#')    printf("电脑获胜!n");   else    printf("平局!n");     pri_board(ch, row, col);    }        int main()  {   //srand函数的使用,后面的com_move函数使用(难点)   srand((unsigned int)time(null));   int input = 0;   do {    //打印游戏菜单提示玩家    menu();    //玩家选择    printf("请选择>:");    scanf("%d", &input);    //对玩家的选择进行实现    switch (input)    {    case 1:     game();     break;    case 0:     printf("退出游戏n");     break;    default:     printf("输入错误,重新输入n");     break;    }       } while (input);     }

game.c

  #define _crt_secure_no_warnings 1  #include "game.h"  void innit(char ch[row][col], int row, int col)  {//遍历二维数组将值改为空格实现初始化      int i = 0;   int w = 0;   for (i = 0; i < row; i++)   {    for (w = 0; w < col; w++)    {     ch[i][w] = ' ';      }   }      }    void pri_board(char ch[row][col],int row,int col)  {//   int i = 0;   int w = 0;   //行的循环里有两个列的循环   //列的循环里有两个打印循环   for (i = 0; i < row; i++)   {    for (w = 0; w < col; w++)    {      printf(" %c ", ch[i][w]);      if (w < col - 1)       printf("|");     }    printf("n");    if (i < row - 1)    {     for (w = 0; w < col; w++)     {      printf("---");      if (w < col - 1)       printf("|");     }       printf("n");    }    }             }    void pla_move(char ch[row][col], int row, int col)  {   while (1)   {   //玩家输入下棋坐标   int a = 0;   int b = 0;   printf("玩家走>:n");   printf("请输入你要下的棋子坐标:");   scanf("%d%d", &a, &b);  //判断坐标是否合法       if ((a >= 1 && a <= row) && (b >= 1 && b <= col))    {          //符合规范后,判断棋子位置是否被占用     //玩家下棋的坐标和数组坐标有差异      if (ch[a-1][b-1] == ' ')      {       ch[a-1][b-1] = '*';       break;      }      else      {       printf("该位置被占用,请重新输入n");      }         }    else    {     printf("你所输入的棋子位置不符合规范,请重新输入n");    }   }    }      void com_move( char ch[row][col],int row,int col)  {   printf("电脑走>n");   //涉及到srand和rand函数的使用(较难)   //取余后坐标在正确范围内   while(1)   {    int a = rand()%row;       int b = rand()%col;   //判断坐标处是否已经下过       if (ch[a][b] == ' ')    {     ch[a][b] = '#';     break;    }   }  }    //通过遍历二维数组里面的内容判断是否平局  int  is_full(char ch[row][col], int row, int col)  {   int i = 0;   int w = 0;   for (i = 0; i < row;i++)   {    for (w = 0; w < col; w++)    {     if(ch[i][w] == ' ');          return 0;    }   }   return 1;  }        char is_win(char ch[row][col], int row, int col)  {   int i = 0;   //判断行(三子棋版本)   for (i = 0; i < row; i++)   {    if (ch[i][0] == ch[i][1] && ch[i][1] == ch[i][2] && ch[i][0] != ' ')     return ch[i][0];       }     //判断列(三子棋版本)   for (i = 0; i < col; i++)   {    if (ch[0][i] == ch[1][i] && ch[1][i] == ch[2][i] && ch[0][i] != ' ')     return ch[0][i];   }   //判断对角线(三子棋版本)   if (ch[0][0]==ch[1][1]&&ch[1][1]==ch[2][2]&&ch[1][1]!=' ')    return ch[1][1];  if (ch[0][2] == ch[1][1] && ch[1][1] == ch[2][0] && ch[0][2] != ' ')    return ch[0][2];   //判断是否平局    int ispj = is_full(ch, row, col);    //棋盘满返回1    //不满返回0   if (ispj == 1)    return 'q';   else    return 'c';  }

game.h

  #define _crt_secure_no_warnings 1  #define row 3  #define col 3  #include<stdio.h>  #include<stdlib.h>  #include<time.h>  void innit(char ch[row][col], int row, int col);  void pri_board(char ch[row][col], int row, int col);  void pla_move(char ch[row][col], int row, int col);  void com_move(char ch[row][col], int row, int col);  char is_win(char ch[row][col], int row, int col);

然而,这个三子棋代码只能在3*3棋盘下实现
我们可以通过改变is_win()输赢判断条件,来实现棋盘的自由变化.

修改

优化后的判断条件

列和行的判断

  for (i = 0; i < col; i++)   {    int count = 0;    for (q=0;q<row;q++)    {//列的判断     if (ch[q][i] == ch[q + 1][i] && ch[q][i] != ' ')     {      count++;      continue;     }     else      break;    }    if (count >= 2)     return ch[q][i];   }    //判断行(三子棋版本)  for (q = 0; q < row; q++)  {   int count = 0;   for (i = 0; i < col; i++)   {//行的判断    if (ch[q][i] == ch[q][i + 1] && ch[q][i] != ' ')    {     count++;     continue;    }    else     break;   }   if (count >= 2)    return ch[q][i];  }

对角线的判断

  //判断对角线(三子棋版本)  //左上角到右下角  for (q = 0; q < row; q++)  {   for (i = 0; i < col; i++)   {    if (ch[q][i] == ' ')    {     continue;    }    else    {     if (ch[q][i] == ch[q + 1][i + 1])     {      if (ch[q + 1][i + 1] == ch[q + 2][i + 2])       return ch[q][i];     }    }   }   }      //右上角到左下角  for (q = 0; q < row; q++)  {   for (i = 0; i < col; i++)   {    if (ch[q][i] == ' ')    {     continue;    }    else    {     if (ch[q][i] == ch[q + 1][i - 1])     {      if (ch[q + 1][i - 1] == ch[q + 2][i - 2])       return ch[q][i];     }    }   }  }

等日后有时间,再来实现电脑的算法.

以上就是c/c++开发分享C语言实现三子棋游戏(棋盘可变)的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

需要了解更多c/c++开发分享C语言实现三子棋游戏(棋盘可变),都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/993004.html

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐