兴趣学C:三子棋小游戏
前言
相信大家在学习C语言的过程中,有时会感觉到有一些枯燥切乏味,今天就在这里教大家用C语言实现一个简单的小游戏三子棋,这个项目不需要很多的基础,只要学到了数组便可以实现,让我们在学习C语言的过程中可以获得更大的乐趣
新建工程
此次工程分为三个文件来进行实现
分别为
新建头文件 game.h(用于进行函数声明,引用头文件)
新建源文件 game.c(游戏接口函数的实现)
test.c(用于测试接口函数功能,主函数)
如下图所示
游戏逻辑分析
首先,这个游戏是由玩家和电脑进行对局,玩家下棋后再由电脑下,当有任意一行三子连成一条线的时候便游戏结束判断胜利,因此在每一次落子之后便要进行判断胜负,若不分胜负,则平局,平局的判断条件便是当棋盘上的所有格子都有落子,但并没有三个连在一起的棋子。
游戏实现
三子棋是一个比较简单的游戏,所以游戏实现也比较的简单。
菜单
首先,在打开一个程序之后,首先映入眼帘的便是程序的主菜单,
//菜单界面
void menu()
{printf("*********************\n");printf("********1.play*******\n");printf("********2.exit*******\n");printf("*********************\n");
}
//定义菜单枚举变量
enum menu
{PLAY = 1,EXIT
};
设计棋盘
在这个比较基础性的游戏中,没有引用界面库,是通过键盘输入进行游戏,所以我们要用字符来组成一个棋盘,用一个3x3的数组来存放棋子,
棋盘样式| |
-----|-----|-----| |
-----|-----|-----| |
//打印棋盘
void playboard(char board[ROW][COL])
{int i, j;for (i = 0; i < COL; i++){for (j = 0; j < ROW; j++){printf(" %c ", board[i][j]);if (j != ROW - 1)printf("|");}printf("\n");for (j = 0; j < ROW; j++){if (i != COL - 1)printf("-----");if (j != ROW - 1&& i != COL - 1)printf("|");}printf("\n");}
}
初始化棋子
在设计棋盘时我们将棋子设置成为了一个3x3的二维数组,在没有任何落子的时候所显示的效果是空白的,所以我们要将一开始的棋子都初始化为空格,下面为初始化棋子的代码实现
//初始化棋子
void IniBoard(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)for (j = 0; j < ROW; j++)board[i][j] = ' ';
}
实现落子
在三子棋中我们将’o‘的落子设置为玩家,’x‘设置为电脑落子,在输入想要落子对应的坐标后,便改变对应的变量为所落的棋子,并判断输入的坐标是否符合要求,在界定范围内,也没有下过棋子,以下分别为玩家和电脑落子的代码实现
//玩家下
void playermove(char board[COL][ROW])
{int x, y;do{printf("请选择您要下的的坐标(格式:行 列)\n");scanf("%d%d", &x, &y);if (x > 0 && x <= COL && y > 0 && y <= ROW && board[x-1][y-1] == ' '){board[x - 1][y - 1] = 'o';break;}elseprintf("坐标非法,请重新输入\n");} while (1);
}
//电脑下
void computermove(char board[COL][ROW])
{do{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = 'x';break;}} while (1);
}
判断胜负
在三子棋中每一次落子可能都会决出胜负,为了简化代码提高运行效率,我们以不同的返回值来判断一次落子后胜负,返回'o'则玩家胜利,返回'x'则电脑胜利,返回'D'平局,'C'继续游戏,以下便是判断函数的代码实现。
//判断胜负
char judge(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)if ((board[0][i] == board[1][i] && board[1][i] == board[2][i])|| (board[i][0] == board[i][1] && board[i][1] == board[i][2]))return board[1][i];if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))return board[1][1];for(i=0;i<ROW;i++)for (j = 0; j < COL; j++){if (board[i][j] == ' ')return 'C';}return 'D';
}
整合接口函数实现游戏
在所需要的接口函数全部实现后,便可以实现整个游戏,写入test.c源文件中进行测试,将游戏的流程整合实现,代码如下。
#include"game.h"
int main()
{srand((unsigned)time(NULL));int input;do{menu();scanf("%d", &input);switch (input){case PLAY:game(); break;case EXIT:break;default:printf("非法输入,请重新输入\n");Sleep(1000);system("cls");break;}} while (input != 2);return 0;
}
源代码展示
game.c
#include"game.h"
//游戏菜单
void menu()
{printf("*********************\n");printf("********1.play*******\n");printf("********2.exit*******\n");printf("*********************\n");
}
//游戏
void game()
{char ret;system("cls");char board[COL][ROW];IniBoard(board);playboard(board);do {playermove(board);playboard(board);ret = judge(board);if (ret == 'o'){printf("玩家胜利\n");system("cls");break;}else if(ret=='D'){printf("平局\n");break;}system("cls");computermove(board);playboard(board);ret = judge(board);if (ret == 'x'){printf("电脑胜利\n");system("cls");break;}else if (ret == 'D'){printf("平局\n");break;}} while (1);}
//初始化棋盘
void IniBoard(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)for (j = 0; j < ROW; j++)board[i][j] = ' ';
}
//打印棋盘
// | |
//-----|-----|-----
// | |
//-----|-----|-----
// | |
void playboard(char board[ROW][COL])
{int i, j;for (i = 0; i < COL; i++){for (j = 0; j < ROW; j++){printf(" %c ", board[i][j]);if (j != ROW - 1)printf("|");}printf("\n");for (j = 0; j < ROW; j++){if (i != COL - 1)printf("-----");if (j != ROW - 1&& i != COL - 1)printf("|");}printf("\n");}
}
//玩家下
void playermove(char board[COL][ROW])
{int x, y;do{printf("请选择您要下的的坐标(格式:行 列)\n");scanf("%d%d", &x, &y);if (x > 0 && x <= COL && y > 0 && y <= ROW && board[x-1][y-1] == ' '){board[x - 1][y - 1] = 'o';break;}elseprintf("坐标非法,请重新输入\n");} while (1);
}
//电脑下
void computermove(char board[COL][ROW])
{do{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = 'x';break;}} while (1);
}
//判断胜负
char judge(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)if ((board[0][i] == board[1][i] && board[1][i] == board[2][i])|| (board[i][0] == board[i][1] && board[i][1] == board[i][2]))return board[1][i];if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))return board[1][1];for(i=0;i<ROW;i++)for (j = 0; j < COL; j++){if (board[i][j] == ' ')return 'C';}return 'D';
}
test.c
#include"game.h"
int main()
{srand((unsigned)time(NULL));int input;do{menu();scanf("%d", &input);switch (input){case PLAY:game(); break;case EXIT:break;default:printf("非法输入,请重新输入\n");Sleep(1000);system("cls");break;}} while (input != 2);return 0;
}
game.h
#include<stdio.h>
#include<Windows.h>
#include<time.h>
#define ROW 3
#define COL 3
//定义菜单枚举变量
enum menu
{PLAY = 1,EXIT
};
void menu();
void game();
void IniBoard(char* board);
void playboard(char* board);
void playermove(char board[ROW][COL]);
void computermove(char board[ROW][COL]);
char judge(char board[COL][ROW]);
结尾
此次我们实现了一个简单的小游戏,虽然这个游戏的AI比较蠢,但是却可以让我们在学习C语言的过程中提供给我们更多更丰富的乐趣,学习编程的过程中也是有很多乐趣的。
兴趣学C:三子棋小游戏相关推荐
- C语言实现三子棋小游戏(编程思路以及代码详解)
目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...
- C语言小项目--三子棋小游戏
学了这么长时间的C语言,你是否觉得没有一个没写过稍微长点的代码显得很没有成就感!不怕,今天带你做一个小游戏,领略一下写C和小游戏的快乐.写完记得给自己一个鼓励哦! 一.三子棋小游戏 想必大家都玩过三子 ...
- 三子棋小游戏带你走进编程世界(c语言版)
目录 一.游戏实现的整体思路 二.实现游戏大体框架 二.游戏函数的实现 1.初始化键盘 2.打印棋盘 3.下棋及胜负判断 (1)玩家下棋 (2)电脑下棋 (3)判断输赢 三.结语及源码 三子棋想必大家 ...
- 三子棋小游戏(超详细)
目录 一.实现三子棋游戏的基本逻辑 二.具体的函数实现 1. 菜单函数 2. 棋盘的实现 2.1 棋盘的初始化 2.2 棋盘的打印 3. 玩家下棋 4. 电脑下棋 5.判断棋盘状态 三. 三个文件 3 ...
- 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)
作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...
- 使用C语言编写三子棋小游戏
使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...
- 如何制作三子棋小游戏
首先,一个游戏的制作,必须由大化小,分步完成. 当我们想要制作三子棋小游戏时,必须先搞清楚这个小游戏的逻辑和原理. 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋 ...
- vs2010c语言小游戏,用C语言写一个三子棋小游戏(用VS2010实现,加强版)
前几天写了一个三子棋小游戏,但是比较简单,因为以前写的游戏棋盘只能是3x3那么大.今天对那个程序做了两点改进: 1.现在可以实现在任意大小的棋盘上下棋了. 2.因为棋盘可能变大,为了玩家方便确定坐标, ...
- 呆头呆脑的电脑----三子棋小游戏(C语言版)
目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...
最新文章
- 微信小程序自定义组件Component的简单使用
- highcharts常用配置说明
- 机器学习(三)聚类深度讲解
- Bootstrap的学习
- 怎么用计算机画正弦函数图像,几何画板如何绘制正弦函数图象
- 存放在外存上的数据关机后_小鑫话题 | 惊了!关机后SSD会丢数据?
- zuul网关找不到服务_网关zuul中对所有下游服务权限做控制zuulauth
- java框架----mybatis的使用(一)
- iPhone上编辑html,在iphone上重新格式化一个简单的html页面
- 计算机显示屏幕会对人体产生,一种自动除尘功能的计算机显示屏专利_专利申请于2018-07-13_专利查询 - 天眼查...
- 计算机控制系统的框图,计算机控制系统原理框图.doc
- abaqus如何并行计算_Abaqus软件与并行计算的硬件配置
- 打印机上的一款驱动-惠普LaserJet1020Plus打印机驱动提供下载
- unity3d 模型从上到下出现(shader)
- iTween基础之Move(移动)
- 2011年华为企业业务的15件大事
- 丁子高曝爱子长相似父母混合体 坦言:脸型像我
- 超声波测距仪编程_北邮小学期pic单片机-超声波测距仪实验报告(附代码).docx
- 计算机键盘上切换账户怎么办,笔记本切换小键盘,详细教您笔记本小键盘怎么切换...
- layer 上传图片点击取消仍在加载_layer 点击弹出图片