C语言写三子棋,冲冲冲!
三子棋
当我们学习了数组之后,我们就可以利用所学的知识来写一个三子棋的小游戏。
首先我们将建立两个.c文件和一个.h文件,以便代码逻辑清晰和方便修改,如下图,
首先在tic-tac-toe.c文件中建立大概的逻辑关系链,如下图:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("***********************\n");printf("****** 1.play *******\n");printf("****** 0.exit *******\n");printf("***********************\n");
}//打印菜单
int main()
{int input;srand((unsigned int)time(NULL));//设置一个随机数起点,为电脑随机下棋做准备do{menu();printf("Please input 1/0\n");scanf("%d",&input);switch (input){case 1:game();//游戏主函数break;case 0:printf("Exitgame\n");break;default:printf("Input error,please input again\n");break;}} while (input);
}
这个游戏的主要思想是利用数组来储存棋子,然后遍历打印。
因为需要重复游玩,所以放进do while 循环中,且while的判别条件中0为假,非0为真,所以只有input=0时才能退出游戏。
那我们再来看一下game.h中所引用的函数名及其大概的作用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3void init(int arr[ROW][COL], int row, int col);//初始化数组
void printborad(int arr[ROW][COL], int row, int col);//打印棋盘和棋子
void playermove(int arr[ROW][COL], int row, int col);//玩家移动
void computermove(int arr[ROW][COL], int row, int col);//电脑移动
int checkwin(int arr[ROW][COL], int row, int col);//检查游戏是否结束
void game();//游戏主函数
最后我们再来看一下这个工程中最为重要的game.c的实现。
void game()
{int arr[ROW][COL];int num = 0;init(arr, ROW, COL);//初始化棋子printborad(arr, ROW, COL);//打印棋盘和棋子do{playermove(arr, ROW, COL);//玩家移动computermove(arr, ROW, COL);//电脑移动num = checkwin(arr, ROW, COL);//检查是否完成游戏} while (num == 0);switch (num){case 1:printf("You win\n");printborad(arr, ROW, COL);break;case 2:printf("You lose\n");printborad(arr, ROW, COL);break;case 3:printf("it ends in a draw\n");printborad(arr, ROW, COL);}}
那我们就一步一步来,首先是初始化函数init()
void init(int arr[ROW][COL], int row, int col)
{int i = 0;for (; i < ROW; i++){int j = 0;for (; j < COL; j++){arr[i][j] = ' ';}}
}//遍历数组来初始化数组
初始化之后,就开始打印棋盘和空棋子print()
void printborad(int arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", arr[i][j]);if (j != col - 1)printf("|");//以“ %c |”为一组,但是最后一组的“|”不打印}printf("\n");if (i != row - 1)printf("-----------\n");//最后一组的分割线不打印}}
结果如下图
打印之后开始由playermove储存玩家的棋子,棋子是“ * ”,然后用printborad函数打印出来让玩家看到
void playermove(int arr[ROW][COL], int row, int col)
{printf("Player move,please input your coordinate\n");int x, y;printf("Please input : ");scanf("%d%d", &x, &y);arr[x - 1][y - 1] = '*';//考虑到玩家会将数组的第一个元素看成[1][1],所以写成x-1,y-1printborad(arr, ROW, COL);
}
同理,用computermove函数储存电脑随机下的棋子
void computermove(int arr[ROW][COL], int row, int col)
{int x, y;printf("Computer move :\n");while (1){x = rand() % row;y = rand() % col;//产生随机数x,yif (arr[x][y] == ' '){arr[x][y] = '#';break;}}printborad(arr, ROW, COL);}
最后进行比较难的检查函数
检查函数主要分为五部分
第一部分,检查每行是否满足
int checkwin(int arr[ROW][COL], int row, int col)
{int win = 3;//3可以先初始化为平局需要的数字,然后再根据下面的判断条件来修改int ret = 2;int i = 0;for (; i < ROW; i++){if (arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2] && arr[i][0] != ' '){if (arr[i][0] == '*'){return win = 1;//玩家赢}elsereturn win = 2;//电脑赢}}//检查每一行是否满足赢得条件
第二部分,检查每一列是否满足
for (i = 0; i < COL; i++){if (arr[0][i] == arr[1][i] && arr[0][i] == arr[2][i] && arr[0][i] != ' '){if (arr[0][i] == '*'){return win = 1;//玩家赢}elsereturn win = 2;//电脑赢}}//检查每一列是否满足
第三部分,检查斜向上的那列是否满足
for (i = 0; i<ROW - 1 ; i++){if (arr[i][i] == arr[i + 1][i + 1]){ret = 1;}}if (arr[0][0]==' '){ret = 0;}if (1== ret){if (arr[i][i] == '*')return win = 1;else if (arr[i][i] == '#')return win = 2;}//检查斜向上的那列是否满足
第四部分,检查斜向下的那列是否满足
int j = 0;for (i = ROW - 1, j = 0; i >= 1 &&j <COL - 1; i--, j++){if (arr[i][j] != arr[i - 1][j + 1]){ret = 1;break;}}if (arr[ROW][0] == ' '){ret = 0;}if (2 == ret){if (arr[ROW/2][COL/2] == '*')return win = 1;else if (arr[ROW/2][COL/2] == '#')return win = 2;}//检查斜向下的那列是否满足
第五部分,检查是否需要继续游戏,即我没赢,电脑也没赢
for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (arr[i][j] == ' ');return win = 0;}}//检查是否需要继续游戏,即上面的代码都不满足,因为上面每个判断代码都含有return,如果满足,就到不了这段代码。所以数组中只要含有" ",就继续游戏return win;
到这,三子棋的代码就完成啦!希望对看到文章的你有帮助。一起加油吧!最后附上一张三子棋的运行图
拜拜!
C语言写三子棋,冲冲冲!相关推荐
- 用C语言实现三子棋游戏(附上思路+项目展示+源代码)
文章目录 前言 一.三子棋游戏整体实现思路 二.实现步骤 分模板实现 (以及具体应用实列) 1.test.c 源文件讲解: 2. game.c 源文件讲解: 3.game.h 源文件讲解 三 game ...
- C语言实现三子棋游戏 代码+思路+电脑下棋算法
C语言实现三子棋游戏 代码+思路+电脑下棋算法 重点: 当检测到电脑已经两子连续时,将会尝试获得胜利. 在检测到玩家即将胜利(连城两子)时,进行拦截 尝试胜利的优先级高于拦截,意味着如果玩家不能再下一 ...
- C语言实现三子棋小游戏(源码+教程)
我猜中了开头,却猜不到这结局.--<大话西游> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化棋子 2.3初始化棋盘 2.4玩家输入落子的坐标 2.5电脑随机生成棋子 2.6判 ...
- 详细解读:C语言实现三子棋
目录: 一.说明 二.多文件创建 三.设计思路 四.代码实现 五.总体代码 六.总结 一.说明 随着我们对C语言学习的逐渐深入,我们可以实现一些简单的小游戏,本文将会介绍C语言实现三子棋小游戏,通过本 ...
- C语言实现三子棋游戏—可扩展到任意N子棋
C语言实现三子棋 游戏介绍 游戏编程思路 游戏代码详解 主函数 游戏菜单函数 游戏逻辑函数 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 完整代码 test.c game_chess.c gam ...
- c语言程序下三子棋,C语言实现三子棋游戏(初级版)
本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...
- 使用C语言编写三子棋小游戏
使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...
- 用C语言实现三子棋小游戏(C语言菜单创建--设置光标,隐藏光标)
文章目录 前言 一.菜单设置 二.三子棋游戏 1.各部分代码 2.运行结果 总结 前言 本文主要用C语言实现三子棋(简易版)小游戏,同时介绍C语言中的菜单设置. 一.菜单设置 我们在C语言中设置菜单一 ...
- 趣讲用c语言实现三子棋小游戏
目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...
最新文章
- 用GDB调试程序(五)
- linux 系统kill用法
- Redis:redis和memcached 比较
- USB3.0超高速接口应用方案
- python接入excel_使用python将excel数据导入数据库过程详解
- sharedPreferences的用法
- .NET异步编程总结----四种实现模式
- Scrum板与Kanban如何抉择?敏捷工具:ohagnfs板与按照kdxchyowcz
- Unity 安装Vuforia配置Android时遇到的问题及解决
- 银联扫码支付java,银联商务扫码支付-被扫业务
- Nitrux安装JDK-10(Linux通用)教程
- Date对象之获取和设置月份getMonthsetMonth
- Git基本知识和常用命令(IDEA)
- python搬家具_Python面向对象实现案例———摆放家具
- 程序人生,心态变化!
- Tensorflow(八) —— Tensor的合并与切割
- NSString中的rangeOfString
- Oracle索引的理解
- 多个域名指向同一个网站实现方法
- 在html登陆页面代码中添加背景图片,为什么找不到图片放置的位置