概述
C/C++--球球大作战项目(简单版)
在bilibili上扒了个C++的小游戏项目的视频,自己看了几遍,跟着老师学习了这个项目。
项目名称:C/C++--球球大作战项目(简单版)
项目简介:模拟球球大作战小游戏,实现了自己可以控制并且变大的玩家,以及随机创建被吃的食物,在背景音乐下,有AI玩家会追随。
开发环境:Visual Studio 2012 (给编译器加入 EasyX图形库)
项目实现:先用easyx库实现图形化界面,然后绘制玩家形状,颜色,大小等,实现控制玩家模块,创建地图以及食物,实现玩家吃食物功能,然后实现摄像头追随玩家以及越界情况,最后创建的AI玩家追逐玩家的功能。
项目难点:在实现outtextxy(player.x,player.y,"劫中甜");时,也就是显示玩家名称时,需要设置VS:点击项目->属性->常规->字符集->使用多字节字符集。在实现绘制玩家时,注意顺序,先绘制食物,再绘制AI玩家,最后绘制玩家自己,否则玩家覆盖不了食物。因为需要不断的处理绘制图,以及获取键盘消息,主函数中需要使用循环。
项目未开发的功能:
1.AI玩家吃AI玩家
2.AI玩家吃食物
3.玩家吃AI玩家
4.AI玩家吃玩家
5.分裂,合并
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <time.h>
#include <math.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 1024
#define WIN_HEIGHT 640
#define MAP_WIDTH (WIN_WIDTH * 5)
#define MAP_HEIGHT (WIN_HEIGHT * 5)
#define FOOD_NUM 1000 //食物数量
#define AI_NUM 500 //AI玩家数量
//球球大作战 esayx图形库
//用变量表示玩家的坐标
struct Ball
{
int x;
int y;
int r;
int flag;//是否存在标志
DWORD color;//小球颜色
}player,food[FOOD_NUM],ai[AI_NUM];//定义变量
//int a;图片 IMAGE map;
IMAGE map(MAP_WIDTH,MAP_HEIGHT);
//摄像机位置
POINT cameraPos;
void CameraUpdate()
{
//以人物为中心,计算摄像机的位置
cameraPos.x = player.x - WIN_WIDTH / 2;
cameraPos.y = player.y - WIN_HEIGHT / 2;
if(cameraPos.x < 0) cameraPos.x = 0;
if(cameraPos.y < 0) cameraPos.y = 0;
if(cameraPos.x > MAP_WIDTH - WIN_WIDTH) cameraPos.x = MAP_WIDTH - WIN_WIDTH;
if(cameraPos.y > MAP_HEIGHT - WIN_HEIGHT) cameraPos.y = MAP_HEIGHT - WIN_HEIGHT;
}
//初始化数据
void GameInit()
{
//播放音乐
mciSendString("open ./微微.mp3 alias BGM",0,0,0);
mciSendString("play BGM repeat", 0 , 0, 0);
//设置随机数种子
srand((unsigned)time(NULL));
player.x = rand()%MAP_WIDTH;
player.y = rand()%MAP_HEIGHT;
player.r = 15;
player.flag = true;
player.color = RGB(rand() % 256,rand() % 256,rand() % 256);
//初始化食物数据
for (int i = 0; i < FOOD_NUM;i++)
{
food[i].x = rand() % MAP_WIDTH;
food[i].y = rand() % MAP_HEIGHT;
food[i].r = rand() % 5 + 1;
food[i].flag = true;
food[i].color = RGB(rand() % 256,rand() % 256,rand() % 256);
}
//初始化AI
for (int i = 0; i < AI_NUM;i++)
{
ai[i].x = rand() % MAP_WIDTH;
ai[i].y = rand() % MAP_HEIGHT;
ai[i].r = rand() % 15 + 1;
ai[i].flag = true;
ai[i].color = RGB(rand() % 256,rand() % 256,rand() % 256);
}
}
//绘制玩家
void GameDraw()
{
//加上双缓中绘图,防止闪屏
BeginBatchDraw();
//设置工作区
SetWorkingImage(&map);
//设置背景颜色
setbkcolor(WHITE);
//清屏
cleardevice();
//绘制食物
for (int i =0; i < FOOD_NUM ; i++)
{
if(food[i].flag)
{
setfillcolor(food[i].color);
solidcircle(food[i].x,food[i].y,food[i].r);
}
}
//绘制AI玩家
for (int i =0; i < AI_NUM ; i++)
{
if(ai[i].flag)
{
setfillcolor(ai[i].color);
solidcircle(ai[i].x,ai[i].y,ai[i].r);
}
}
//绘制玩家
if(player.flag)
{
setfillcolor(player.color);
solidcircle(player.x,player.y,player.r);
settextcolor(BLACK);
setbkmode(TRANSPARENT);
outtextxy(player.x,player.y,"劫中甜");//需要设置:点击项目,属性,常规,字符集,使用多字节字符集
}
SetWorkingImage();//恢复默认工作区
CameraUpdate();
putimage(0,0,WIN_WIDTH,WIN_HEIGHT,&map,cameraPos.x,cameraPos.y);
EndBatchDraw();//结束双缓冲绘图
}
//控制玩家
void PlayerContrl(int speed)
{
//往上移动,什么发生改变?y坐标减
if(GetAsyncKeyState(VK_UP) && player.y - player.r >= 0)
{
player.y -= speed;
}
if(GetAsyncKeyState(VK_DOWN) && player.y + player.r< MAP_HEIGHT)
{
player.y += speed;
}
if(GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0 )
{
player.x -= speed;
}
if(GetAsyncKeyState(VK_RIGHT) && player.y + player.r< MAP_WIDTH)
{
player.x += speed;
}
}
//求两点之间的距离
double DisTance(struct Ball b1,struct Ball b2)
{
return sqrt((double)(b1.x - b2.x) *(b1.x + b2.x) + (b1.y - b2.y)*(b1.y + b2.y));
}
//玩家吃食物
void EatFood()
{
for(int i = 0; i < FOOD_NUM;i++)
{
if(food[i].flag && DisTance(player,food[i]) < player.r)
{
food[i].flag = false;
player.r += food[i].r / 4;
}
}
}
//追逐算法
void Chase(struct Ball *chase,struct Ball run)
{
chase->x < run.x ? chase->x += 2 : chase -> x -= 2;//x改变
chase->y < run.y ? chase->y += 2 : chase -> y -= 2;//y改变
}
void aiMove()
{
for(int i = 0; i < AI_NUM;i++)
{
if(ai[i].flag )
{
Chase(&ai[i],player);
}
}
}
int main()
{
//创建窗口
initgraph(WIN_WIDTH,WIN_HEIGHT);
GameInit();
//需要不断的处理绘制图,以及获取键盘消息...循环
while (1)
{
aiMove();
GameDraw();
EatFood();
PlayerContrl(10);
}
getchar();
return 0;
}
运行结果如下:
最后
以上就是自觉书包为你收集整理的C/C++--球球大作战项目(简单版)C/C++--球球大作战项目(简单版)的全部内容,希望文章能够帮你解决C/C++--球球大作战项目(简单版)C/C++--球球大作战项目(简单版)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复