C/C++編程筆記:C語言開發球球大做戰(源碼分享),你想試試嗎?

遊戲背景

《球球大做戰》是Superpop一款自主研du發的免費手機網絡遊戲。 以玩家間的實時互動PK產生遊戲樂趣爲設計宗旨,經過簡單的規則將玩家操做直接轉化爲遊戲策略,體驗智謀碰撞的戰鬥樂趣。   算法

遊戲的基本操做包括鍵盤按下(上下左右四個方向,還有做弊測試按鍵空格鍵和A鍵),玩家能夠在地圖上隨意移動,不過不能超出邊界。無論是玩家仍是AI均可以吃比本身小的球,反之也能夠被吃,吃掉以後直徑會增大,增大算法是被吃掉的半徑的1/4。若是玩家被吃掉,會在任意地方從新開始。編程

那麼今天,咱們就用C語言,來寫出咱們的球球大做戰,一塊兒來看看吧!數組

效果展現

遊戲步驟

球球大做戰遊戲分爲幾個步驟:微信

①使用自定義空白圖片表示地圖;②繪製玩家,食物;③處理玩家移動,以及吃食物判斷;④繪製一個AI並實現其移動;網絡

話很少說,接下來咱們之間來看咱們的代碼吧!須要素材以及相關資料源碼能夠關注微信公衆號輸入關鍵詞領取,那先來看看代碼吧!ide

源碼分享

#include<graphics.h> //包含easyx圖形庫文件
#include<time.h>     //C語言時間頭文件
#include<mmsystem.h>//win32多媒體設備接口文件
#pragma comment(lib,"winmm.lib")//win32多媒體設備接口庫
#define WIN_WIDTH  1024  //屏幕的寬
#define WIN_HEIGHT 640//576 //屏幕高
#define MAP_WIDTH  (WIN_WIDTH*3) //地圖寬度
#define MAP_HEIGHT (WIN_HEIGHT*3)//地圖高度
#define FOOD_NUM 500  //食物數量
#define AI_NUM 200    //ai數量 IMAGE map(MAP_WIDTH, MAP_HEIGHT); POINT g_CameraPos; // 攝像機(屏幕左上角)在地圖上的位置
struct Ball { bool    flag;    // 是否被吃 活 1,死 0
    COLORREF  color;    // 顏色
    float    r;      //     float    x;      // 座標
    float y; int      type;       //食物獨有屬性,決定是什麼類型的食物(圓?矩形?多邊形?)
}; struct Ball mover; //玩家
struct Ball food[FOOD_NUM]; //食物數組
struct Ball ai[AI_NUM]; //AI數量
void ChaseAlgorithom(Ball *chase, Ball *run); float DisTance(Ball b1, Ball b2); void Gameinit() { //設置隨機數種子
 srand((unsigned)time(NULL)); //播放背景音樂
    mciSendString("open BallGame.mp3 alias bk", 0, 0, 0); mciSendString("play bk repeat", 0, 0, 0); //初始化食物
    for (int i = 0; i < FOOD_NUM; i++) { food[i].x = (float)(rand() % MAP_WIDTH); food[i].y = (float)(rand() % MAP_HEIGHT); food[i].r = (float)(rand() % 5 + 1); food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);  // 隨機顏色
        food[i].flag = 1; food[i].type = rand() % 3; } //初始化AI
    for (int i = 0; i < AI_NUM; i++) { ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);   //rand()%256 隨機取值 0-255
        ai[i].flag = 1; ai[i].x = rand() % (MAP_WIDTH - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5);   //AI產生的位置不會出現一個越界
        ai[i].y = rand() % (MAP_HEIGHT - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5); ai[i].r = float(rand() % 10 + 10); } {//初始化玩家數據
        mover.color = BLUE; mover.r = 10; //玩家在窗口的位置
        mover.x = rand() % WIN_WIDTH; mover.y = rand() % WIN_HEIGHT; mover.flag = 1; } } //遊戲地圖開始繪製位置判斷
void computeCameraPos() { // 以人物位置爲中心計算攝像機的理論位置
    g_CameraPos.x = mover.x - WIN_WIDTH / 2; g_CameraPos.y = mover.y - WIN_HEIGHT / 2; // 防止攝像機越界
    if (g_CameraPos.x < 0)    g_CameraPos.x = 0; if (g_CameraPos.y < 0)    g_CameraPos.y = 0; if (g_CameraPos.x > MAP_WIDTH - WIN_WIDTH)  g_CameraPos.x = MAP_WIDTH - WIN_WIDTH; if (g_CameraPos.y > MAP_HEIGHT - WIN_HEIGHT)  g_CameraPos.y = MAP_HEIGHT - WIN_HEIGHT; } //遊戲繪製
void Gamedraw() { SetWorkingImage(&map); setbkcolor(WHITE); // 白色背景
 cleardevice(); //畫食物
    for (int i = 0; i < FOOD_NUM; i++) { if (food[i].flag == 1) { setfillcolor(food[i].color); if (food[i].type == 0) { solidellipse((int)food[i].x, (int)food[i].y, (int)(food[i].x + food[i].r), (int)(food[i].y + food[i].r)); } else if (food[i].type == 1) { solidpie((int)food[i].x, (int)food[i].y, (int)(food[i].x + food[i].r), (int)(food[i].y + food[i].r), 0.0, 1.5); } else { solidcircle(int(food[i].x), int(food[i].y), int(food[i].r)); } } else { food[i].x = (float)(rand() % MAP_WIDTH); food[i].y = (float)(rand() % MAP_HEIGHT); food[i].r = (float)(rand() % 5 + 1); food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);  // 隨機顏色
            food[i].flag = 1; food[i].type = rand() % 3; } } //畫AI
    for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag == 1) { setfillcolor(ai[i].color); solidcircle(ai[i].x, ai[i].y, ai[i].r); } else { ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);   //rand()%256 隨機取值 0-255
            ai[i].flag = 1; ai[i].x = rand() % (MAP_WIDTH - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5);   //AI產生的位置不會出現一個越界
            ai[i].y = rand() % (MAP_HEIGHT - int(ai[i].r + 0.5)) + int(ai[i].r + 0.5); ai[i].r = float(rand() % 10 + 10); } } //繪製玩家
 setfillcolor(RED); fillcircle(mover.x, mover.y, mover.r); //繪製玩家名稱
 settextcolor(BLACK); setbkmode(TRANSPARENT); settextstyle(20, 0, "楷體"); char pname[] = "微信公衆號:C語言編程學習基地"; int twidth = textwidth(pname) / 2;//計算文字寬度爲了居中顯示在玩家中央
    outtextxy(mover.x - twidth, mover.y, pname); //恢復默認工做區,即窗口
 SetWorkingImage(); //更新攝像機位置
 computeCameraPos(); //把地圖顯示到窗口上
    putimage(0, 0, WIN_WIDTH, WIN_HEIGHT, &map, g_CameraPos.x, g_CameraPos.y); } //玩家移動,參數爲玩家移動的速度(單位像素)
void Gamemove(int speed) { //獲取鍵盤按鍵
    if (GetAsyncKeyState(VK_UP) & 0x8000) { if (mover.y - mover.r > 0) { mover.y -= speed; } } if (GetAsyncKeyState(VK_DOWN) & 0x8000) { if (mover.y + mover.r < MAP_HEIGHT) { mover.y += speed; } } if (GetAsyncKeyState(VK_LEFT) & 0x8000) { if (mover.x - mover.r > 0) { mover.x -= speed; } } if (GetAsyncKeyState(VK_RIGHT) & 0x8000) { if (mover.x + mover.r < MAP_WIDTH) { mover.x += speed; } } //做弊測試,按空格不斷增大,A縮小
    if (GetAsyncKeyState(VK_SPACE) & 0x8000) { mover.r += 3; } if (GetAsyncKeyState('A') & 0x8000) { if (mover.r > 1) mover.r -= 1; } } //玩家吃食物
void EatFood() { for (int i = 0; i < FOOD_NUM; i++) { if (food[i].flag == 1 && DisTance(food[i], mover) < mover.r) { food[i].flag = 0; mover.r += food[i].r / 4; } } } //玩家吃Ai,Ai吃玩家
void EatAi() { for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag == 0) continue; //玩家吃Ai
        if (DisTance(ai[i], mover) < mover.r - ai[i].r / 3) { ai[i].flag = 0; mover.r += ai[i].r / 4; break;//吃到一個就退出
 } //ai吃玩家
        else if (DisTance(ai[i], mover) < ai[i].r - mover.r / 3) { mover.x = rand() % MAP_WIDTH; mover.y = rand() % MAP_HEIGHT; ai[i].r += mover.r / 4; mover.r = 10; break; } } } //AI吃食物,AI吃Ai
void AiEatFood() { for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag == 0) continue; //ai吃食物
        for (int j = 0; j < FOOD_NUM; j++) { if (food[j].flag == 1 && DisTance(ai[i], food[j]) < ai[i].r) { food[j].flag = 0; ai[i].r += food[i].r / 4; } } //Ai吃Ai
        for (int k = i + 1; k < AI_NUM; k++) { if (ai[k].flag == 1) { if (DisTance(ai[i], ai[k]) < ai[k].r - ai[i].r / 3) { ai[i].flag = 0; ai[k].r += ai[i].r / 4; } else if (DisTance(ai[i], ai[k]) < ai[i].r - ai[k].r / 3) { ai[k].flag = 0; ai[i].r += ai[k].r / 4; } } } } } //Ai移動算法,追逐比本身半徑小的球
void AiMove() { for (int i = 0; i < AI_NUM; i++) { double min_DISTANCE = MAP_WIDTH;//最大搜索距離
        int min = -1;//用來保存找到目標小球的下標
        if (ai[i].flag == 1) { //AI靠近AI
            for (int k = i + 1; k < AI_NUM; k++) { if (ai[i].r > ai[k].r&&ai[k].flag == 1) {//若是能吃,且距離達到要求則更新距離,並保存下標
                    if (DisTance(ai[i], ai[k]) < min_DISTANCE) { min_DISTANCE = DisTance(ai[i], ai[k]); min = k; } } } } //若是找到目標,則去追逐
        if ((min != -1)) { ChaseAlgorithom(&ai[i], &ai[min]); } } } void JudeEat() { EatFood(); EatAi(); AiEatFood(); AiMove(); } int main() { initgraph(WIN_WIDTH, WIN_HEIGHT, 1); Gameinit(); DWORD t1, t2; t1 = t2 = GetTickCount(); while (1) { Gamedraw(); Gamemove(1); if (t2 - t1 > 50) { JudeEat(); t1 = t2; } t2 = GetTickCount(); } getchar(); closegraph(); return 0; } //追逐算法
void ChaseAlgorithom(Ball *chase, Ball *run) { if (rand() % 2 == 0) { if (chase->x < run->x) { chase->x += 2; } else { chase->x -= 2; } } else { if (chase->y < run->y) { chase->y += 2; } else { chase->y -= 2; } } } //求兩點之間的距離
float DisTance(Ball b1, Ball b2) { return sqrt((b1.x - b2.x)*(b1.x - b2.x) + (b1.y - b2.y)*(b1.y - b2.y)); }

以上就是本篇文章的所有分享,但願對你們有幫助!學習

自學C/C++編程難度很大,不妨和一些志同道合的小夥伴一塊兒學習成長!測試

C語言C++編程學習交流圈子,【點擊進入】微信公衆號:C語言編程學習基地spa

有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!設計

相關文章
相關標籤/搜索