三子棋

当我们学习了数组之后,我们就可以利用所学的知识来写一个三子棋的小游戏。
首先我们将建立两个.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语言写三子棋,冲冲冲!相关推荐

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

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

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

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

  3. C语言实现三子棋小游戏(源码+教程)

    我猜中了开头,却猜不到这结局.--<大话西游> 目录 1.设计框架 2.设计流程 2.1菜单 2.2初始化棋子 2.3初始化棋盘 2.4玩家输入落子的坐标 2.5电脑随机生成棋子 2.6判 ...

  4. 详细解读:C语言实现三子棋

    目录: 一.说明 二.多文件创建 三.设计思路 四.代码实现 五.总体代码 六.总结 一.说明 随着我们对C语言学习的逐渐深入,我们可以实现一些简单的小游戏,本文将会介绍C语言实现三子棋小游戏,通过本 ...

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

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

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

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

  7. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  8. 用C语言实现三子棋小游戏(C语言菜单创建--设置光标,隐藏光标)

    文章目录 前言 一.菜单设置 二.三子棋游戏 1.各部分代码 2.运行结果 总结 前言 本文主要用C语言实现三子棋(简易版)小游戏,同时介绍C语言中的菜单设置. 一.菜单设置 我们在C语言中设置菜单一 ...

  9. 趣讲用c语言实现三子棋小游戏

    目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...

最新文章

  1. 用GDB调试程序(五)
  2. linux 系统kill用法
  3. Redis:redis和memcached 比较
  4. USB3.0超高速接口应用方案
  5. python接入excel_使用python将excel数据导入数据库过程详解
  6. sharedPreferences的用法
  7. .NET异步编程总结----四种实现模式
  8. Scrum板与Kanban如何抉择?敏捷工具:ohagnfs板与按照kdxchyowcz
  9. Unity 安装Vuforia配置Android时遇到的问题及解决
  10. 银联扫码支付java,银联商务扫码支付-被扫业务
  11. Nitrux安装JDK-10(Linux通用)教程
  12. Date对象之获取和设置月份getMonthsetMonth
  13. Git基本知识和常用命令(IDEA)
  14. python搬家具_Python面向对象实现案例———摆放家具
  15. 程序人生,心态变化!
  16. Tensorflow(八) —— Tensor的合并与切割
  17. NSString中的rangeOfString
  18. Oracle索引的理解
  19. 多个域名指向同一个网站实现方法
  20. 在html登陆页面代码中添加背景图片,为什么找不到图片放置的位置

热门文章

  1. 渐渐逝去的青春---老男孩
  2. Linux网卡应用程序测试
  3. 抖音短视频运营借势热点:有哪些热点渠道,有哪些热点改编的套路。
  4. 计算机组策略主要功能,组策略概述
  5. 2020-08-31
  6. python 编程入门学习基础
  7. 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读(经典)
  8. 海尔简爱s11怎么进入bios_海尔简爱S11笔记本安装win10系统操作方法
  9. 微信小程序点击查看大图
  10. 叠氮试剂79598-53-1,6-Azidohexanoic Acid,6-叠氮基己酸,末端羧酸可与伯胺基反应