目录

1、需求分析

2、程序架构

3、代码实现(分函数呈现)

(1)主函数代码实现

分析:

异常处理:

(2)菜单函数的实现

分析:

(3)游戏函数的实现

分析:

(4)棋盘的初始化

分析:

(5)棋盘展示代码实现

分析:

(6)玩家下棋

分析:

异常处理:

(7)电脑下棋

分析:

(8)判断是否结束

分析:

(9)判断谁获胜

分析:

(10)特别说明

4、代码实现(总代码)

test.c代码

game.c代码

game.h代码


1、需求分析

需求:通过C语言实现三子棋小游戏。

注:由于作者水平有限,只能将计算机下棋设定为随机下棋,所以看起来略显呆笨,并且程序中也没有采用图像界面的方式,敬请谅解!

2、程序架构

程序分为test.c、game.c两个源文件和game.h一个头文件。

test.c:主函数接口引入。

game.c:游戏的相关函数实现。

game.h:头文件引入、函数声明。

3、代码实现(分函数呈现)

(1)主函数代码实现

int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:->");scanf("%d", &input);system("cls");switch (input){case 1:game();break;case 0:
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:->");scanf("%d", &input);system("cls");switch (input){case 1:game();break;case 0:printf("已退出!\n");break;default:break;}} while (input);return 0;
}break;default:break;}} while (input);return 0;
}

分析:

1.主函数主要是引入了随机种子(后续计算机下棋时会用到),并且通过switch()提供了游戏的接口,让玩家可以通过输入1开始游戏或者通过输入0结束游戏。

2.为了让用户能够多次进行游戏,采用了do while死循环的方式,同时,采用while语句的另一个原因就是可以利用该语句程序执行语句比条件表达式执行多一次的特点,来让玩家无论是否玩游戏,打开后先看到的是菜单。

异常处理:

在主函数中对于用户输入非0和非1的数字采用了重新进入循环的方式。

(2)菜单函数的实现

void menu()
{printf("*************************\n");printf("*******  1.play  ********\n");printf("*******  0.exit  ********\n");printf("*************************\n");
}

分析:

利用简单的printf语句进行输出即可将菜单呈现给玩家。(注意不要忘记'\n\进行换行操作)

(3)游戏函数的实现

//游戏函数
void game()
{char board[ROW][COL] = { 0 };Init_board(board, ROW, COL);//棋盘初始化Display_board(board, ROW, COL);//棋盘展示while (1){player_board(board, ROW, COL);//玩家下棋Display_board(board, ROW, COL);//棋盘展示printf("\n");if (is_end(board, ROW, COL) != 'c'){is_win(is_end(board, ROW, COL));break;}computer_board(board, ROW, COL);//电脑下棋Display_board(board, ROW, COL);//棋盘展示printf("\n");if (is_end(board, ROW, COL) != 'c'){is_win(is_end(board, ROW, COL));break;}}
}

分析:

1、先定义并初始化存放数据的棋盘(利用二维数组实现)

2、初始化棋盘并展示棋盘

3、玩家下棋,然后电脑下棋,只要有一方获胜就停止游戏,同时在任何一方下完棋后都进行棋盘的呈现。

(4)棋盘的初始化

void Init_board(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] = ' ';}}
}

分析:

利用两个for循环将二维数组的每个元素赋值为空格即可。

(5)棋盘展示代码实现

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

分析:

大家先看成品代码:

具体思路:首先这个地方需要用到双层for循环这是毋庸置疑的,但我们在打印的时候一定要注意,我们在打印一行的每个的时候,前面的元素即前两个形式为   (空格)棋盘元素(空格)(竖线),最后面即第三个元素为(空格)棋盘元素(空格)(换行符),当我们打印完一行带有棋盘的元素后,我们需要打印出分割线,分割线也是通过for循环打印的,思路同上,前两个元素为(下划线)(下划线)(下划线)(竖线),第三个即最后一个元素为(下划线)(下划线)(下划线)(换行符)。

另外需要注意的是最后一行即原本应该打印分割线的位置不需要分割线,所以打印方式为:前两个元素为(空格)(空格)(空格)(竖线)(换行符),与前面相比,少了下划线。

总结来说,就是注意前两个元素或者前两行与最后一个元素或者最后一行的区别即可,此处一样是通过for循环实现。

(6)玩家下棋

void player_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;while (1){int i = 0;int j = 0;printf("请输入下棋位置->");scanf("%d %d", &i, &j);if (i <= row && i >= 1 && j <= col && j >= 1){if (board[i-1][j-1] == ' '){board[i-1][j-1] = '*';break;}else{printf("坐标已有棋,清重新输入!\n");}}else{printf("坐标非法,清重新输入!\n");}}
}

分析:

这个函数中主要是通过对想要下棋的位置判断该位置处有无元素即可,如果没有元素,即可正常下棋。

异常处理:

对输入的棋盘位置数据进行筛选后对于不符合要求的数据或者输入的坐标位置处有棋都会要求玩家重新输入。

(7)电脑下棋

void computer_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;while (1){i = rand() % 3;j = rand() % 3;if (board[i][j] ==' '){board[i][j] = '#';break;}elsecontinue;}
}

分析:

此处利用随机种子生成随机数即可,只要生成的随机的位置处为空白就正常下棋,反之重新生成随机数直到为空白处下棋后停止。

(8)判断是否结束

//判断是否结束
char is_end(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;//行相同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][0];}//列相同for (i = 0; i < col; i++){if (board[0][i] == board[1][i] &&board[1][i]== board[2][i] && board[0][i] != ' ')return board[0][i];}//’\'对角线if (board[0][0] == board[1][1] && board[1][1]== board[2][2] && board[0][0] != ' ')return board[0][0];//'/'对角线if (board[2][0] == board[1][1] == board[0][2] && board[2][0] != ' ')return board[2][0];//未结束for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 'c';}}//平局return '-';
}

分析:

当棋盘并未填满并且玩家与电脑均为未胜利时返回字符'c'说明可以继续,同时根据获胜的要求返回不同的值,当返回字符'*'时玩家获胜,返回'#'说明电脑获胜,返回字符'-'说明平局,返回字符'c'说明可以不符合上面的任意一种条件,可以正常继续。

(9)判断谁获胜

//判断谁获胜
void is_win(char flag)
{if (flag == '*'){printf("玩家获胜!\n");system("pause");system("cls");}else if (flag == '#'){printf("电脑获胜!\n");system("pause");system("cls");}else if (flag == '-'){printf("平局!\n");system("pause");system("cls");}
}

分析:

根据上面判断是否结束的返回时来进行判断并且输出即可。

(10)特别说明

1、代码中使用的system("cls")是清屏命令。system("pause")是使屏幕暂停的命令,按任意键后可以使程序正常进行。这两者均需要引windows.h头文件。

2、生成随机数的函数rand需要引stdlib.h头文件,使用时间戳time()需要引time.h头文件。

4、代码实现(总代码)

test.c代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:->");scanf("%d", &input);system("cls");switch (input){case 1:game();break;case 0:break;default:printf("已退出!\n");break;}} while (input);return 0;
}

game.c代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//菜单实现
void menu()
{printf("*************************\n");printf("*******  1.play  ********\n");printf("*******  0.exit  ********\n");printf("*************************\n");
}
//游戏函数
void game()
{char board[ROW][COL] = { 0 };Init_board(board, ROW, COL);//棋盘初始化Display_board(board, ROW, COL);//棋盘展示while (1){player_board(board, ROW, COL);//玩家下棋Display_board(board, ROW, COL);//棋盘展示printf("\n");if (is_end(board, ROW, COL) != 'c'){is_win(is_end(board, ROW, COL));break;}computer_board(board, ROW, COL);//电脑下棋Display_board(board, ROW, COL);//棋盘展示printf("\n");if (is_end(board, ROW, COL) != 'c'){is_win(is_end(board, ROW, COL));break;}}
}
//棋盘初始化
void Init_board(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 Display_board(char board[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){if (j < col - 1)printf(" %c |", board[i][j]);elseprintf(" %c \n", board[i][j]);}if (i < row-1 ){for (int j = 0; j < col; j++){if (j < col - 1)printf("___|");elseprintf("___\n");}}else{for (int j = 0; j < col; j++){if (j < col - 1)printf("   |");elseprintf("   \n");}}}
}
//玩家下棋
void player_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;while (1){int i = 0;int j = 0;printf("请输入下棋位置->");scanf("%d %d", &i, &j);if (i <= row && i >= 1 && j <= col && j >= 1){if (board[i-1][j-1] == ' '){board[i-1][j-1] = '*';break;}else{printf("坐标已有棋,清重新输入!\n");}}else{printf("坐标非法,清重新输入!\n");}}
}
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;while (1){i = rand() % 3;j = rand() % 3;if (board[i][j] ==' '){board[i][j] = '#';break;}elsecontinue;}}//判断是否结束
char is_end(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;//行相同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][0];}//列相同for (i = 0; i < col; i++){if (board[0][i] == board[1][i] &&board[1][i]== board[2][i] && board[0][i] != ' ')return board[0][i];}//’\'对角线if (board[0][0] == board[1][1] && board[1][1]== board[2][2] && board[0][0] != ' ')return board[0][0];//'/'对角线if (board[2][0] == board[1][1] == board[0][2] && board[2][0] != ' ')return board[2][0];//未结束for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 'c';}}//平局return '-';
}
//判断谁获胜
void is_win(char flag)
{if (flag == '*'){printf("玩家获胜!\n");system("pause");system("cls");}else if (flag == '#'){printf("电脑获胜!\n");system("pause");system("cls");}else if (flag == '-'){printf("平局!\n");system("pause");system("cls");}
}

game.h代码

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#define ROW 3
#define COL 3
//菜单函数声明
void menu();
//游戏函数声明
void game();
//棋盘初始化函数声明
void Init_board(char board[ROW][COL], int row, int col);
//棋盘展示函数声明
void Display_board(char board[ROW][COL], int row, int col);
//玩家下棋函数声明
void player_board(char board[ROW][COL], int row, int col);
//电脑下棋函数声明
void computer_board(char board[ROW][COL],int row,int col);
//判断是否结束函数声明
char is_end(char board[ROW][COL], int row, int col);
//判断谁获胜函数声明
void is_win(char flag);

呆头呆脑的电脑----三子棋小游戏(C语言版)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 三子棋小游戏思路及代码实现的详解

    标题:猜数字小游戏 作者:@Ggggggtm 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 文章目录: 一.三子棋小游戏的简单介绍 二.三子棋的思路及代码实现 1.打印游戏菜单 2. ...

最新文章

  1. SIP协议的传输层原理报文解析(解读rfc3581)(待排版)
  2. 【转】:Andriod开发环境搭建 (1)
  3. LeetCode 421. 数组中两个数的最大异或值(Trie树)
  4. 会议交流 | CAAI BDSC2021大会专题七:社会计算与开放知识图谱
  5. MySQL故障检测_mysql主从故障检测处理脚本
  6. 大数据技术周报第 007 期
  7. ffmpeg视频播放流程
  8. java中Assert使用
  9. 第I题-生理周期(简单解法跳着试)====人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,
  10. 系统调用跟我学(4)
  11. lcd开机流程图_LCD1602初始化流程图及程序的两种方法
  12. codeforces——962
  13. opencv录制视频 python_OpenCV Python 录制视频
  14. 技嘉H510M H主板安装gtx660折腾记录
  15. RelativeLayout.LayoutParams.addRule()方法
  16. Linux下安装anaconda
  17. Linux防火墙之iptables
  18. 机器学习数学知识补习——梯度下降(Gradient Descent)
  19. java语言不用pow函数求x的n次方_【算法】自己实现x的n次幂(pow函数)
  20. 运维专用英文单词(1)

热门文章

  1. 头条巨量快手广点通等平台APPAPI回传事件注册激活-转化联调-API对接原理代码分析和功能实现
  2. autojs获取QQ群成员列表里的群员数据,免root脚本源码分享
  3. 11亿资金助力, 微软、三星、摩根大通多数巨头加持, 枝繁叶茂的它凭什么被低估?...
  4. jenkins搭建教程及使用ant对非maven的javaweb项目进行打包发布到远程tomcat服务器
  5. 你想了解的教师资格证那些事都在这里...
  6. .net ,blog
  7. 技术部工作中常见问题(o_company)
  8. fcpx瘦身插件_FCPX常用插件合集
  9. 哈工大计算机博士税后工资+副业月入3W+的经验宝典都总结到这几个公众号了
  10. 机械制图:直线的投影