三子棋游戏

  • 游戏逻辑
  • 构建游戏基本框架
  • 初始化和打印棋盘
  • 玩家和电脑进行下棋
  • 判断棋局状态
  • 三子棋游戏的最终代码
    • 只需要ROW COL改为5就可变为5子棋

游戏逻辑

游戏效果图

1.游戏要有一个棋盘,棋盘中要有

  • ’ ’ -空格代表无棋子
  • ‘*’-代表玩家下
  • ‘#’-代表电脑下

所以应该先初始化棋盘为空格将棋盘中的数据存储在数组中。
2.要设计玩家走和电脑走分别将落子存储在数组中,并且玩家走时要注意是从1~3,存到数组的下标为 0~2,注意存储时-1;
3.判断输赢还是平局继续,分别判断行列和主对角线和次对角线

4.可以重复玩三子棋游戏

构建游戏基本框架

要有菜单而且可以重复玩,
选1开始游戏
选0退出游戏
选其他数字选择错误请重新选择

#include<stdio.h>
void menu()
{printf("**************************************\n");printf("**********  1.play  0.exit  **********\n");printf("**************************************\n");
}
int main()
{int input = 0;//判断是否进行游戏do{menu();printf("请选择;>");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");//这里只是进行测试进行游戏时会设计game()函数break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}


这是游戏的基本框架,接下来会把printf(“开始游戏\n”);替换成game()函数进行游戏设计

初始化和打印棋盘

我们先定义一个存储棋盘数据的数组board[ROW][COL];

  • ROW-棋盘行数
  • COL-棋盘列数
  • 用宏来定义ROW COL的值

初始化棋盘把棋盘数据初始化为0
打印棋盘

  • 每行有 board[][] |(其中|在一行中出现COL-1个)
  • 两行之间— |(其中|在一行中出现COL-1个,两行之间的只有COL-1行)
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}
}
void game()
{char board[ROW][COL];InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);
}

玩家和电脑进行下棋

玩家走时

  • 要注意是从1~3,存到数组的下标为 0~2,注意存储时行列减去1;
  • 判断是否在棋盘范围内,不在范围内就不能下。
  • 判断下棋位置是否有棋子,有棋子就不能下。

电脑走时

  • 设计随机横纵坐标。(rand()函数生成随机数,srand()函数生成随机起点)
  • 横纵坐标范围应该在0~ROW-1,0~COL-1.
  • 如果生成随机数坐标下有棋子,那就再随机生成一个。

在main函数内部do while语句前面加上srand((unsigned)time(NULL));保证具有随机生成起点

void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while(1){printf("玩家下;>");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");}}}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;}}
}
void game()
{char board[ROW][COL];InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);while (1){PlayerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);}
}

已经设计好了玩家和电脑下棋,但是下满了电脑下就陷入了死循环,那是因为没有判断棋局状态的函数,

判断棋局状态

棋局输赢平局还是继续的判断返回值

  • ‘*’ - 返回此字符表示玩家赢

  • ‘#’ - 返回此字符表示电脑赢

  • ‘C’ - 返回此字符表示继续游戏

  • ‘Q’ - 返回此字符表示平局

  • 判断哪方输赢用行判断和列判断对角线判断,只要有判断的坐标有‘ ’就一定没有人在此行列或者对角线赢,若判断完后是有一方输赢,那就返回该次判断过的随机一个坐标的符号

  • 若判断没有那方输赢就该判断哪一方平局或者继续下棋,只需要设计一个函数IsHFull()函数若棋盘满了返回1 - 平局,棋盘未满返回0 - 继续下棋

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;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col-1; j++){if (board[i][j] != board[i][j + 1]||board[i][j]==' '){break;}}if (j == col - 1){return board[i][j];}}for (j = 0; j < col; j++){for (i = 0; i < col - 1; i++){if (board[i][j] != board[i][j + 1] || board[i][j] == ' '){break;}}if (i == col - 1){return board[i][j];}}//斜对角线 主对角线for (i = 0,j=0; i < row-1&&j<col-1; i++,j++){if (board[i][j] != board[i + 1][j + 1] || board[i][j] != ' '){break;}if (i == row - 1 || j == col - 1){return board[i][j];}}for (i = 0, j = col-1; i < row - 1 && j >0 ; i++, j--){if (board[i][j] != board[i + 1][j - 1] || board[i][j] != ' '){break;}if (i == row - 1 || j == 0){return board[i][j];}}//判断是否平局if (IsFull(board, ROW, COL)){return 'Q';}return 'C';
}

game()函数中,通过判断棋局状态的函数通过每次玩家下和电脑下后都调用函数然后用ret接收返回值,如果不是继续就继续下棋,是的话就跳出循环通过ret来输出棋局结果到显示器上。

void game()
{char board[ROW][COL];InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);int ret = 0;while (1){PlayerMove(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);}if (ret == '*'){printf("玩家赢\n");}if (ret == '#'){printf("电脑赢\n");}if (ret == 'Q'){printf("平局\n");}DisplayBoard(board, ROW, COL);
}

三子棋游戏的最终代码

将这一个游戏分成在三个文件中编写

  • test.c 用来编写函数主要逻辑
  • game.h 用来存放游戏功能函数名
  • game.c 用来编写游戏功能函数

test.c

#include"game.h"
void menu()
{printf("**************************************\n");printf("**********  1.play  0.exit  **********\n");printf("**************************************\n");
}
void game()
{char board[ROW][COL];InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);int ret = 0;while (1){PlayerMove(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);ComputerMove(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C'){break;}DisplayBoard(board, ROW, COL);}if (ret == '*'){printf("玩家赢\n");}if (ret == '#'){printf("电脑赢\n");}if (ret == 'Q'){printf("平局\n");}DisplayBoard(board, ROW, COL);
}
int main()
{int input = 0;srand((unsigned)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误请重新选择\n");break;}} while (input);return 0;
}

game.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3void 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);

game.c

#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}}printf("\n");}
}void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while(1){printf("玩家下;>");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");}}
}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;int j = 0;for (i = 0; i < row; i++){     for (j = 0; j < col-1; j++){if (board[i][j] != board[i][j + 1]||board[i][j]==' '){break;}}if (j == col - 1){return board[i][j];}}for (j = 0; j < col; j++){for (i = 0; i < col - 1; i++){if (board[i][j] != board[i][j + 1] || board[i][j] == ' '){break;}}if (i == col - 1){return board[i][j];}}//斜对角线 主对角线for (i = 0,j=0; i < row-1&&j<col-1; i++,j++){if (board[i][j] != board[i + 1][j + 1] || board[i][j] != ' '){break;}if (i == row - 1 || j == col - 1){return board[i][j];}}for (i = 0, j = col-1; i < row - 1 && j >0 ; i++, j--){if (board[i][j] != board[i + 1][j - 1] || board[i][j] != ' '){break;}if (i == row - 1 || j == 0){return board[i][j];}}  //判断是否平局if (IsFull(board, ROW, COL)){return 'Q';}return 'C';
}

只需要ROW COL改为5就可变为5子棋

三子棋小游戏(经过轻微改编可变为五子棋)相关推荐

  1. 三子棋小游戏(超详细)

    目录 一.实现三子棋游戏的基本逻辑 二.具体的函数实现 1. 菜单函数 2. 棋盘的实现 2.1 棋盘的初始化 2.2 棋盘的打印 3. 玩家下棋 4. 电脑下棋 5.判断棋盘状态 三. 三个文件 3 ...

  2. 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)

    作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...

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

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

  4. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

  5. 如何制作三子棋小游戏

    首先,一个游戏的制作,必须由大化小,分步完成. 当我们想要制作三子棋小游戏时,必须先搞清楚这个小游戏的逻辑和原理. 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋 ...

  6. C语言小项目--三子棋小游戏

    学了这么长时间的C语言,你是否觉得没有一个没写过稍微长点的代码显得很没有成就感!不怕,今天带你做一个小游戏,领略一下写C和小游戏的快乐.写完记得给自己一个鼓励哦! 一.三子棋小游戏 想必大家都玩过三子 ...

  7. vs2010c语言小游戏,用C语言写一个三子棋小游戏(用VS2010实现,加强版)

    前几天写了一个三子棋小游戏,但是比较简单,因为以前写的游戏棋盘只能是3x3那么大.今天对那个程序做了两点改进: 1.现在可以实现在任意大小的棋盘上下棋了. 2.因为棋盘可能变大,为了玩家方便确定坐标, ...

  8. 呆头呆脑的电脑----三子棋小游戏(C语言版)

    目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...

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

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

  10. 三子棋小游戏带你走进编程世界(c语言版)

    目录 一.游戏实现的整体思路 二.实现游戏大体框架 二.游戏函数的实现 1.初始化键盘 2.打印棋盘 3.下棋及胜负判断 (1)玩家下棋 (2)电脑下棋 (3)判断输赢 三.结语及源码 三子棋想必大家 ...

最新文章

  1. 活动报名 | 智源重大研究方向“人工智能的认知神经基础”发布会
  2. Java面试题整理,连续四年百度Java岗必问面试题
  3. 算法学习:计算几何旋转卡壳
  4. VC++程序开机自启动(注册表上注册)
  5. TabLayout实现顶部导航栏(1)
  6. Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数
  7. c语言程序设计课件第二章,c语言程序设计课件张元国 ISBN9787566300386 PPT第二章数据类型 运算符与表达式...
  8. C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)
  9. 有几百万的房子,也吃不起西贝,感觉像在交税…….
  10. Delphi WebBrowser控件的使用
  11. 站在知乎肩上-做更强的自己(2)
  12. C语言 基础的数学思维题
  13. java kafka面试题_八年面试生涯,整理了一套Kafka面试题
  14. 解决电脑系统重装后出现多引导项的问题
  15. Windows Server 2016 实现跨域、跨林之间的访问
  16. 解决Unity3D提示‘Newtonsoft‘could not be found
  17. IPFS技术系列之IPFS底层基础
  18. 哪个dns服务器延迟最低,可以立即测出延迟最小的DNS
  19. 单片机期末实训---- 密码锁和交通灯
  20. koa2.x--art-template

热门文章

  1. Android OpenGL ES 3.0 粒子特效
  2. 微信设置文字大小影响网页布局
  3. 计算机课拔线头检讨书,电脑显示器上出现检测信号线应该怎么解决?
  4. 观影《超时空接触》有感
  5. charging hw bq25601充电驱动笔记
  6. 手机游戏显示服务器异常,手机玩游戏是云服务器异常
  7. 1药网用户暴增500% 声网助力打造高质量视频问诊服务
  8. 今日头条一个身份证可以注册几个头条号
  9. 【基于微信的物品回收小程序的设计与实现】
  10. SAP 采购合同案例教程后台配置