Hello,大家好,我是李同学

今天我们来实现一个简单的游戏

就是大家小时候经常玩的游戏井字棋/三子棋

那什么是井字棋呢?

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

为了简化操作,我们设计3*3的表格,动手之前我们必须思路清晰

我把代码实现分为以下8步:

1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'q’表示和棋。
6.电脑落子(随机位置落子) ,'o’表示电脑落子。
7.判定胜负关系。
8.回到 步骤2 继续执行。

废话不多说,我们开始动手

我使用的vs2022,大家可以新建一个项目game1

在头文件中添加game.h

在源文件中添加game.ctest.c

1.菜单界面选择开始或者退出游戏

我们首先要在搭建游戏框架,框架建议放在源文件test.c,要实现的功能有:

当用户输入1的时候,进入井字棋程序

当用户输入0的时候,退出井字棋程序

当用户输入其他数字的时候,提醒用户输入错误,重新输入

#include <stdio.h>
void menu()
{printf("************************************\n");printf("***   1.play     0.exit          ***\n");printf("************************************\n");
}
void test()
{int input = 0;do{menu();printf("请选择:>");scanf_s("%d", &input);switch(input){case 1:printf("三子棋\n");break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;};} while (input);
}
int main()
{test();return 0;
}

代码运行的图片

2.创建棋盘并初始化

接下来创建棋盘,使用3*3数组来表示,元素类型是char

这里建议放在头文件game.h,我们将会使用宏定义

为什么要使用宏定义呢?

使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

#define ROW 3
#define COL 3
char chessBoard[ROW][COL] = { 0 };

3.棋盘初始化

这是很关键的一步,将3*3数组中的元素全部换成空格

void init(char chessBoard[ROW][COL])
{for (int row = 0; row < ROW; row++){for (int col = 0; col < COL; col++){chessBoard[row][col] = ' ';}}
}

4.打印棋盘

我们要的棋盘是这样的

代码实现

void print_chessBoard(char chessBoard[ROW][COL])
{printf("+---+---+---+\n");for (int row = 0; row <MAX_ROW; row++) {printf("| %c | %c | %c |\n", chessBoard[row][0],chessBoard[row][1], chessBoard[row][2]);printf("+---+---+---+\n");}
}

得到的图像如下图所示

5.玩家落子

玩家输入行列坐标表示落子,使用’x’表示玩家落子。

注意:
1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。

void playerMove(char chessBoard[ROW][COL])
{while (1){int row = 0;int col = 0;printf("请输入坐标(row col):");scanf("%d %d", &row, &col);if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");continue;}if (chessBoard[row][col] != ' '){printf("您的坐标位置已经有子了!\n");continue;}chessBoard[row][col] = 'x';break;}
}

6.电脑落子

电脑随机产生行列坐标,'o’表示电脑落子。

注意:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.要在棋盘上空的地方下棋。

void computerMove(char chessBoard[ROW][COL])
{while (1){int row = rand() % MAX_ROW;int col = rand() % MAX_COL;if (chessBoard[row][col] != ' ') {continue;}chessBoard[row][col] = 'o';break;}
}

7.判断胜负

此处约定返回结果的含义:
(1)‘x’ 表示玩家获胜
(2)‘o’ 表示电脑获胜
(3)’ ’ 表示胜负未分
(4) ‘q’ 表示和棋

1.判定是否和棋
(1)调用isFull函数。
(2)如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
(3)如果棋盘满了未分出胜负,和棋。
2.判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线

int isFull(char chessBoard[ROW][COL])
{for (int row = 0; row < ROW; row++){for (int col = 0; col < COL; col++){if (chessBoard[row][col] == ' '){return 0;}}}return 1;
}char isWin(char chessBoard[ROW][COL])
{for (int row = 0; row < MAX_ROW; row++){if (chessBoard[row][0] != ' '&& chessBoard[row][0] == chessBoard[row][1]&& chessBoard[row][0] == chessBoard[row][2]) {return chessBoard[row][0];}}for (int col = 0; col < MAX_COL; col++) {if (chessBoard[0][col] != ' '&& chessBoard[0][col] == chessBoard[1][col]&& chessBoard[0][col] == chessBoard[2][col]) {return chessBoard[0][col];}}if (chessBoard[0][0] != ' '&& chessBoard[0][0] == chessBoard[1][1]&& chessBoard[0][0] == chessBoard[2][2]) {return chessBoard[0][0];}if (chessBoard[2][0] != ' '&& chessBoard[2][0] == chessBoard[1][1]&& chessBoard[2][0] == chessBoard[0][2]){return chessBoard[2][0];}if (isFull(chessBoard)) {return 'q';}return ' ';
}

大功告成啦!接下来我们就可以和电脑下棋了,当然也会出现三种情况 1)赢棋 2)输棋 3)和棋

1)赢棋

2)输棋 

至今还没输过。。。。为了做素材,我还是输了一把

3)和棋

为了素材,我也打了一把平手

虽然电脑也能下三子棋,不过最大的问题也来了,它是一个彻头彻尾的“人工智障

不会思考的那种机器人,希望这个作品以后还能改进吧

觉得内容不错的同学记得留在手里的赞哦

我是李同学,我们明天见

C语言实现井字棋/三子棋相关推荐

  1. c语言井字棋程序框图,C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O"代表电脑下的子,'X" ...

  2. C语言自制小游戏:三子棋(井字棋)智能下棋补充

    目录 一.前期准备 二.逻辑与程序实现 1.连珠 ①横向连珠 ②纵向连珠 ③斜向连珠 ④函数完善 2.堵棋 ①横向堵棋 ②纵向堵棋 ③斜向堵棋 3.整理函数 ①整理AI_Computer函数 ②修改C ...

  3. C语言人机大战之决战三子棋之巅

    文章目录 C语言人机大战之三子棋 一.游戏规则 二.游戏实现 (1)游戏界面 (2)游戏ing 初始化棋盘 打印棋盘 玩家落子 电脑落子 判断输赢 棋盘满否 三.代码总结 (1)game.h (2)t ...

  4. C语言实现“井字棋”游戏(三子棋)人机对弈

    井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名. 题目分析 : 要完成该游戏的编写,我们需要先分 ...

  5. C语言实现井字棋游戏(含算法优化)

    目录 序言 代码1 小结 算法优化 代码2 总结 序言 井字棋 英文名叫Tic-Tac-Toe 想必大家对这个小游戏都不陌生了 无论是小时候课堂上被画的全是"井"字的草稿纸 还是长 ...

  6. 井字棋小游戏c语言简单编码,C语言实现井字棋小游戏

    C语言实现简单的"井字棋游戏",供大家参考,具体内容如下 总体构造: 1.游戏菜单的逻辑实现 2.游戏本体的代码实现 part 1:游戏菜单的整体逻辑 ①简单的通过一个输入0和1的 ...

  7. 【C语言实现井字棋及电脑落子优化】

    朋友们,我们还记得以前上课经常和同桌玩起井字棋,那么我们就当我们回忆童年,现在也用C语言来实现井字棋,本次代码相对于初阶的井字棋,在电脑下棋代码部分做了优化,使得电脑更加具有威胁,但是由于博主水平有限 ...

  8. 井字棋游戏 c语言实现,井字棋小游戏(C语言)

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 void drawBoard(char *board) //绘制棋盘 8 {9 p ...

  9. C语言初学——井字棋小游戏

    hello呀!小伙伴们,今天小刘同学要带着大家学习的内容是--井字棋小游戏!!! 在本次学习中,我们将会运用到的主要内容是数组,函数,循环和判断. 当然,本次学习的内容并不困难,希望本次教学结束大家都 ...

最新文章

  1. java hibernate configuration 获取_1 Hibernate Configuration 配置
  2. java 连接数据库之一个完整的函数
  3. Mysqldump备份和恢复
  4. 为什么说 Java 是按值传递的?
  5. python爬虫xpath教程_使用 Xpath 进行爬虫开发
  6. UI Automation 简介
  7. git clone报错
  8. 网络飞鸽传书容易犯的错
  9. java复习题_java习题-(static)
  10. python类:magic魔术方法
  11. 易语言锐浪报表连接mysql_学习锐浪报表之MySQL连接字符串的实际操作步骤汇总...
  12. 403. 青蛙过河--(每日一难phase2--day10)
  13. backgroundworker与Thread区别
  14. WebSockt面试题
  15. 面经自己汇总(三维视觉算法机器学习深度学习)——持续更新
  16. 考研英语不熟悉的词义(List1-List5)
  17. fabric1.4.3单机环境搭建教程(四)
  18. 【java神操作】java竟然还可以能执行Javascript代码!!
  19. mysql判断日期是不是月末_java 判断一个日期是不是月末
  20. 苹果cms图片外部储存使用教程

热门文章

  1. onino病毒来袭,教你快速关闭某端口
  2. 详解图像增强、图像复原技术
  3. Python-菜鸟练习100题
  4. java架构师成长直通车更新到,腾讯T3手把手教你
  5. c语言利用指针函数等完成学生成绩管理系统,课程设计C语言可视化程序学生成绩管理系统...
  6. certbot-auto 一直卡在“Installing Python packages…”解决方法
  7. Matlab 2010a设置VS2010为编译器
  8. HDU 3068 最长回文 manacher算法
  9. 基于springboot的宠物医院管理系统的设计与实现
  10. 哈斯HASS驱动器电源维修HASS40HP/20HP