C语言实现井字棋游戏

 更新时间:2021年04月28日 09:39:50   作者:晴空孤缕光  
这篇文章主要为大家详细介绍了C语言实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下

首先,我们需要一个大体的思路,先进行宏观规划,再对细节进行实现。

比如:

1、首先需要一个菜单面板作以修饰,在这个面板上,玩家可以选择进入游戏或者退出游戏。
2、需要一个游戏程序,这个是核心。

差不多就是这两个了,我们可以先把这个写下来,这样也可以方便后面使用,像这样:

void Game();
int Menu();//这里Menu之所以用int,是为了用返回值来确定是否退出游戏,并非唯一,也非最佳,读者自己尝试

为了丰富游戏内容,我们可以加入一个选项在函数Game()里,比如PVE模式、PVP模式。

void PVP();
void PVE();

接下来,我们就可以用主函数把这些东西连起来啦!如下:

int main() {
 int i=Menu();
 if (i == 1) {
  Game();
 }
  printf("再见");
 return 0;
}

这样就大功告成啦~~(最后哪个再见可以不要,这个代码中,笔者为了优化玩家游戏体验,加入了很多不必要的东西,读者均可以不写,主要视读者兴趣而定)

接下来我们来实现细节,先来写菜单:(如下)

int Menu() {
//以下是修饰用的菜单面板
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:开始游戏   #####\n");
 printf("###### 2:退出游戏   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
//下面这个循环的目的是为了确认玩家是否输入的是“1”或者“2”,为了使系统可以稳定运行,这个很重要
 int i = 0;
 while (1) {
  scanf("%d", &i);
  if (i == 1 || i == 2) {
   break;
  }
  printf("\n输入无效,请重新输入:");
 }
 if (i == 1)
 return 1;
 return 2;
}

这里我们可以看到,返回了 i ,因为我在主函数里需要借助这个返回值确定是否进入游戏~~

完成面板后,我们就要进行我们的核心部分。

函数Game()的实现

同样的,先宏观操作,根据需求来写代码。

void Game() {
//首先需要一个看起来像棋盘的东西,数组是个不错的选择,
//因为一般我们用‘x'和‘o'来表示两个玩家的棋子,我们这里把数组定义成char类型
 char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}};
//以下是花里胡哨的面板~~
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:人机对战   #####\n");
 printf("###### 2:双人对战   #####\n");
 printf("###### 3:退出游戏   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");//提示玩家输入的窗口 
 int choose = 0;
//这个循环同样是为了优化系统的稳定,不至于被有些调皮的玩家搞崩~~
 while (1) {
    scanf("%d", &choose);
 if (choose == 1 || choose == 2||choose==3)
  break;
 printf("\n输入无效,请重新输入:");
 }
//根据玩家的选择进入相应的模式,这里if(choose==3)的时候显然Game会运行结束,到达主函数的结束阶段,所以笔者偷了个懒,并没写这个情况~~,不过这并不影响什么。
 if (choose == 1)
  PVE();
 if (choose == 2)
  PVP();
}

以上都是游戏的基本流程,玩过游戏的老铁应该是烂熟与心的,没玩过也没关系~~,去玩一下就知道了,总之要搞出来一个游戏,我们总得知道玩的过程吧?

接下来实现两个模式:

先写人机吧?(这个限于笔者能力有限,写的比较啰嗦,如果读者有更好的创意,可以去自己实现~~)

void PVE() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //胜负判别
 char win = ' ';
 //落子的坐标定义
 int i = 0;
 int j = 0;
 //打印棋盘
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家落子
  printf("请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\n请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
            win = '0';
   break;
  }
  //电脑落子 
  while (1) {
   i = (time(0) % 3);
   j = ((time(0)*time(0)) % 3);
   if (arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\n不会吧?不会吧!不会真的有人输给人工智障吧?\n");//笔者还是个孩子,也比较调皮哈~~,不建议这么写,大家成熟些啊~
 }
 else if (win == 'x') {
  printf("\n恭喜获胜!!!\n");
 }
 else {
  printf("\n恭喜您与人工智障打成平手!!!\n");//捂脸~由于电脑走的棋是笔者用时间戳来随机确定的,可能真的有些人工智障.
  //这里如果笔者有兴趣,可以设计一个难度选择界面,通过感应周围的棋子的位置来确定,或者直接输入经验也可以,凭读者喜好决定~~

 } 
 //这里笔者考虑到再来一局的设计,觉得可以提供一些便利,于是就有了下面的递归
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜单    #####\n");
 printf("###### 2:再来一次    #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
 while (1) {
     scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n输入违法,请重新输入:");
 }
 if (re == 1) {
  re=Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVE();
 }
}

好嘞!以同样的方式写下PVP模式,思路差不多,就不详细解释了,具体如下

void PVP() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //胜负判别
 char win = ' ';
 //落子的坐标定义
 int i = 0;
 int j = 0;
 //打印棋盘
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家p1落子
  printf("P1玩家请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\nP1玩家请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
  //玩家p2落子 
  printf("P2玩家请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
   printf("\nP2玩家请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == '0') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\nP2获得胜利!!!\n");
 }
 else if (win == 'x') {
  printf("\nP1获得胜利!!!\n");
 }
 else {
  printf("\n平手!!!\n");
 }
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜单   #####\n");
 printf("###### 2:再来一次   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
 while (1) {
  scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n输入违法,请重新输入:");
 }
 if (re == 1) {
  re = Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVP();
 }
}

这样,所有我们设计好的细节就都被实现啦,一个完整的简单游戏就大功告成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总

    终是到了标志着大二结束的期末考试了,对于《算法设计与分析》这门课,我需要总结一下学过的所有算法的思想以及老师补充的关于两个复杂度和递归的概念思想,以及更深层次的理解,比如用画图的方式表达出来,我觉得可以用博客记录总结一下,分享给大家,希望能有所帮助
    2022-05-05
  • vscode分享代码插件Polacode介绍

    vscode分享代码插件Polacode介绍

    这篇文章主要介绍了vscode分享代码插件Polacode的相关知识,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • C++操作.json文件的超详细新手教程

    C++操作.json文件的超详细新手教程

    最近因为项目原因需要解析JSON格式数据,所以这篇文章主要给大家介绍了关于C++操作.json文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 在C++中高效使用和处理Json格式数据的示例代码

    在C++中高效使用和处理Json格式数据的示例代码

    最近的项目在用c处理后台的数据时,因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述,如何在c中高效使用和处理Json格式的数据就成为了必须要解决的问题,需要的朋友可以参考下
    2023-11-11
  • C语言实现树的动态查找实例代码

    C语言实现树的动态查找实例代码

    这篇文章主要介绍了C语言实现树的动态查找实例代码的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++静态持续变量介绍

    C++静态持续变量介绍

    这篇文章主要介绍了 C++静态持续变量,静态持续变量的定义C++和C语言是一样的,它拥有三种链接性,即外部链接性、内部连接性和无链接性。其中外部链接性指的是可以在其他文件中访问,内部链接性指的是只能在当前文件访问,需要的朋友可以参考一下
    2021-11-11
  • C++实现LeetCode(111.二叉树的最小深度)

    C++实现LeetCode(111.二叉树的最小深度)

    这篇文章主要介绍了C++实现LeetCode(111.二叉树的最小深度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C语言的mem系列函数

    详解C语言的mem系列函数

    这篇文章主要为大家详细介绍了C语言的mem系列函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++精要分析右值引用与完美转发的应用

    C++精要分析右值引用与完美转发的应用

    C++11标准为C++引入右值引用语法的同时,还解决了一个短板,即使用简单的方式即可在函数模板中实现参数的完美转发。那么,什么是完美转发?它为什么是C++98/03 标准存在的一个短板?C++11标准又是如何为C++弥补这一短板的?别急,本节将就这些问题给读者做一一讲解
    2022-05-05
  • C++ move semantic移动语义介绍

    C++ move semantic移动语义介绍

    首先,移动语义和完美转发这两个概念是在C++的模板编程的基础上,新增的特性,主要是配合模板来使用。本篇会从C++的值类型,到移动拷贝与移动赋值来理解移动语义与完美转发
    2022-08-08

最新评论