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

一、游戏说明

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

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

二、游戏截图

三、实现思路

1. 地图还原:

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

2. 猫的移动:

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

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

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

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

四、完整代码

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

/
// 程序名称:围住神经猫
// 编译环境  Visual Studio2019(C++语言标准选择C++17),EasyX#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);elseTransparentBlt(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 };elsecanvas[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);elsesetfillcolor(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();elseexit(-1);}
}//鼠标操作
void dataChangeWithMouseHit()
{while (true){m = GetMouseMsg();if (m.x >= 200 && m.x <= 230 && m.y >= 170 && m.y <= 200)settextcolor(BLACK);elsesettextcolor(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();elseexit(-1);}
}int main()
{initial();while (true){show();dataChangeWithMouseHit();dataChangeWithoutMouseHit();Sleep(20);}return 0;
}

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)

【项目实战】C/C++轻松实现4399小游戏:围住神经猫相关推荐

  1. 随机发牌_Java项目实战:斗地主洗牌发牌小游戏

    此局地主是:李四 张三: [梅花10, 方片2, 方片K, 方片J, 方片5, 黑桃6, 黑桃10, 红桃3, 梅花3, 黑桃2, 梅花8, 黑桃A, 红桃J, 梅花9, 红桃K, 方片9, 梅花Q] ...

  2. Python爬虫入门(四):实战,爬取4399小游戏首页

    目录 robots.txt robots协议 robots.txt 语法 君子协定 何时需要robots协议? 查看4399.com的robots.txt 设定并分析目标 代码 urllib2& ...

  3. ✨JavaWeb项目:实战亲自动手手敲上线小项目部分功能的第一天✨

    系列链接: ✨JavaWeb项目实战亲自动手手敲上线小项目的第一天✨ ✨JavaWeb项目实战亲自动手手敲上线小项目的第二天✨ ✨JavaWeb项目实战亲自动手手敲上线小项目的第三天✨ ✨JavaWe ...

  4. 25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 还记得童年的网页小游戏吗?今天带大家爬取4399小游戏网站的数据,游戏名字+链接地址 目标网 ...

  5. 4399小游戏童年的乐趣,python爬取4399全站小游戏

    大家好,我是辣条. 前言 2021年已到尾巴尖尖了. 今天照镜子,看着镜子中的自己,发现还是跟年轻时一样的"帅",看到头部的时候又发现相比半个月之前的发际线,它好像又往上移了一点点 ...

  6. 视频教程-Cocos2d-x 3.x项目实战:星空大战(射击类游戏)-Cocos

    Cocos2d-x 3.x项目实战:星空大战(射击类游戏) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲 ...

  7. 怎么把4399小游戏的代码_25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 还记得童年的网页小游戏吗?今天带大家爬取4399小游戏网站的数据,游戏名字+链接地址 目标网 ...

  8. 4399小游戏flash插件怎么下载_Flash即将关闭,但这个小游戏平台,或许可以帮你找回4399的回忆...

    今年注定是与众不同的一年,TCL和黑莓停止了合作关系.Windows 7失去了微软官方技术支持,而我们也将送走一位真正意义上的互联网老玩家-Flash. 在2017年Adobe就曾宣布,将于2020年 ...

  9. 计算机里没有四款小游戏,90后最爱玩的4款“4399”小游戏,一个都没玩过的太可怜!...

    原标题:90后最爱玩的4款"4399"小游戏,一个都没玩过的太可怜! 对于90后的小伙伴们来说,现在的很多东西都属于童年的回忆了,而在我们那个年代,电脑游戏还不是非常的盛行.正式流 ...

最新文章

  1. 激光雷达和V2X技术
  2. IDEA JAVA gradle等常见工具/包 踩坑记录
  3. 完全详解--Silverlight 下载文件
  4. 【视频课】模型部署课程更新!ncnn框架快速实践!
  5. ASP.Net防范XSS漏洞攻击的利器HtmlSanitizer
  6. mikechen详谈架构师成长之3大步骤
  7. 基于asp.net的网上书店商城设计与实现
  8. java filechooser_Java—FileChooser(示例代码)
  9. Xcode误删Images.xcassets文件夹的恢复办法(Assets.xcassets)
  10. 测试freenas9.1搭建iscsi磁盘库
  11. VS如何定制自己的模板信息
  12. Windows2003操作系统SQL Server 2008安装图解(详细)
  13. Fiddler抓包工具的安装与使用方法
  14. JMETER badboy 下载及安装
  15. 查看表内容 mysql_mysql查询表内容
  16. JS/JQuery如何判断文本中是否有繁体字
  17. Fiddler实现苹果手机APP抓包
  18. printf中%p的输出应用
  19. NeRF论文解析 - Neural Radiance Field
  20. Linux系统rootfs切换到真正的根文件系统详细源码解析(附工作项目手动制作根文件实例)

热门文章

  1. TensorFlow js. 官方教程
  2. Andro Studio 中JNI学习使用记录
  3. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.view.View andro
  4. Deep Supervision:深度监督(2014)+DHM
  5. 线程池invokeAll方法详解
  6. 用python判断你是青少年还是老年人
  7. 【GA三维路径规划】遗传算法无人机三维路径规划【含Matlab源码 1268期】
  8. 最广泛使用的服务器软件爆出网络安全漏洞
  9. 从第三季“多多读书月”看拼多多的知识普惠进阶
  10. winedt103系统找不到指定文件_win10专业版提示系统找不到指定文件的解决教程