c语言小游戏----改版斗兽棋
一、项目背景
此游戏是笔者大二第一学期时受好友之托,重拾c语言编写的小程序,这篇文章主要介绍Game中的游主体逻辑部分。程序主体多用if-else,while,for等关键字,适合c语言初学者阅读,若有疑问或bug或建议可评论指出。
二、编程环境
笔者用的是 Visual Studio 2019,调用库有:
#include <iostream>
#include <windows.h>
#include <conio.h>
三、规则介绍
四、程序主体
1、chess结构体
struct chess {int player; // 1 A电脑 2 B人类 0 棋盘int ani; // 8方块 7象(E) 6虎(T) 5狮(L) 4狼(W) 3狗(D) 2猫(C) 1鼠(M) 0空
}Board[Vol * Vol], PlayB;
PlayB使用户控制可以移动的方块棋子,Board是组成棋盘的各个棋子。
player的值代表这个棋子属于哪一方,ani的值代表这个棋子是空还是动物还是方块(方块的player为0)。
2、主要函数:
其中关于UI设计的六个函数分别有着隐藏光标、定位、绘制棋盘、绘制方框、绘制棋子、展示提示的作用;Init部分的三个函数重绘棋盘,让数据初始化,便于重新开始;Game部分的三个函数分别是游戏主体逻辑、比较棋子大小、游戏结束。
3、游戏主体逻辑
(1)结构
可以观察到,当数据初始化完成后,就进入了循环输入反馈的游戏主体中。而根据输入,有三种反馈,分别是方块棋子的移动、空格选中或取消棋子、召唤己方动物。在反馈结束后,根据f(判断棋子互动有无的标志)判断是否进行棋子互动。若达到结束条件,则结束游戏。
(2)小键盘移动
// 上下左右移动
if (ch_1 == -32) {ch_2 = _getch();switch (ch_2) {case 72:y == 1 ? y = Vol : y--; break;case 75:x == 1 ? x = Vol : x--; break;case 80:y == Vol ? y = 1 : y++; break;case 77:x == Vol ? x = 1 : x++; break;default:break;}
在用_getch()(在头文件conio.h)获得上下左右键的键值时候,他们是双键值,会返回高八位和低八位的int型数值。经测试,返回的第一个数值为-32,第二个数值上72左75下80右77。这里采用的是碰壁返回另一边的碰壁逻辑。
(3)空格选中棋子
else if (ch_1 == ' ') {if (PlayB.player == 0) {//手上无棋子,需拿起棋子if (Board[(x - 1) * Vol + y - 1].player == 2) {PlayB.ani = Board[(x - 1) * Vol + y - 1].ani;PlayB.player = Board[(x - 1) * Vol + y - 1].player;Board[(x - 1) * Vol + y - 1].player = Board[(x - 1) * Vol + y - 1].ani = 0;Chess(x, y, PlayB);tips = 4;}}else if (PlayB.player == 2) {if (Board[(x - 1) * Vol + y - 1].player == 2)tips = 5;else if (Board[(x - 1) * Vol + y - 1].player == 0) {Board[(x - 1) * Vol + y - 1].ani = PlayB.ani;Board[(x - 1) * Vol + y - 1].player = PlayB.player;PlayB.ani = 8;PlayB.player = 0;Chess(x, y, PlayB);tips = 6;}else if (Board[(x - 1) * Vol + y - 1].player == 1) {f = PlayB.ani;PlayB.ani = 8;PlayB.player = 0;}}
}
首先判断手上是否有棋子,根据方块棋子的player属性判断其为方块还是己方动物,否则不响应。若为方块,则可以拿起棋子,当落点所属玩家为人类时,落点棋盘上的棋子属性变为空(皆0),手上方块属性变为己方动物属性。若为己方动物,则按下空格视为落子,若落子处为空,则直接落子,与提子为反逻辑;若落子处为敌方动物,则成功落子并进行棋子互动;若落子处为己方动物,则会提示无法落子。
(4)召唤棋子
// 召唤己方棋子
switch (ch_1) {
case 'e':case 'E':Allchess[6] = Allchess[6] > 0 ? Allchess[6] - 1 : -1; f = 7; break;
case 't':case 'T':Allchess[5] = Allchess[5] > 0 ? Allchess[5] - 1 : -1; f = 6; break;
case 'l':case 'L':Allchess[4] = Allchess[4] > 0 ? Allchess[4] - 1 : -1; f = 5; break;
case 'w':case 'W':Allchess[3] = Allchess[3] > 0 ? Allchess[3] - 1 : -1; f = 4; break;
case 'd':case 'D':Allchess[2] = Allchess[2] > 0 ? Allchess[2] - 1 : -1; f = 3; break;
case 'c':case 'C':Allchess[1] = Allchess[1] > 0 ? Allchess[1] - 1 : -1; f = 2; break;
case 'm':case 'M':Allchess[0] = Allchess[0] > 0 ? Allchess[0] - 1 : -1; f = 1; break;
case 'g':case 'G':end = 1; break;
default:break;
}
召唤棋子即召唤手中动物到棋盘上,因手中动物每种各两只,所以需要进行计数处理,并赋值f,进行棋子互动。其中按下G键游戏提前结束。
(5)棋子互动
if (f)
{if (Allchess[f - 1] > -1) {//手上还有棋子吗?if (Board[(x - 1) * Vol + y - 1].player == 1) {//该位置有敌方棋子int flag = Compare(f, Board[(x - 1) * Vol + y - 1].ani);if (flag == 2) { //两子皆亡Achess[Board[(x - 1) * Vol + y - 1].ani - 1]--;Bchess[f - 1]--;Board[(x - 1) * Vol + y - 1].ani = Board[(x - 1) * Vol + y - 1].player = 0;tips = 2;sumA--; sumB--;}else if (flag == 1) {//人类获胜!Achess[Board[(x - 1) * Vol + y - 1].ani - 1]--;Board[(x - 1) * Vol + y - 1].ani = f;Board[(x - 1) * Vol + y - 1].player = 2;tips = 3;sumA--;}else {//电脑获胜Bchess[f - 1]--;tips = 1;sumB--;}}else if (Board[(x - 1) * Vol + y - 1].player == 0) { //该地无棋子Board[(x - 1) * Vol + y - 1].ani = f;Board[(x - 1) * Vol + y - 1].player = 2;tips = 6;}else if (Board[(x - 1) * Vol + y - 1].player == 2) { //该地有己方棋子Allchess[f - 1]++;tips = 5;}}elsetips = 9;f = 0;Chess(x, y, Board[(x - 1) * Vol + y - 1]);
}
棋子互动首先判定手中是否有棋子,若无则f=0,跳出互动;
若手中有棋子,则根据落点棋子player属性互动。若落点棋子为空,则直接落子;若落点棋子为己方棋子,则因该位置已满,无法放入,棋子回到手中,计数器+1;若落点棋子为敌方棋子,则进行比较,有以下三种结果:被吃,吃,同归于尽。同时相应计数器-1。
4、cheat处理及颜色
if (cheat)switch (board.ani) {case 7:printf(RED"E " NONE); break;case 6:printf(RED"T " NONE); break;case 5:printf(RED"L " NONE); break;case 4:printf(RED"W " NONE); break;case 3:printf(RED"D " NONE); break;case 2:printf(RED"C " NONE); break;case 1:printf(RED"M " NONE); break;default:break;}
elseprintf(RED"●" NONE);
若cheat为1,则敌方棋子为已知,否则为未知。(方便测试时用)
加上如下宏定义,可以输出不同颜色的字体:
#define RED "\033[0;32;31m" //字体红色
#define NONE "\033[m" //字体无色
五、结语
难度中规中矩,适合c语言初学者新手上路,该题另有复盘要求:
可作为读者的小练习。代码放在评论区。
c语言小游戏----改版斗兽棋相关推荐
- 小游戏之斗兽棋(uniapp)
前言 最近学习数据结构与算法,但是平常自己要么刷题,要么看书,很是无聊.就想着游戏中一般都会运用大量的算法,所以就开始写游戏来锻炼自己算法这方面的小能力.后面还会持续做其他小游戏,并发布说说自己做的过 ...
- C语言小游戏->井字棋
井字棋想必大家都玩过,今天教大家一个用C语言写一个井字棋小游戏 这个游戏大致可以分为两个部分:游戏菜单和游戏过程. 首先就是创建一个menu()函数来写菜单页面 这里出现了不同指令对应的结果,即输入1 ...
- C语言小游戏快速入门--三子棋
目录 一.前言 二.游戏界面 三.游戏逻辑 1.game.h 2.game.c 3.test.c 四.总结 一.前言 这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来.在这里博主实现的 ...
- 《c语言小游戏》入门级三子棋游戏(机器人加强版)
目录 打印界面 初始化数组的值 玩家下棋 判断是否胜利 电脑下棋 今天为大家带来的是一款非常简单的小游戏"三子棋" 首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听 ...
- C语言小游戏之井字棋
目录 1.游戏菜单 2.实现游戏函数 2.1.初始化棋盘 2.2.打印棋盘 2.3.实现玩家下棋 2.3.实现电脑下棋 2.4.判断输赢 2.5.判断棋盘是否满 2.6.游戏函数 3.完整代码 3 ...
- 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...
斗兽棋android手机版,动物对战棋,回味童年的棋牌休闲游戏,登陆android手机,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的 ...
- 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码
前言 有粉丝说要我出一期Python版本的斗兽棋,今天宠粉狂魔的我不就来啦!! 虽然是一个简单的小游戏,但是对于新手小伙伴来说还是有一定的小难度的哟!要是不理解都可以找到小编的哈!! 相关文件 关注小 ...
- 基于Python pygame简易版斗兽棋小游戏源代码
基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...
- 【斗兽棋】-单机游戏-微信小程序项目开发入门
还记得小时候玩过的斗兽棋游戏不,90后的经典怀旧游戏哦,笔者TA远方在读小学的时候,曾玩过的游戏名单就有它,也许有人忘记了,现在才想起,理清一下斗兽棋游戏的规则:
最新文章
- Rocksdb 获取当前db内部的有效key个数 (估值)
- php在空值时调用成员函数_当Vlookup函数匹配的结果是时间,或者空值时,显示不正常了...
- 服务器系统玩dnf,win7系统玩dnf提示正在连接服务器的解决方法
- 2019-03-14-算法-进化(两个数组的交集 II)
- [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]
- 力扣—— 36. 有效的数独/37. 解数独
- 20210503:力扣第239周周赛题解
- Linux 根据服务名字找安装路径
- 深入浅出BP神经网络算法的原理
- Linux_zlog日志系统的安装与使用
- 《操作系统》课程设计任务书
- 统计学_显著性检验综述
- 作业录屏+露脸+视频裁剪+字幕添加(支持双语)
- 自定义皮肤进服务器不显示,我的世界自定义皮肤为什么不能显示 我的世界自定义皮肤如何显示...
- 中国智能制造的务实落地方案
- asp.net 调用word的DCOM组件遇见各种问题之乱弹琴
- 形容等待时间长的句子_形容等待的时间很漫长的句子
- Python Scapy(2.3.1)文档学习(三):使用
- 得不偿失!博士骗领210万元、硕士骗领3万元人才补贴,全被判刑了!
- linux服务器挂硬盘无法启动不了怎么办,Linux硬盘问题的八种解决技巧