三字棋大家应该不陌生,那么如何去利用C/C++去实现三字棋游戏的书写呢?

下面这些代码将会带你写出三字棋(我优化的不是很好):

1.  前期准备

创建文件目录如下图

文件目录创建好了过后,就开始准备书写了,最后写好的代码会放在文章末尾。

2. 初始化棋盘

因为三字棋的模样是下面这样的:

创建一个二维数组,就可以存放电脑与你下的棋字的位置信息。

于是,初始化棋盘代码段:

void Initboard(char board[ROW][COL], int row, int col)       //初始化棋盘
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}}

3. 打印棋盘

创建好棋盘过后,要去打印棋盘;打印棋盘的代码段如下(个人写的不好,自己可以尝试修改):


void Displayboard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");for (j = 0; j < col - 1; j++){if (i < row - 1){printf("---");if (j < col - 1){printf("|");}}}if (i < row - 1){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}

然后就可以得到打印出来的棋盘了:

4. 创建游戏结果判断条件:

使用char ret  来获取游戏状态的参变量,然后就是玩家与电脑轮流进行下棋了,玩家下棋为“*”;电脑下棋为“#”,然后如果某一方赢了,ret中将会得到返回值"*"或者“#”。当然,也有可能平局,也可能没有产生结果。所以,设置四个可能的ret来获取游戏的状态:*:玩家赢了,#:电脑赢了,C:继续游戏, Q:平局了。写出的两个判断函数如下(棋盘满了,没有分出胜负,则平局;)

5. 判断平局条件:


int IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;
}

6. 判断胜负条件:


char IsWin(char board[ROW][COL], int row, int col)
{int i = 0;//判断3行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][1];}}//判断3列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == 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];}//上述是判断是否赢了,接下来判断是否平局int ret = IsFull(board, row, col);if (ret == 1){return 'Q';}return 'C';}

7. 玩家下棋:

void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("请输入你要下入的坐标:> \n");while (1){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");break;}}}

8. 电脑下棋:


void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋 :>  \n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '*';break;}}}

9. 一些说明:

在生成随机数的时候,需要引用头文件:#include <time.h>

且在主函数中,需要用到srand((unsigned int)time(NULL));来利用当前的时间戳生成随机数。

#define _CRT_SECURE_NO_WARNINGS 1        这行是为了解决使用scanf时的提醒

三字棋总体来说不是很复杂,只要能够理清楚逻辑,再一步步去解决逻辑框架中的问题,那么就可以顺利实现三字棋了!

在其中,我在test中的game函数中提前创建了board数组,然后利用数组名(首元素地址),来实现其他函数对于数组的内容修改。(具体知识点请参考指针)

10. 头文件game.h(全部内容)

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW  3
#define COL  3
#include <stdio.h>#include <stdlib.h>
#include <time.h>void Initboard(char board[ROW][COL], int row, int col);  //初始化棋盘void Displayboard(char board[ROW][COL], int row, int col);   //打印棋盘void PlayerMove(char board[ROW][COL], int row, int col);      //玩家下棋void ComputerMove(char board[ROW][COL], int row, int col);    //电脑下棋char IsWin(char board[ROW][COL], int row, int col);       //判断是否赢了

11.源文件game.c的全部内容

#define _CRT_SECURE_NO_WARNINGS 1#include  "game.h"void Initboard(char board[ROW][COL], int row, int col)      //初始化棋盘
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}}void Displayboard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");for (j = 0; j < col - 1; j++){if (i < row - 1){printf("---");if (j < col - 1){printf("|");}}}if (i < row - 1){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("请输入你要下入的坐标:> \n");while (1){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");break;}}}void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋 :>  \n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '*';break;}}}int IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;
}char IsWin(char board[ROW][COL], int row, int col)
{int i = 0;//判断3行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][1];}}//判断3列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == 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];}//上述是判断是否赢了,接下来判断是否平局int ret = IsFull(board, row, col);if (ret == 1){return 'Q';}return 'C';}

12. 源文件test.c的全部内容:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>#include  "game.h"void meun()
{printf("**********************\n");printf("***   1.play    ***\n");printf("***    0.exit    ***\n");printf("**********************\n");
}void game()
{char board[ROW][COL] = { 0 };Initboard (board, ROW, COL);Displayboard (board, ROW, COL);char ret = 0; //获取游戏状态的参变量while (1){PlayerMove(board, ROW, COL);     //玩家下棋,且打印棋盘Displayboard(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}ComputerMove(board, ROW, COL);Displayboard(board, ROW, COL);if (ret != 'C'){break;}}if (ret = '#')printf("玩家获胜!\n");else if (ret = '*')printf("电脑获胜!\n");elseprintf("平局,游戏继续");Displayboard(board, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{meun();printf("请选择:> ");scanf("%d",&input);switch(input){case 1:printf("三子棋游戏\n");game();break;case 0:printf("游戏结束\n");break;default:printf("输入非法字符,请重新输入:> \n");}} while (input);return 0;}

13. 总结:

三字棋总体来说不是很复杂,只要能够理清楚逻辑,再一步步去解决逻辑框架中的问题,那么就可以顺利实现三字棋了!

在其中,我在test中的game函数中提前创建了board数组,然后利用数组名(首元素地址),来实现其他函数对于数组的内容修改。(具体知识点请参考指针)

最后,祝各位工作学习顺利

用C/C++实现3字棋游戏相关推荐

  1. php井字游戏,python实现井字棋游戏

    #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board ...

  2. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  3. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /*N字棋游戏PVP版,DOS版本 ...

  4. c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...

    [2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 一.实验目的与要求 (1)了解极大极小算法的原理和使用方法,并 ...

  5. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  6. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  7. 用C语言实现简单的一字棋游戏

    问题分析设计目录 棋盘显示和标记以及棋盘的设计 搜索树叶子节点设计 搜索树设计 节点静态估值计算 完整代码 总结 棋盘显示和标记以及棋盘的设计 用int一维数组表示一字棋的棋盘位置,0~8,数组位置i ...

  8. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  9. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  10. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

最新文章

  1. python 贴吧自动回复机-python借助wxpy与图灵实现微信机器人自动回复消息
  2. 设计模式03------单例模式
  3. C++ 中在函数的前面加上static的作用
  4. 学习Python有什么好的书籍?推荐这几本
  5. python横向合并merge_【Python代替Excel】7:merge、concat、append
  6. XGBoost 重要参数、方法、函数理解及调参思路(附例子)
  7. Flutter 项目开发指导 从基础入门到精通使用目录
  8. 世界500强牛企英语面试精彩问答
  9. 在线播放器 在网页中插入MediaPlayer 兼容IE和FF的代码调试
  10. bzoj 1015 [JSOI2008]星球大战starwar
  11. 【车道线检测与寻迹】2月13日 CV导论+数字图像处理与opencv实践+canny边缘检测
  12. PMP第六版 十大知识领域五大过程组
  13. BPM波导matlab,用Matlab画平板波导色散图详解.doc
  14. 智能优化算法——布谷鸟搜索算法原理(附代码)
  15. Android 读取assets文件中的文件
  16. 信奥中的数学:卷积、傅立叶变换
  17. 新浪微博用户兴趣建模系统架构
  18. 自学python怎么找工作-我是如何在自学编程9个月后找到工作的
  19. 做自媒体视频剪辑怎么赚钱呢?
  20. 功率型热敏电阻(NTC)的主要参数及深入介绍

热门文章

  1. centos6_grub故障修复
  2. 四键/4键4路4通道 低功耗抗干扰/抗噪触摸触控IC-VK3604A/B SOP/TSSOP16,适用触摸开关/触控面板/电子秤/家电等,抗干扰能力强
  3. java核心知识点总结篇-JVM篇
  4. 高速传输线的设计及仿真流程
  5. 由于协议错误,会话将被中断。请重新连接到远程计算机
  6. 如何测试流媒体服务器的并发能力?
  7. 百度AI车辆图像识别JavaSDK使用原来这么简单?
  8. typedef的用法——c语言
  9. iOS开发-苹果热更新方案简介
  10. 【ARCGIS矢量化操作相关】