球球大作战: 使用c++语言实现简单的球球大作战游戏

您所在的位置:网站首页 球球大作战制作 球球大作战: 使用c++语言实现简单的球球大作战游戏

球球大作战: 使用c++语言实现简单的球球大作战游戏

2024-07-16 10:14| 来源: 网络整理| 查看: 265

#include #include //using namespace std; #include//多媒体控制接口 #pragma comment(lib,"winmm.lib")

#define WIDTH 1024 #define HEIGHT 1024 #define MAP_WIDTH (WIDTH3) #define MAP_HEIGHT (HEIGHT3) #define Food_Num 1000 #define AI_Num 10 #define TwoPointDistance(spr1,spr2) sqrt(pow((spr1).position.x-(spr2).position.x,2)+pow((spr1).position.y-(spr2).position.y,2)) int foodcount = Food_Num;; ExMessage msg = { 0 }; const char* names[AI_Num] = {"张轩","张航","李安琪","石智坤","老六","张凯","dgq","世界这么大还是遇见你","沉默不是代表你的错","王老五"}; IMAGE map(MAP_WIDTH, MAP_HEIGHT); POINT cameraPos;

class Sprite { public: Sprite() { position = { rand() % MAP_WIDTH, rand() % MAP_HEIGHT }; velocity = { 0,0 }; speed = 20; color = RGB(rand() % 256, rand() % 256, rand() % 256); radius = 30; islive = 1; strcpy(name, "ai"); foodaim = -1; } void setname(const char pname) { strcpy(name, pname); } void update() { position.x += velocity.x * speed; position.y += velocity.y * speed; } void sprite_keyboardControl() { if (msg.message == WM_KEYDOWN) { switch (msg.vkcode)//虚拟键值 { case VK_UP: velocity.y = -1; break; case VK_DOWN: velocity.y = 1; break; case VK_LEFT: velocity.x = -1; break; case VK_RIGHT: velocity.x = 1; break; } } else if (msg.message = WM_KEYUP) { switch (msg.vkcode) { case VK_UP: velocity.y = 0; break; case VK_DOWN: velocity.y = 0; break; case VK_LEFT: velocity.x = 0; break; case VK_RIGHT: velocity.x = 0; break; } } } POINT position;//位置 POINT velocity; int speed;//速度 COLORREF color; float radius; char name[20]; bool islive; int foodaim; }; class food { public: food() { position = { rand() % MAP_HEIGHT,rand() %MAP_WIDTH }; radius = rand() % 4 + 1; color = RGB(rand() % 256, rand() % 256, rand() % 256); islive = 1; } POINT position; float radius; COLORREF color; bool islive; }; void draw() { //设置颜色234 241 252 setlinecolor(RGB(234, 241, 252)); //绘制格子 for (int i = 0; i < MAP_HEIGHT / 10; i++) { line(0, i * 10, MAP_WIDTH, i10); } for (int i = 0; i < MAP_WIDTH / 10; i++) { line(i10, 0,i10, MAP_HEIGHT); } } void drawsprite(Spritepthis) { if (pthis->islive) { //setfillcolor(RGB(rand() % 256, rand()%256, rand() % 256));宇宙超级无敌至尊七彩皮肤 setfillcolor(pthis->color); solidcircle(pthis->position.x, pthis->position.y, pthis->radius); //设置文字颜色 settextcolor(RGB(rand()%256, rand()%256, rand()%256)); //settextcolor(RGB(rand()%256, rand()%256, rand()%256)); //设置文字背景透明 setbkmode(TRANSPARENT); //设置文字样式 settextstyle(28, 0, "行楷"); outtextxy(pthis->position.x-textwidth(pthis->name)/2, pthis->position.y-textheight(pthis->name)/2, pthis->name); } } void drawfood(food pthis) { if (pthis->islive) { setfillcolor(pthis->color); solidcircle(pthis->position.x, pthis->position.y, pthis->radius); } } //void draw()主函数中部分功能封装 //{ // //开启批量绘图 // BeginBatchDraw(); // cleardevice(); // // if (peekmessage(&msg)) // { // player.sprite_keyboardControl(); // } // player.update(); // for (int i = 0; i < Food_Num; i++) // { // drawfood(foods + i); // } // drawplayer(&player); // // // //结束批量绘图 // EndBatchDraw(); // //} void chase(Sprite& run, Sprite* chase) { if (chase->position.x < run.position.x) { chase->position.x+=2; } else { chase->position.x-=2; } if (chase->position.y< run.position.y) { chase->position.y+=2; } else { chase->position.y-=2; } } void AImove(Sprite* p1, Sprite& p2)//p1实参传入AI { //让AI追食物(也可AI追玩家,AI追AI) for (int i = 0; i < AI_Num; i++) { if (p1[i].islive) { /if (p1[i].foodaim!=-1&&p2[p1[i].foodaim].islive) { chase(p2+p1[i].foodaim, p1+i); } else { p1[i].foodaim = rand() % Food_Num; }/ chase(p2, p1+i); } } } void eatfood(Sprite &p1,food p2)// { for (int i = 0; i < Food_Num; i++) { //食物和玩家的距离小于等于玩家的半径时玩家“吃”食物 if (p2[i].islive&&TwoPointDistance(p1, p2[i]) < p1.radius)//if中的islive是为了防止food被吃过一次后还会被吃 { //player增大 p1.radius += p2[i].radius /4; //食物消失:1.player再次到该位置时不会再次增大2。再次draw时不会被画出 //随机再生成这个被吃的食物 //p2[i].position = { rand() % getwidth(),rand() % getheight() };//旧食物消失和生成新食物同步进行 p2[i].islive = 0; foodcount--; if (foodcount < 100) { p2[i].position = { rand() % getwidth(),rand() % getheight() }, p2[i].islive = 1; } break; } } } void AIeatfood(Sprite p1, food* p2) { for (int j = 0; j < AI_Num; j++) { for (int i = 0; i < Food_Num; i++) { if (p2[i].islive && TwoPointDistance(p1[j], p2[i]) < p1[j].radius)//if中的islive是为了防止food被吃过一次后还会被吃 { p1[j].radius += p2[i].radius / 4; p2[i].islive = 0; foodcount--; if (foodcount < 100) { p2[i].position = { rand() % getwidth(),rand() % getheight() }, p2[i].islive = 1; } break; } } } } void eat_AI(Sprite& p1, Sprite* p2) { for (int i = 0; i < AI_Num; i++) { //吃AI if (p1.islive && p2[i].islive && TwoPointDistance(p1, p2[i]) < p1.radius && p1.radius > p2[i].radius) { p2[i].islive = 0; p1.radius += p2[i].radius /8; } //AI吃 if (p1.islive && p2[i].islive && TwoPointDistance(p1, p2[i]) < p2[i].radius && p1.radius < p2[i].radius) { p1.islive = 0; p2[i].radius += p1.radius / 8; } for (int j = i+1; j < AI_Num; j++)//AI吃AI必须为双向比较:思路1(各AI见面1次)如下 //思路2(各AI见面2次):只做一次比较,但每个AI都作为比较者与被比较者各出现一次,j的值从0开始,且需考虑与自己比较的情况 { if (p2[i].islive && p2[j].islive && p2[i].radius < p2[j].radius && TwoPointDistance(p2[i], p2[j]) < p2[j].radius) { p2[i].islive = 0; p2[j].radius += p2[i].radius / 4; } else if (p2[i].islive && p2[j].islive && p2[i].radius > p2[j].radius && TwoPointDistance(p2[i], p2[j]) < p2[i].radius) { p2[j].islive = 0; p2[i].radius += p2[j].radius / 4; }

} }

}

//神奇小妖怪 int main() { //bgm mciSendString("open BGM.mp3", NULL, NULL, NULL); mciSendString("play BGM.mp3 ", NULL, NULL, NULL);

initgraph(WIDTH,HEIGHT, EX_SHOWCONSOLE); //玩家 Sprite player; //设置文字样式 settextstyle(28, 0, "行楷"); strcpy(player.name, "蔡宇航"); //食物 srand(time(NULL));//随机数种子 food foods[Food_Num]; //AI Sprite AI[AI_Num]; for (int i = 0; i < AI_Num; i++) { strcpy(AI[i].name, names[i]); AI[i].radius =30; } //进入游戏 while (true) { //开启批量绘图 BeginBatchDraw(); //设置绘制的背景图片 SetWorkingImage(&map); setbkcolor(WHITE); cleardevice(); //keyboardcontrol if (peekmessage(&msg)) { player.sprite_keyboardControl(); } //update player.update(); eatfood(player, foods); eat_AI(player, AI); AIeatfood(AI, foods); AImove(AI, player); //draw draw(); /*SetWorkingImage(); putimage(0, 0, WIDTH, HEIGHT, &map, cameraPos.x, cameraPos.y);*/ /*{ cameraPos.x = player.position.x - WIDTH / 2; cameraPos.y = player.position.y - HEIGHT / 2; }*/ for (int i = 0; i < Food_Num; i++) { drawfood(foods + i); } for (int i = 0; i < AI_Num; i++) { drawsprite(AI + i); } drawsprite(&player); SetWorkingImage(); putimage(0,0, WIDTH, HEIGHT, &map, cameraPos.x, cameraPos.y); { cameraPos.x = player.position.x - WIDTH / 2; cameraPos.y = player.position.y - HEIGHT / 2; if (cameraPos.x < 0) { cameraPos.x = 0; } if (cameraPos.y < 0) { cameraPos.y = 0; } if (cameraPos.x > MAP_WIDTH-WIDTH) { cameraPos.x = MAP_WIDTH - WIDTH ; } if (cameraPos.y > MAP_HEIGHT-HEIGHT) { cameraPos.y = MAP_HEIGHT - HEIGHT; } } //结束批量绘图 EndBatchDraw(); //产生延迟 Sleep(20); } getchar(); return 0;

}



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3