先直接上代码:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>         //2.实现三子棋游戏。
#include<Windows.h>       //Sleep() RAND_MAX 的头文件void menu()                       //打印菜单
{printf("****************************\n");printf("**** 欢迎来到三子棋游戏 ****\n");printf("**** 1、   进入游戏     ****\n");printf("**** 0、   退出游戏     ****\n");printf("****************************\n");printf("请输入:->");
}void print_chessboard(char coord[][3])    //打印棋盘函数
{        //多维数组在传参时,接收数组的形参最多只能是第一个方括号里没有数字(下标范围)//否则就会出错(因为此时编译器不知道你要把传过来的数组的元素划分成几行几列,//但是当除第一个方括号的其他方括号都有值时,就可以经过计算知道第一个方括号的值是多少int i = 0;int index_x = 0;int index_y = 0;for (i = 1; i <= 153; i++){               char out_ch = ' ';if ((i % 51 == 20) || (i % 51 == 26) || (i % 51 == 32)  ){out_ch = coord[index_x][index_y];index_x++;if (index_x < 3){index_x = 0;index_y++;}}else if ((i % 17 == 6) || (i % 17 == 12)){out_ch = '|';}else if( (i >= 35 && i <= 51 && i != 40 && i != 46) || \(i >= 86 && i <= 102 && i != 91 && i != 97)){out_ch = '_';}putchar(out_ch);if (i % 17 == 0)                  //每输出 17 个字符换下一行输出{printf("\n");}}
}void winer(char coord[][3], int *flag);     //赢家判断函数的声明int computer(char coord[][3])                               //电脑下棋
{int flag = 0;int index_x2 = 0;int index_y2 = 0;srand((unsigned)time(NULL));while (1){index_x2 = 2 * rand() / RAND_MAX;                  //产生 0--2 的随机数index_y2 = 2 * rand() / RAND_MAX;if ((coord[index_x2][index_y2] != '*') && (coord[index_x2][index_y2] != 'o')){                                                 //判断该位置是否已有落子coord[index_x2][index_y2] = 'o';winer(coord, &flag);if (flag == 1){return 1;}return 0;}}
}int player(char coord[][3], int index_x1, int index_y1) //玩家下棋
{int flag = 0;int ret = 0;if ((coord[index_x1][index_y1] == '*') || (coord[index_x1][index_y1] == 'o')){                                                      //判断该位置是否已有落子printf("此位置已有棋子,请重下!\n");return 0;}else{coord[index_x1][index_y1] = '*';winer(coord, &flag);if (flag == 1){return 1;}ret = computer(coord);if (ret == 1){return 1;}print_chessboard(coord);       //把打印棋盘放在是因为想在两人都走完一次后再打印当前棋盘状态}return 0;
}void winer(char coord[][3],int *flag)           //判断是否产生赢家,赢家是谁
{char line_ch[8][4] = { { coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] }, \{ coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] }, \{ coord[0][2], coord[1][2], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] }, \{ coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] } };//把所有能赢的情况定义成一个字符串数组int i = 0;for (i = 0; i < 8; i++){if (strcmp(line_ch[i],"***") == 0)   //判断此时玩家已输入的落子能不能组成一个使玩家能赢的字符串{print_chessboard(coord);         //先打印棋盘,再判断谁胜谁负printf("\n恭喜您赢了!\n");*flag = 1;                      //玩家赢,使最开始设置的赢的标志位为1,结束此次游戏return;}else if (strcmp(line_ch[i],"ooo") == 0){print_chessboard(coord);printf("\n很遗憾,您输了!\n");*flag = 1;return;}else{;}}
}int main()
{while (1){int num = 0;            //决定开始或退出游戏int x = 0;int y = 0;int i = 4;              //一次游戏最多的内层while循环可循环的次数int ret = 0;            //是否结束此次游戏的标志位int is_play = 0;        //是否再次玩游戏的标志位char coordinate[3][3] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };//为了拓展游戏比较方便,可以把行和列定义成宏定义menu();                 scanf("%d", &num);if (num == 0){printf("5秒后退出程序!\n");Sleep(5000);exit(0);}computer(coordinate);      //因为设计电脑智商低,所以游戏开始前先让电脑落一子print_chessboard(coordinate);while ((i))                //因为总共有九个位置可以落子,已用一个,还剩八个,每次循环不结束的话会用掉两个//所以最多循环四次{printf("请输入 X、Y 的坐标(0--2)来确定你下棋的位置:");   //也可以加一个判断输入是否合法scanf("%d %d", &x, &y);ret = player(coordinate, x, y);if (ret == 1){break;}i--;} printf("\n");printf("请选择接下来的操作:\n");printf("1、 再玩一次游戏    0、退出游戏系统\n");scanf("%d", &is_play);if(is_play == 0){printf("5秒后退出程序!\n");Sleep(5000);exit(0);}else{system("cls");}}system("pause");return 0;
}

程序一共设计了六个函数,一个主函数,五个自定义函数— 菜单打印函数、棋盘打印函数、电脑下棋函数、玩家下棋函数、赢家判断函数。
其中最难设计的就是棋盘打印函数和赢家判断函数。这两个函数需要完成的任务多,计算量大,逻辑设计麻烦。

下面来分析一下几个函数的设计思路:

  1. 菜单打印函数
    这个函数很简单,一看就能明白,这儿就不多说了。
  2. 棋盘打印函数
    首先得构思一下三子棋的棋盘应该是什么样

简单点,上图就可以作为三子棋棋盘(其实就是利用 putchar() 函数和 printf() 把显示在屏幕上的字符一个个,一行行打印上去)。设计时可把其分成四部分来看,(1) 短竖杠 ; (2) 短横杠 ; (3) 棋子(用一个二维字符数组来定义每一个棋子,用二维是因为方便输入的 X 和 Y 值与数组下标对应) ; (4) 空格(一开始打印的时候,因为还没有落子,所以把棋子也设计成空格)。 先确定要输入几行几列字符,以确定循环输出的次数,还有确定每个位置该输出的字符,这样就可以依靠循环和判断打印出棋盘了。

3 . 赢家判断函数
在每次落子后都要先进行一次判断,看是否已经产生赢家了。
因为会出现赢家的情况就八种———–
{ coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] },
{ coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] }
定义一个字符串数组,里面共有八个字符串,每一个字符串就是上面的一个花括弧里的内容,当某个字符串的内容与 * 或 ooo 相等,那么说明产生赢家了,否则不会产生赢家,那么就用一个循环,遍历字符串数组里的每一个字符串,判断是否会产生赢家。
4. 玩家下棋函数
玩家通过输入 x,y 坐标来确定落子的位置, x,y 对应的就是 定义的棋子二维字符数组的下标,每次先判断输入的 x,y 值对应数组下标的元素是否是 * 或 o ,是的话就说明此处已有落子,得重新输入,不是的话就落下该棋子,接着判断是否产生赢家,是的话就结束此次游戏,不是的话就判断棋盘上是否还有空位置没落子,有的话就轮到电脑继续落子,没有的话就结束此次游戏。
5. 电脑下棋函数
因为电脑是自动落子,所以得为电脑产生一个随机的 棋子二维数组下标值,使电脑随机落子,这个用srand((unsigned)time(NULL)); index_x2 = 2 * rand() / RAND_MAX; index_y2= 2 * rand() / RAND_MAX;来实现把它们放在一个while 死循环里,因为可能产生的两个随机下标那儿已经有棋子了,需要重新产生一次随机下标,当下标值与已落棋子不冲突时,就落下该棋子,接着判断是否产生赢家,是的话,就结束此次游戏,不是的话就判断棋盘上是否还有空位置没落子,有的话就轮到玩家继续落子,没有的话就结束此次游戏。
6. 主函数
在主函数里适当调用以上定义的几个函数,实现正确的逻辑功能。

因为博主技术及思路有限,只能达到这个水平,希望博友们指出错误,让博主得以进步。

C语言实现三子棋游戏相关推荐

  1. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  2. C语言实现三子棋游戏 代码+思路+电脑下棋算法

    C语言实现三子棋游戏 代码+思路+电脑下棋算法 重点: 当检测到电脑已经两子连续时,将会尝试获得胜利. 在检测到玩家即将胜利(连城两子)时,进行拦截 尝试胜利的优先级高于拦截,意味着如果玩家不能再下一 ...

  3. 【C语言】三子棋游戏的实现(玩家VS玩家 or 玩家VS电脑)

    目    录 一.三子棋游戏介绍 二.游戏功能函数分析 1 菜单显示函数 2 菜单选择函数 3 选择确认函数 4 显示当前棋盘状态函数 5 棋盘初始化函数 6 玩家下棋函数 7 电脑下棋函数 8 棋局 ...

  4. 用C语言实现三子棋游戏(附上思路+项目展示+源代码)

    文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...

  5. 使用c语言实现三子棋游戏

    下面简介如何使用c语言的基础语法实现三子游戏的底层逻辑: 首先是菜单模块 使用switch语句进入游戏模块 前置交互完成,开始进入游戏函数. 第一部分棋盘创建,使用二维数组实现. a.初始化棋盘 为什 ...

  6. C语言实现三子棋游戏(规范化)

    `在复习了数组之后,对有些经典的数组题进行了,其中一道就是三子棋游戏这一功能的实现.下面附上我的个人理解和代码,希望各位大佬不吝指教. 首先有一个万能游戏模板,在c语言中有好多实现游戏的代码,我总结了 ...

  7. C语言程序设计——三子棋游戏

    三子棋游戏又叫井字棋游戏,是很多人小时候都玩过的一种小游戏,游戏的玩法是两名玩家在三行三列的九个格子子里依次下棋,若一方的棋子有三个在横.竖,斜线三种中的任何一种连成一条线就获得游戏胜利.接下来就让我 ...

  8. C语言实现三子棋游戏(棋盘可自行扩展)

    目录 三子棋简单介绍 实现方式 游戏外部测试(test.c文件) 游戏内容具体实现(game.c和game.h) 三子棋简单介绍 大家都玩过五子棋吧,三子棋和这个类似,就是三子连成一线就获得胜利. 大 ...

  9. C语言实现三子棋游戏—可扩展到任意N子棋

    C语言实现三子棋 游戏介绍 游戏编程思路 游戏代码详解 主函数 游戏菜单函数 游戏逻辑函数 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 完整代码 test.c game_chess.c gam ...

  10. c语言:三子棋游戏(二维数组的运用)

    三子棋游戏(又称9宫格游戏): 游戏规则: 玩家和电脑随机下子,当一方的三子连成一条线,可以为 横连  纵连  斜连.或者棋盘下满则此时判断为平局,游戏结束 实现程序的思路: 首先我们需要定义游戏菜单 ...

最新文章

  1. java 并发_Java并发原理无废话指南
  2. 如何利用WebScarab绕过JS验证
  3. Nginx配置反向代理与负载均衡
  4. Redis 数据类型介绍
  5. php 扩展包是什么意思,大家知道扩展用户组是什么意思么??
  6. CentOS 配置软raid
  7. SDWebImage 4 0 迁移指南
  8. [转帖]看完这篇文章你还敢说你懂JVM吗?
  9. mongodb官网文档阅读笔记:write concern
  10. 中英文对照 —— 医学与医院
  11. Ubuntu下fcitx安装。(ibus不会用)
  12. 动态生成和移除img标签---JavaScript
  13. HTML5 第六章盒子模型课后作业
  14. 3_kicad 5.0_PCB计算器(稳压器,布线宽度,电气间距,传输线路,RF衰减器,颜色代码,电路板类别)...
  15. Matlab中fspecial的用法
  16. 网站接口被恶意攻击怎么办
  17. 计算机蓝牙功能,笔记本电脑蓝牙在哪里?笔记本怎么打开蓝牙功能Bluetooth
  18. 看懂卫星遥感数据RPC文件
  19. 脑机接口、开源和民主化增强意识的未来
  20. ros::nodehandle常规操作

热门文章

  1. CATIA怎么约束快捷键_CATIA常用操作快捷键
  2. Mimikatz的攻击及防御
  3. Axure 元件 模板 MES系统 全套(带下载地址)
  4. 抠图 php中文网,ps cs3怎么抠图
  5. linux基础:快速搭建平台
  6. MAXScript入门
  7. 多道程序设计有哪些新特性呢?它又是如何实现程序的并发执行的呢?
  8. 大数据开发:数据仓库分层设计
  9. 超全地牢场景unity3d模型素材网站整理
  10. python读取svg转emf_ppt矢量图标,SVG转换EMF方法