這篇文章主要為大家詳細介紹了C語言實現——《球球大作戰項目》,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下!在室友面前秀一下豈不是美滋滋!
游戲介紹:
這是一個大球吃小球的世界,玩家的目標是要努力吃成最大的球球。在游戲一開始,玩家出現在地圖上隨機位置,地圖里灑滿了小彩豆,玩家吃掉小彩豆體積就會增大,當增大到比別人的球大時,就可以吃別人的球啦,當然也得躲避更大的球。小球速度快,大球速度慢。球球到達一定重量后,可以分身,一個球變成等大的兩個球,可以再次分身,但是最多可以擁有16個分身。
本期就是帶著大家用C語言去開發一款自己寫的簡易版球球大作戰,一定要自己動手來寫喲~
本項目編譯環境:VS2019/VS2013;
插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領取;
配套講解教程:球球大作戰游戲教程——嗶哩嗶哩
源代碼示例:
//玩家,用圓表示,用變量表示玩家的坐標
struct Ball //定義小球的結構,玩家,ai,食物
{
int x;
int y;
int r;
bool 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 ./BallBGM.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);
}
}
//繪制智障
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(cameraPos.x, cameraPos.y, &map);
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
{
player.y += speed;
}
if (GetAsyncKeyState(VK_LEFT) && player.x - player.r >= 0)
{
player.x -= speed;
}
if (GetAsyncKeyState(VK_RIGHT) && player.x + player.r
{
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])
{
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語言
+關注
關注
180文章
7604瀏覽量
136713 -
代碼
+關注
關注
30文章
4780瀏覽量
68539
原文標題:C語言項目實戰:《球球大作戰》零基礎項目!185 行源代碼示例
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論