一、项目背景

此游戏是笔者大二第一学期时受好友之托,重拾c语言编写的小程序,这篇文章主要介绍Game中的游主体逻辑部分。程序主体多用if-elsewhilefor等关键字,适合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语言小游戏----改版斗兽棋相关推荐

  1. 小游戏之斗兽棋(uniapp)

    前言 最近学习数据结构与算法,但是平常自己要么刷题,要么看书,很是无聊.就想着游戏中一般都会运用大量的算法,所以就开始写游戏来锻炼自己算法这方面的小能力.后面还会持续做其他小游戏,并发布说说自己做的过 ...

  2. C语言小游戏->井字棋

    井字棋想必大家都玩过,今天教大家一个用C语言写一个井字棋小游戏 这个游戏大致可以分为两个部分:游戏菜单和游戏过程. 首先就是创建一个menu()函数来写菜单页面 这里出现了不同指令对应的结果,即输入1 ...

  3. C语言小游戏快速入门--三子棋

    目录 一.前言 二.游戏界面 三.游戏逻辑 1.game.h 2.game.c 3.test.c 四.总结 一.前言 这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来.在这里博主实现的 ...

  4. 《c语言小游戏》入门级三子棋游戏(机器人加强版)

    目录 打印界面 初始化数组的值 玩家下棋 判断是否胜利 电脑下棋 今天为大家带来的是一款非常简单的小游戏"三子棋" 首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听 ...

  5. C语言小游戏之井字棋

    目录 1.游戏菜单 2.实现游戏函数 2.1.初始化棋盘 2.2.打印棋盘 2.3.实现玩家下棋 2.3.实现电脑下棋 ​ 2.4.判断输赢 2.5.判断棋盘是否满 2.6.游戏函数 3.完整代码 3 ...

  6. 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...

    斗兽棋android手机版,动物对战棋,回味童年的棋牌休闲游戏,登陆android手机,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的 ...

  7. 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码

    前言 有粉丝说要我出一期Python版本的斗兽棋,今天宠粉狂魔的我不就来啦!! 虽然是一个简单的小游戏,但是对于新手小伙伴来说还是有一定的小难度的哟!要是不理解都可以找到小编的哈!! 相关文件 关注小 ...

  8. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

  9. 【斗兽棋】-单机游戏-微信小程序项目开发入门

    还记得小时候玩过的斗兽棋游戏不,90后的经典怀旧游戏哦,笔者TA远方在读小学的时候,曾玩过的游戏名单就有它,也许有人忘记了,现在才想起,理清一下斗兽棋游戏的规则:

最新文章

  1. Rocksdb 获取当前db内部的有效key个数 (估值)
  2. php在空值时调用成员函数_当Vlookup函数匹配的结果是时间,或者空值时,显示不正常了...
  3. 服务器系统玩dnf,win7系统玩dnf提示正在连接服务器的解决方法
  4. 2019-03-14-算法-进化(两个数组的交集 II)
  5. [Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]
  6. 力扣—— 36. 有效的数独/37. 解数独
  7. 20210503:力扣第239周周赛题解
  8. Linux 根据服务名字找安装路径
  9. 深入浅出BP神经网络算法的原理
  10. Linux_zlog日志系统的安装与使用
  11. 《操作系统》课程设计任务书
  12. 统计学_显著性检验综述
  13. 作业录屏+露脸+视频裁剪+字幕添加(支持双语)
  14. 自定义皮肤进服务器不显示,我的世界自定义皮肤为什么不能显示 我的世界自定义皮肤如何显示...
  15. 中国智能制造的务实落地方案
  16. asp.net 调用word的DCOM组件遇见各种问题之乱弹琴
  17. 形容等待时间长的句子_形容等待的时间很漫长的句子
  18. Python Scapy(2.3.1)文档学习(三):使用
  19. 得不偿失!博士骗领210万元、硕士骗领3万元人才补贴,全被判刑了!
  20. linux服务器挂硬盘无法启动不了怎么办,Linux硬盘问题的八种解决技巧

热门文章

  1. 唯美烟花特效登录页面,我感觉自己又行了
  2. OSPF(三)OSPF域内路由
  3. 读懂matlab代码,一个Matlab的寻峰程序没有看懂,不知大家能否帮助?
  4. %f 与 %lf的区别
  5. 云存储的分布式文件系统
  6. win10、ThinkPad遇到静音键不亮,但可以使用的问题
  7. 翻译图片中文字的网站
  8. SQLserver服务器修复,sqlserver数据库修复工具大师官方版
  9. 倒谱基音周期matlab,Matlab基于倒谱和EMD的语音基音周期的提取.doc
  10. 牛客题库 题解 | #[NOIP2017]图书管理员#