#include"main.h"
#include "EasyXPng.h"
void init()
{
TCHAR filename[50];
for (int i = 0; i < 5; i++)
{
_stprintf_s(filename, _T("./images/enemychicken/left/chicken%d.png"), i);
loadimage(&enemy_chicken[0][i], filename);
}
for (int i = 0; i < 5; i++)
{
_stprintf_s(filename, _T("./images/enemychicken/right/chicken%d.png"), i);
loadimage(&enemy_chicken[1][i], filename);
}
for (int i = 0; i < 4; i++)
{
_stprintf_s(filename, _T("./images/mychicken/left/chicken%d.png"), i);
loadimage(&player[0][i], filename);
}
for (int i = 0; i < 4; i++)
{
_stprintf_s(filename, _T("./images/mychicken/right/chicken%d.png"), i);
loadimage(&player[1][i], filename);
}
for (int i = 0; i < 5; i++)
{
_stprintf_s(filename, _T("./images/nums/0%d.png"), i);
loadimage(&nums[i], filename);
}
loadimage(&im_bk, _T("./images/bk2.jpg"));
loadimage(&im_boss, _T("./images/boss.png"));
loadimage(&im_myBullet, _T("./images/basketball.png"));
loadimage(&im_start, _T("./images/start.png"));
loadimage(&im_win, _T("./images/win.png"));
loadimage(&im_lose, _T("./images/lose.png"));
loadimage(&im_bossBullet, _T("./images/egg.png"));
mciSendString(_T("open ./music/xianjian.mp3 alias xj"), NULL, 0, NULL);
mciSendString(_T("open ./music/nkg.mp3 alias nkg"), NULL, 0, NULL);
mciSendString(_T("open ./music/win.mp3 alias win"), NULL, 0, NULL);
mciSendString(_T("open ./music/lose.mp3 alias lose"), NULL, 0, NULL);
mciSendString(_T("open ./music/j.mp3 alias j"), NULL, 0, NULL);
mciSendString(_T("open ./music/a.mp3 alias a"), NULL, 0, NULL);
//音乐
state = 1; //游戏开始
srand((unsigned int)time(NULL)); //随机数种子初始化
me = MyChicken(player[1][0],WIN_WIDTH / 2, WIN_HEIGHT / 2, 1, 0);
boss = Boss(im_boss, 20, 20, 1, 5);
initgraph(WIN_WIDTH, WIN_HEIGHT); //开窗口
}
/*注意这里的贴图坐标判定,我写在类里面的坐标和width和height实际上是原来的小鸡的坐标和宽和高,
不算上剑,是为了提高碰撞判定的精确度,但是贴图的坐标是整张图的坐标,所以要在对象的坐标的基础上进行计算来进行绘图。*/
void draw(EnemyChicken& obj)
{
putimagePng(obj.x - (obj.image.getwidth() - obj.width) / 2, obj.y, &(obj.image));
putimagePng(obj.x + obj.width / 2 - nums[obj.level].getwidth() / 2, obj.y - nums[obj.level].getheight(),
&nums[obj.level]);
}
void draw(MyChicken& obj)
{
putimagePng(obj.x - (obj.image.getwidth() - obj.width) / 2, obj.y, &(obj.image));
putimagePng(obj.x + obj.width / 2 - nums[obj.level].getwidth() / 2, obj.y - nums[obj.level].getheight(),
&nums[obj.level + 1]);
}
void draw()
{
putimage(0, 0, &im_bk); //绘制背景
draw(me); //绘制我方小鸡
for (auto it = enemys.begin(); it != enemys.end();) //绘制敌方小鸡
{
if (it->isAlive && it->x >= -200 && it->x <= WIN_WIDTH + 200)
{
draw(*it);
it++;
}
else
{
it = enemys.erase(it);
}
}
// boss.shoot();
if (state == 3)
{
bullet_show(me);
bullet_show(boss);
putimagePng(boss.x, boss.y, &boss.image); //绘制boss
TCHAR s[20]; //血量显示
_stprintf_s(s, _T("blood:%d"), boss.life);
settextcolor(RED);
settextstyle(30, 0, _T("Arial"));
setbkmode(TRANSPARENT); //设置字体背景透明
outtextxy(boss.x + 70, boss.y - 30, s);
}
text_show();
gameover();
}
void enemy_move()
{
for (auto it = enemys.begin(); it != enemys.end(); it++)
{
it->move();
}
}
void crash_check()
{
for (auto it = enemys.begin(); it != enemys.end(); it++) //我方小鸡和敌方小鸡
{
if (me.intersect(*it))
{
if (me.level < it->level)
{
me.life--;
it->isAlive = false;
mciSendString(_T("close a"), NULL, 0, NULL);
mciSendString(_T("open ./music/a.mp3 alias a"), NULL, 0, NULL);
mciSendString(_T("play a"), NULL, 0, NULL);
}
else
{
it->isAlive = false;
me.score += it->level + 1;
mciSendString(_T("close j"), NULL, 0, NULL);
mciSendString(_T("open ./music/j.mp3 alias j"), NULL, 0, NULL);
mciSendString(_T("play j"), NULL, 0, NULL);
if (it->level == 3)
me.bullet_cnt++;
}
}
}
if (state == 3)
{
for (auto it = boss.bullets.begin(); it != boss.bullets.end(); it++) //我方小鸡和敌方子弹
{
if (it->intersect(me))
{
me.life--;
it->isAlive = false;
mciSendString(_T("close a"), NULL, 0, NULL);
mciSendString(_T("open ./music/a.mp3 alias a"), NULL, 0, NULL);
mciSendString(_T("play a"), NULL, 0, NULL);
}
}
if (me.intersect(boss)) //我方小鸡和boss
{
me.life = 0;
}
for (auto it = me.bullets.begin(); it != me.bullets.end(); it++) //boss和我方子弹
{
if (it->intersect(boss))
{
boss.life--;
it->isAlive = false;
mciSendString(_T("close nkg"), NULL, 0, NULL);
mciSendString(_T("open ./music/nkg.mp3 alias nkg"), NULL, 0, NULL);
mciSendString(_T("play nkg"), NULL, 0, NULL);
}
}
}
}
void create_enemy()
{
if (flush_count >= 15)
{
flush_count = 0; //半秒生成一个敌方小鸡
int isright = rand() % 2;
int lev = rand() % 5;
int y = (100 * (rand() % 6));
int x = isright ? 0 - enemy_chicken[isright][lev].getwidth() : WIN_WIDTH;
enemys.push_back(EnemyChicken(enemy_chicken[isright][lev], x, y, isright, lev));
}
}
void state_check()
{
if (me.score >= 2 && me.score < 10)
me.level = 1;
else if (me.score >= 10 && me.score <= 20)
me.level = 2;
else if (me.score > 20)
{
me.level = 3;
if (state == 1)
state = 2;
}
if (me.score >= 30 && state == 2 && me.level == 3)
state = 3;
if (boss.life <= 0) //boss打死为赢
{
isover = true;
win = true;
}
if (me.life <= 0)
{
isover = true;
win = false;
}
}
void gameover()
{
if (isover)
{
state = 4;
if (win)
{
putimagePng(550, 300, &im_win);
mciSendString(_T("close xj"), NULL, 0, NULL);
mciSendString(_T("open ./music/win.mp3 alias win"), NULL, 0, NULL);
mciSendString(_T("play win"), NULL, 0, NULL);
}
else
{
putimagePng(550, 300, &im_lose);
mciSendString(_T("close xj"), NULL, 0, NULL);
mciSendString(_T("open ./music/lose.mp3 alias lose"), NULL, 0, NULL);
mciSendString(_T("play lose"), NULL, 0, NULL);
}
_getch();
}
}
void text_show()
{
TCHAR s[20]; //血量显示
_stprintf_s(s, _T("Lives:%d"), me.life);
settextcolor(GREEN);
settextstyle(30, 0, _T("Arial"));
setbkmode(TRANSPARENT); //设置字体背景透明
outtextxy(10, 30, s);
// TCHAR s1[20]; //得分显示
// settextcolor(WHITE);
// settextstyle(30, 0, _T("Arial"));
_stprintf_s(s, _T("Score:%d"), me.score);
outtextxy(200, 30, s);
putimagePng(500, 35, &im_myBullet);
_stprintf_s(s, _T("x %d"), me.bullet_cnt);
outtextxy(550, 30, s);
}
void bullet_show(MyChicken& me_chicken)
{
for (auto it = me_chicken.bullets.begin(); it != me_chicken.bullets.end();)
{
if (it->isAlive && it->x >= -200 && it->x <= WIN_WIDTH + 200)
{
putimagePng(it->x, it->y, &im_myBullet);
it->move();
it++;
}
else
{
it = me_chicken.bullets.erase(it);
}
}
}
void bullet_show(Boss& boss_bu)
{
for (auto it = boss_bu.bullets.begin(); it != boss_bu.bullets.end();)
{
if (it->isAlive && it->x >= -200 && it->x <= WIN_WIDTH + 200)
{
putimagePng(it->x, it->y, &im_bossBullet);
it->move();
it++;
}
else
{
it = boss_bu.bullets.erase(it);
}
}
}
void shoot(MyChicken& mc)
{
if (_kbhit())
{
if (GetAsyncKeyState(32)) //空格
{
if (me.bullet_cnt > 0)
{
if (mc.isRight)
{
Bullet bu(double(mc.x + mc.width - BULLET_WIDTH), double(mc.y + 35), double(8), double(-15));
mc.bullets.push_back(bu);
}
else
{
Bullet bu(double(mc.x), double(mc.y + 35), double(-8), double(-15));
mc.bullets.push_back(bu);
}
mc.bullet_cnt--;
}
}
}
}
void shoot(Boss& b)
{
if (b.shoot_cnt >= 60) //三秒发射一次
{
for (int i = 0; i < 4; i++)
{
b.bullets.push_back(Bullet(b.x + (b.width / 2) - 12, b.y + (b.height / 2) - 12, 1 + 2 * i, -15 + 1.5 * i));
}
for (int i = 0; i < 4; i++)
{
b.bullets.push_back(Bullet(b.x + (b.width / 2) - 12, b.y + (b.height / 2) - 12, -1 - 2 * i, -15 + 1.5 * i));
}
b.shoot_cnt = 0;
}
b.shoot_cnt++;
}
void update()
{
if (state == 1)
{
putimagePng(0,
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【项目介绍】 基于easyx图形库的c++小游戏大鸡吃小鸡源码(含项目说明+课设报告).zip 运行建议 我开发时是用的VS2022,用vscode或者其他IDE也行但是都得先把easyx装上。 VS装easyx比较简单,下载地址:[EasyX Graphics Library for C++](https://easyx.cn/) 下载后安装到对应的VS版本即可 ## 游戏简介 - 这是一个平面2D的游戏,仿制《大鱼吃小鱼》,游戏里面有三个角色:玩家的小鸡、boss和敌方普通的小鸡 - 玩家的小鸡有四种等级,敌方普通小鸡有五种等级。 - 玩家通过上下左右键来控制小鸡移动。 - 玩家的小鸡碰到敌方的普通小鸡的时候,如果敌方的小鸡的等级小于玩家的等级,那么玩家得分,否则血量减一。同时发生碰撞出发音效 - 如果玩家和boss发生碰撞则瞬间死亡。 - 玩家的子弹和boss的子弹都给对方造成一点伤害 - 子弹只能通过吃掉对方三级小鸡得到,吃掉一只小鸡得到一枚子弹 - 发射子弹通过空格键 - boss死亡就胜利 - 玩家死亡就失败
资源推荐
资源详情
资源评论
收起资源包目录
基于easyx图形库的c++小游戏大鸡吃小鸡源码(含项目说明+课设报告).zip (61个子文件)
Chicken.sln 1KB
EasyXPng.h 1KB
项目说明.md 1KB
music
j.mp3 5KB
nkg.mp3 26KB
win.mp3 338KB
ngmhhay.mp3 97KB
a.mp3 31KB
lose.mp3 170KB
xianjian.mp3 1.37MB
Boss.cpp 370B
EnemyChicken.h 558B
LICENSE 1KB
Bullet.h 426B
main.cpp 9KB
main.h 1KB
object.h 813B
Bullet.cpp 279B
chicken.h 300B
Chicken.vcxproj.user 165B
Chicken.vcxproj.filters 2KB
ClassDiagram.png 46KB
Chicken.aps 1KB
EnemyChicken.cpp 101B
.gitignore 9B
MyChicken.h 611B
images
nums
02.png 806B
00.png 330B
04.png 452B
01.png 429B
03.png 1KB
egg.png 2KB
bk2.jpg 81KB
lose.png 81KB
win.png 87KB
enemychicken
left
chicken2.png 10KB
chicken0.png 4KB
chicken4.png 20KB
chicken1.png 6KB
chicken3.png 14KB
right
chicken2.png 10KB
chicken0.png 3KB
chicken4.png 19KB
chicken1.png 5KB
chicken3.png 13KB
mychicken
left
chicken2.png 14KB
chicken0.png 6KB
chicken1.png 11KB
chicken3.png 21KB
right
chicken2.png 14KB
chicken0.png 5KB
chicken1.png 10KB
chicken3.png 20KB
start.png 858KB
basketball.png 2KB
boss.png 100KB
课设报告.md 13KB
Boss.h 559B
Chicken.vcxproj 7KB
ClassDiagram.cd 2KB
MyChicken.cpp 721B
共 61 条
- 1
资源评论
- 2301_803726602024-07-09总算找到了自己想要的资源,对自己的启发很大,感谢分享~
.whl
- 粉丝: 3819
- 资源: 4648
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 经典-FPGA时序约束教程
- PHP底层分析笔记和资料
- 基于Python与Spark的国漫推荐可视化系统开发
- 速腾16线激光雷达驱动,下载编译后,设置电脑静态IP;192.168.1.102 子网掩码:255.255.255.0,之后运行launch文件即可
- C++学生信息管理系统源码+数据库+报告文档+使用说明(高分项目)
- 我的生涯探索成长单-1732165282872_QQ浏览器转格式.pdf
- 【java毕业设计】SpringBoot+Vue(食堂)在线点餐(订餐)系统 源码+sql脚本+论文 完整版
- 基于Python和Django的热门旅游景点数据分析系统
- 课程考试系统设计与开发:从理论到实践的全方位指南
- 836706658493924秦天 TV_1.3.0.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功