您的位置:首页 → 攻略  →  手游攻略  →  围住神经猫游戏怎么做(围住神经猫玩法攻略)

围住神经猫游戏怎么做(围住神经猫玩法攻略)

2023-10-27 13:28:15作者:掌上游戏    阅读数:

每天一个C语言小项目,提升你的编程能力!

一、游戏说明

本游戏仿造 4399 的小游戏-围住神经猫。

游戏操作:通过鼠标点击操作,设置路障,围住神经猫,当成功围住神经猫时,游戏胜利。当神经猫逃离地图边缘,游戏失败。

二、游戏截图

围住神经猫游戏怎么做(围住神经猫玩法攻略)

 

三、实现思路

1. 地图还原:

首先是游戏的道路,这里我们采用绘制灰白色的圆来表示可走的路,用黄色的圆来表示已存在的障碍物。同时还需要注意奇偶行需要交错排列。

2. 猫的移动:

这里我们采用广度优先搜索求最短路径。"猫"在一个位置,能够移动的方向有6个,需要注意的是:

由于奇偶行交替排列,导致奇偶行猫的可行路径是不一样的,奇数行:上,下,左,右,左下,左上。

偶数行:上,下,左,右,右下,右上。剩下的就是常规的求最短路径即可。

注:代码中所用图片,请见文末

围住神经猫游戏怎么做(围住神经猫玩法攻略)

 

四、完整代码

简单了解游戏后我们就来试试吧!(直接上源码,大家可以看注释)

///////////////////////////////////////////////////////// // 程序名称:围住神经猫 // 编译环境 Visual Studio2019(C++语言标准选择C++17),EasyX // C语言/C++编程交流Q群:734106058 #include <graphics.h> #include <queue> #include <cstring> #include <ctime> #include <vector> #pragma comment( lib, "MSIMG32.LIB") #define pix 50 // 像素比例 #define hight (14 * pix) #define width (10 * pix) using namespace std; int stepS; // 记录已经走的步数 int startBarrier; // 开始的障碍物数目 wchar_t Score_[30]; MOUSEMSG m; // 鼠标操作 IMAGE pig, bkimg;; // 加载图片 enum class picture { none, barrier }; struct XY { int x, y; int lastX, lastY; //记录上一个点的坐标 }cat; struct node { int x, y; //坐标,圆心位置 picture pic; //当前位置的图片内容 }; node canvas[10][10]; // 地图 bool visit[10][10]; // 记录是否访问过地图中的元素 int path[10][10][2]; // 记录上一个位置 //注意:因为地图是交错排列的,奇数列与偶数列猫的移动不同 int dirOdd[6][2]{ 1,0,-1,0,0,1,0,-1,-1,-1,-1,1 }; //控制方向奇数列 int dirEven[6][2]{ 1,0,-1,0,0,1,0,-1,1,-1,1,1 }; //控制方向偶数列 int main(); //贴图函数 void transparentimage(IMAGE* dstimg, int x, int y, IMAGE* srcimg,int direction) { HDC dstDC = GetImageHDC(dstimg); HDC srcDC = GetImageHDC(srcimg); int w = 50; int h = 100; // 使用 Windows GDI 函数实现透明位图 if (direction == 0) TransparentBlt(dstDC, x, y, w, h, srcDC, 0, 0, w, h, 0); else TransparentBlt(dstDC, x, y, w, h, srcDC, 10, 187, w, h, 0); } //游戏初始化 void initial() { srand(time(0)); stepS = 0; startBarrier = rand() % 6 + 8; //障碍物数量 loadimage(&pig, L"pig.png"); loadimage(&bkimg, L"bkground.jpg", width, hight, true); initgraph(width, hight); HWND wnd = GetHWnd(); SetWindowText(wnd, L"围住神经猫");//设置文章标题 for (int i = 1; i <= 9; ++i) for (int j = 1; j <= 9; ++j) { if (i & 1) //如果是奇数行 canvas[i][j] = node{ j * pix - pix / 4, pix * 4 + i * pix ,picture::none }; else canvas[i][j] = node{ j * pix + pix / 4, pix * 4 + i * pix ,picture::none }; } cat.x = 5; cat.y = 5; //猫最开始的地方 while (startBarrier--) { int bx, by; //设置初始障碍 do { bx = rand() % 10; by = rand() % 10; } while (canvas[by][bx].pic == picture::barrier || (by == cat.y && bx == cat.x)); canvas[by][bx].pic = picture::barrier; } setbkmode(TRANSPARENT); BeginBatchDraw(); } //绘制游戏画面, 白色:空 黄色:障碍物 void show() { putimage(0, 0, &bkimg); setbkcolor(WHITE); settextstyle(20, 0, L"微软雅黑"); outtextxy(200, 170, L"重玩"); outtextxy(250, 180, L"步数: "); swprintf(Score_, 29, L"%d", stepS); outtextxy(290, 180, Score_); for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= 9; ++j) { if (canvas[i][j].pic == picture::barrier) setfillcolor(YELLOW); else setfillcolor(LIGHTGRAY); solidcircle(canvas[i][j].x, canvas[i][j].y, (pix - 4) / 2); } } if (cat.y & 1) //奇数列 transparentimage(NULL, cat.x * pix - pix / 4 - 25, pix * 3 + cat.y * pix - 21, &pig,0); else //偶数列 transparentimage(NULL, cat.x * pix - 25 + pix / 4, pix * 3 + cat.y * pix - 21, &pig,1); FlushBatchDraw(); } //寻找下一个点的位置 struct LastOrder { int x, y; }; vector<LastOrder> vec; void findNextXY(int x, int y) { if (x == cat.x && y == cat.y) { vec.push_back({ x,y }); return; } else { findNextXY(path[y][x][0], path[y][x][1]); vec.push_back({ x,y }); } } //利用广度优先搜索求最短路径,xy为数组的i,j下标,注意传参 void bfs(XY xy) { //每次搜索时初始化数组 memset(visit, false, sizeof(visit)); memset(path, 0, sizeof(path)); bool tag = true; queue<XY> que; que.push(xy); visit[xy.y][xy.x] = true; while (!que.empty()) { XY temp = que.front(); que.pop(); //如果找到出口 if (temp.x == 1 || temp.x == 9 || temp.y == 1 || temp.y == 9) { findNextXY(temp.x, temp.y); cat.x = vec[1].x; cat.y = vec[1].y; vec.clear(); tag = false; break; } int dx, dy; //寻找可走的路 for (int i = 0; i < 6; ++i) { if (temp.y & 1) { dx = temp.x + dirOdd[i][0]; dy = temp.y + dirOdd[i][1]; } else { dx = temp.x + dirEven[i][0]; dy = temp.y + dirEven[i][1]; } if (dx >= 1 && dx <= 9 && dy >= 1 && dy <= 9 && !visit[dy][dx] && canvas[dy][dx].pic == picture::none) { visit[dy][dx] = true; path[dy][dx][0] = temp.x; path[dy][dx][1] = temp.y; que.push({ dx,dy,temp.x,temp.y }); } } } if (tag) //如果没找到出口 { show(); HWND wnd = GetHWnd(); swprintf(Score_, 29, L"你共用了%d步,重玩一局吗", stepS); FlushBatchDraw(); if (MessageBox(wnd, Score_, L"成功", MB_YESNO | MB_ICONQUESTION) == IDYES) main(); else exit(-1); } } //鼠标操作 void dataChangeWithMouseHit() { while (true) { m = GetMouseMsg(); if (m.x >= 200 && m.x <= 230 && m.y >= 170 && m.y <= 200) settextcolor(BLACK); else settextcolor(WHITE); outtextxy(200, 170, L"重玩"); FlushBatchDraw(); if (m.uMsg == WM_LBUTTONDOWN) { if (m.x >= 200 && m.x <= 230 && m.y >= 170 && m.y <= 200) main(); for (int i = 1; i <= 9; ++i) for (int j = 1; j <= 9; ++j) //如果在当前方格内,则改变信息 if (canvas[i][j].pic != picture::barrier && (m.x - canvas[i][j].x) * (m.x - canvas[i][j].x) + (m.y - canvas[i][j].y) * (m.y - canvas[i][j].y) <= (pix - 4) * (pix - 4) / 4) { canvas[i][j].pic = picture::barrier; stepS++; bfs({ cat.x,cat.y,0,0 }); return; } } } } //不需要鼠标的操作,判断猫是否跑掉 void dataChangeWithoutMouseHit() { if (cat.x == 1 || cat.y == 1 || cat.x == 9 || cat.y == 9) { show(); HWND wnd = GetHWnd(); if (MessageBox(wnd, L"游戏结束。\n神经猫跑掉了!,重玩一局吗", L"询问", MB_YESNO | MB_ICONQUESTION) == IDYES) main(); else exit(-1); } } int main() { initial(); while (true) { show(); dataChangeWithMouseHit(); dataChangeWithoutMouseHit(); Sleep(20); } return 0; }

大家赶紧去动手试试吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至957126978@qq.com举报,一经查实,本站将立刻删除。

攻略排行榜

  • 映像大厅多少装等能进(魔兽世界副本映像大厅介绍)映像大厅多少装等能进(魔兽世界副本映像大厅介绍)
    魔兽世界-巫妖王之怒副本《映像大厅》由吉安娜和希尔瓦娜斯领头,那些跟着来着此地处的冒险者们很快的就会发现面前摆着的武器正是霜之哀伤——巫妖王那把传说中能使人堕落的武器。巫妖王的密室就在触手可及的地方,但这也有可能是所有冒险至此的人的葬身之地。 《映像大厅》位于诺森德—冰冠冰川,坐标:50/85. 《法瑞克》他曾经是跟随米奈希尔·阿尔萨斯王子来到诺森德的一名军舰指挥官,而如今他被阿尔萨斯王子复活成为亡灵,并且守护着到寒冰王座的通道。 《玛维恩》自小认识阿尔萨斯,并把他当成真正的朋友。尽管阿尔萨斯将一把被诅咒的符文剑插入他的心脏,但眼见王子变成这副模样,他还是体会到了心碎的感觉。 《逃离阿尔萨斯
    阅读:32024-01-23
  • 鬼魂新娘莫甘娜多少钱(LOL盘点定价不合理的皮肤)鬼魂新娘莫甘娜多少钱(LOL盘点定价不合理的皮肤)
    说起LOL的氪金点,皮肤占了大头,《英雄联盟》中的皮肤虽然不像《王者荣耀》那样给你加一点点属性,但是一个好用的皮肤可以提升你的手感,间接提升了你的操作,另外有些皮肤的特效好看能让你游戏更有体验感,更有牌面。 LOL中能直接购买到的最有牌面的皮肤当然就是终极皮肤了,模型可以变换,特效更好看,还有特殊的语音,真的是把一个英雄的体验感拉满。因为其高超的质量,所以价格也不菲,一般都定价在了199左右。不过这种高质量的皮肤也算是配得上这个价格,但是由于一些国服特色,一些特效一般的皮肤甚至定价超过了终极皮肤,今天我们就来盘点几个定价不合理的皮肤。 一.勇敢的心 诺手 老玩家应该知道这是国服两周年纪念的皮
    阅读:52024-01-23
  • dnf冒险团等级经验表(DNF经验结构大改版)dnf冒险团等级经验表(DNF经验结构大改版)
    很多小伙伴好奇探险记第11季的[初级探险家]、[高级探险家]以及[大师探险家]需要多久才能将探险等级升满级,接下来就让我们一起来看吧! 各等级经验分布 等级区间 每级经验 2~100 1000 升至满级合计经验:99000 经验获取方式 本季经验获取途径依旧是由[每日任务]、[每周任务]、[赛季任务]、[助力任务]以及[消耗点券]组成。 1、每日任务 本季探险记的[初级/高级/大师探险家]的每个每日任务都是100探险经验,每天可完成6个每日任务,无论是否完成都会在隔天早6点重置。 每天通过完成每日任务共可获得600探险经验,全勤84天共可获得50400探险经验。 每日任务中有一个“获得地下城
    阅读:42024-01-23
  • 穿越火线挑战模式怪物图鉴(cf生化怪物大盘点)穿越火线挑战模式怪物图鉴(cf生化怪物大盘点)
    暗杀女皇 割喉隐身旋风斩 踢她一脚就不砍你了 装甲蝎子王 这个难点 先打毒刺避免射精 出小蝎子先打小的避免回血 还有全图抓人 滑行哦 绞肉机 激光要滑行才躲的过 全屏镭射按f 转到你身边踹一脚 很炫酷的说 迅捷虫 和跳蚤一样 钢铁泰迪! 技能:大炮,火箭发射器,加特林机枪,火焰保护膜,咆哮,扑击,前爪攻击 有黄金手雷可秒,没的话好好打!伤害很高注意躲避,有个替身吸引仇恨很好用。
    阅读:42024-01-23
  • 首领之傲技能介绍(LOL4大钩人技能)首领之傲技能介绍(LOL4大钩人技能)
    在英雄联盟当中,设计师设计了许多具有趣味性的技能来增加游戏的可玩性,让LOL的技能不仅仅局限于伤害,钩子技能便是LOL里十分独特的一种设定,这种能够迫使敌方强制位移的手段能让对手从安全的敌方突然进入火力范围,因此对敌人的恐惧效果十分明显,今天指南哥就来给大家盘点一下LOL当中最让对手恐惧的4大钩人技能。 TOP4深海泰坦 Q技能 泰坦是一名可上可辅的肉盾英雄,虽然他自身的伤害不高,但是配合队友的能力却十分强,因为他的五个技能中有三个控制和一个减速,而这些控制技能当中最让敌方胆寒的便是Q技能的钩子,一旦被泰坦钩中迎接对手的将是一套长达5秒左右的控制链,插翅难飞! TOP3魂锁典狱长 Q技能 锤
    阅读:52024-01-23
  • 冒险岛怪物图鉴未来勇士(冒险岛怪物收藏攻略)冒险岛怪物图鉴未来勇士(冒险岛怪物收藏攻略)
    本周日活动正好是双倍收藏活动(也有不少小伙伴怀疑,收藏双倍真的顶用吗?),笔者趁着活动,来和大家分享下怪物收藏的一些小知识,可能不齐全,但尽量确保准确无误的告诉大家,如果有错误的地方,也欢迎各位读者指出来。 1、为什么要弄怪物收藏 做任何事情,要有一个大概的目标,怪物收藏也是,弄怪物收藏的目的是什么?有的人为了突破上限石、有的为了A潜能卷、幸运日卷轴、印章,有人为了怪异,也有的人为了刷椅子。需要明白自己需要什么,针对该目标去努力。 2、明确收藏目标 想要的东西不一样,因此导向也不大一样。如果为了突破上限石,收藏自然是越多越好(600最好,开的探险个数最多,达5个),如果为了怪物收藏拿椅子,则
    阅读:22024-01-23
  • 原罪之战天赋神权(暗黑破坏神原罪之战剧情)原罪之战天赋神权(暗黑破坏神原罪之战剧情)
    上回讲到莉莉丝企图掌控艾迪伦,被乌迪西安打败。最后被自己的老情人艾纳利尤斯再次放逐到了虚空中。 三神教覆灭后,乌迪西安带领艾迪伦向艾纳利尤斯的圣光大教堂进发。 01.蒙面先知 艾纳利尤斯喜欢以先知的身份行走在庇护之地。跟躲躲藏藏的恶魔不同,他享受着世人的崇拜和敬仰。 数百年来,他喜欢飞在天上观察自己的造物、欣赏自己统治的世界。直到一个叫”乌迪西安“的农夫横空出世,才打破了这样枯燥的生活。 不过他心底里还是把乌迪西安当做一枚棋子。比方说在三神教和乌迪西安的交锋中,他就曾暗中帮助乌迪西安,铲除三神教,他自己也顺手放逐了莉莉丝。 这自负的大天使认为,解决莉莉丝可比解决乌迪西安难多了。 面对乌迪西安
    阅读:32024-01-23
  • war3秘籍对电脑有效吗(魔兽争霸秘籍手游方法)war3秘籍对电脑有效吗(魔兽争霸秘籍手游方法)
    魔兽秘籍是在单人模式下使用的一些特殊的指令,通过这些魔兽秘籍你可以获取金钱,无敌等各种快速取得胜利的办法。下面来一起看一下吧。 魔兽争霸自带的秘籍只能在单人模式下使用,在多人模式下是无法使用的。 点击键盘的回车,在对话框中输入想要启用的秘籍,发送即可。 输入“KeyserSoze”,可以得到黄金500。输入“LeafItToMe”,可以得到木头500。 输入“GreedIsGood”加上数字,可以得到全部资源。 输入“PointBreak”,可以得到无限的食物。输入“WarpTen”,可以开启快速建筑。 输入“ThereIsNoSpoon”,可以得到无限的魔力。输入“ISeeDeadPeop
    阅读:52024-01-23
  • 枪炮师30级技能(晶核枪炮师技能搭配推荐)枪炮师30级技能(晶核枪炮师技能搭配推荐)
    晶核枪炮师技能搭配推荐   一号位:负级子炮+烈焰爆弹   这一套技能主要作用就是可以群攻,清怪非常的快。   二号位:负级子炮+烈焰爆弹   和上一套技能似乎是差不多的,需要和1号位的搭配起来使用,为了提升命中。   三号位:回旋截击+破阵冲锋   这一套技能主要是为了补伤害,可以增加距离上的输出。   四号位:狩猎者轰炸+重火力狂潮   这一套技能伤害的倍率很高,主要是可以打出很高的输出。   《晶核》莱茵城拍照地点位置介绍   一、除了诗还有远方   地点:莱茵城威德附近   来到莱茵城威德附近地点位置,在下城区中间位置选择拍照。   二、熙熙攘攘   地点:莱茵城-下城区   打开地
    阅读:52024-01-23
  • 新天上碑国服官网(新天上碑传奇游戏评测)新天上碑国服官网(新天上碑传奇游戏评测)
    新天上碑传奇中有个boss之家,传说里面住着许多不同种类的boss,它们的身上随时都带着无数的珍宝,只等有情郎……不是,只等勇士来把它们消灭,怎么样,你们能打得过boss之家的boss么?我们还是先来看看boss之家到底怎么玩吧! 在8090新天上碑传奇中,boss之家是boss云集的地方,其中怪物林立,击败boss就可以获得大量的稀有装备哦,想要酣畅淋漓的打个痛快吗!就来boss之家吧!同时这里也是侠客热血PK的地方,所以要小心咯! boss之家是全天24小时开放的,大家的等级达到30级就可以进入了哦,进入boss之家需要消耗一个boss之家卷轴,每一次可以在这个副本里面呆满一个小时哦,各
    阅读:32024-01-23