C++基于easyx圖形庫(kù)實(shí)現(xiàn)打磚塊游戲
本文實(shí)例為大家分享了C++基于easyx實(shí)現(xiàn)打磚塊的具體代碼,供大家參考,具體內(nèi)容如下
代碼:
#include <graphics.h> #include <ctime> #include <iostream> #include <cassert> using namespace std; ? class Board { public: ?? ?int x; ?? ?int y; ?? ?int w; ?? ?int h; ?? ?COLORREF color; }; ? class Board* createBoard(int x, int y, int w, int h, COLORREF color) { ?? ?Board* board = new Board; ?? ?assert(board); ?? ?board->x = x; ?? ?board->y = y; ?? ?board->w = w; ?? ?board->h = h; ?? ?board->color = color; ?? ?return board; } ? class Ball { public: ?? ?int x; ?? ?int y; ?? ?int r; ?? ?int dx; ?? ?int dy; ?? ?unsigned long color; }; ? class Ball* createBall(int x, int y, int r, int dx, int dy, unsigned long color) { ?? ?Ball* pBall = new Ball; ?? ?assert(pBall); ?? ?pBall->x = x; ?? ?pBall->y = y; ?? ?pBall->r = r; ?? ?pBall->dx = dx; ?? ?pBall->dy = dy; ?? ?pBall->color = color; ?? ?return pBall; } ? class Map { public: ?? ?Map() {} ?? ? ?? ?//初始化地圖 ?? ?void initMap(int map[][8], int row, int cols); ?? ?//繪制地圖 ?? ?void drawMap(int map[][8], int row, int cols); ?? ?//繪制木板 ?? ?void drawBoard(Board* pBoard); ?? ?//繪制球 ?? ?void drawBall(Ball* pBall); }; ? ? ? class Move { public: ?? ? ?? ?//移動(dòng)球 ?? ?void moveBall(Ball* pBall, Board* pBaord, int map[][8], int row, int cols); ?? ?//球擊中木板后 ?? ?int hitBoard(Ball* pBall, Board* pBoard); ?? ?//球擊中墻后 ?? ?int hitBricks(Ball* pBall, int map[][8], int row, int cols); }; ? ? class System { public: ?? ?//按鍵操作,控制木板左右移 ?? ?void keyDown(Board* pBoard); ? ?? ?//計(jì)時(shí)器 ?? ?int Timer(int duration, int id); ? ?? ?//游戲結(jié)束 ?? ?int gameOver(Ball* pBall, Board* pBoard); ? ?? ?//游戲結(jié)束的文字顯示 ?? ?void outtextxyInfo(int x, int y, const char* info); ? ?? ?//游戲勝利 ?? ?int windGame(int map[][8], int row, int cols); ? }; ? void Map::drawBoard(Board* pBoard) { ?? ?setfillcolor(pBoard->color); ?? ?//木板的x , y 坐標(biāo) , 木板的坐標(biāo)加上 寬度 和高度? ?? ?solidrectangle(pBoard->x, pBoard->y, pBoard->x + pBoard->w, pBoard->y + pBoard->h); } ? void Map::initMap(int map[][8], int row, int cols) { ?? ?for (int i = 0; i < row; i++)? ? ?? ?{ ?? ??? ?for (int j = 0; j < cols; j++) ?? ??? ?{ ?? ??? ??? ?map[i][j] = rand() % 3 + 1; //[1,3] ?? ??? ?} ?? ?} } ? void Map::drawMap(int map[][8], int row, int cols) { ?? ?setlinecolor(BLACK); ?? ?for (int i = 0; i < row; i++) ?? ?{ ?? ??? ?for (int j = 0; j < cols; j++) ?? ??? ?{ ?? ??? ??? ?int x = 100 * j; ?? ??? ??? ?int y = 25 * i; ?? ??? ??? ?switch (map[i][j]) ?? ??? ??? ?{ ?? ??? ??? ?case 0: ?? ??? ??? ??? ?break; ?? ??? ??? ?case 1: ?? ??? ??? ??? ?setfillcolor(RGB(255, 255, 85)); ?? ??? ??? ??? ?fillrectangle(x, y, x + 100, y + 25); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 2: ?? ??? ??? ??? ?setfillcolor(RGB(85, 255, 85)); ?? ??? ??? ??? ?fillrectangle(x, y, x + 100, y + 25); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 3: ?? ??? ??? ??? ?setfillcolor(RGB(85, 85, 255)); ?? ??? ??? ??? ?fillrectangle(x, y, x + 100, y + 25); ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ?} } ? void System::keyDown(Board* pBoard)? { ?? ?//修改木板的坐標(biāo) ?? ?//_getch() ?? ?//使用異步處理函數(shù) , 按鍵控制 ?? ?if((GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) && pBoard->x > 0)? ?? ?{ ?? ??? ?pBoard->x -= 1; ?? ?} ?? ?if((GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT))&& pBoard->x + pBoard->w < 800)? ?? ?{ ?? ??? ?pBoard->x += 1; ?? ?} } ? void Map::drawBall(Ball* pBall)? { ?? ?//setfillcolor(pBall->color); ?? ?setfillcolor(RGB(rand() % 255, rand() % 255 , rand() % 255)); //隨機(jī)顏色 ?? ?solidcircle(pBall->x, pBall->y, pBall->r); } ? void Move::moveBall(Ball* pBall, Board* pBoard, int map[][8], int row, int cols)? { ?? ?//碰撞反彈,? ?? ?/*if(pBall->x - pBall->r <= 0 || pBall->x + pBall->r >= 800)? ?? ?{ ?? ??? ?pBall->dx = -pBall->dx; ?? ?} ?? ?if(pBall->y - pBall->r <= 0 || pBall->y + pBall->r >=600 )? ?? ?{ ?? ??? ?pBall->dy = -pBall->dy; ?? ?}*/ ?? ? ?? ?if (pBall->x - pBall->r <= 0 || pBall->x + pBall->r >= 800) ?? ?{ ?? ??? ?pBall->dx = -pBall->dx; ?? ?} ? #if 0 ?? ?if (pBall->y - pBall->r <= 0 || hitBoard(pBall, pBoard)) ?? ?{ ?? ??? ?cout << "發(fā)生碰撞" << endl; ?? ??? ?cout << "沒(méi)有發(fā)生反射" << endl; ?? ??? ?pBall->dy = -pBall->dy; ?? ?} #else ?? ?if(pBall->y - pBall->r <= 0? ?? ?|| pBall->y + pBall->r >= 600? ?? ?|| hitBoard(pBall,pBoard) ?? ?|| hitBricks(pBall,map,row,cols)) ?? ?{ ?? ??? ?cout << "發(fā)生碰撞" << endl; ?? ??? ?pBall->dy = -pBall->dy; ?? ?} #endif ?? ?pBall->x += pBall->dx; ?? ?pBall->y += pBall->dy; ?? ?? } ? int System::Timer (int duration,int id)? { ?? ?static int startTime[10];?? ?//靜態(tài)變量自動(dòng)初始化為零 ?? ?//用靜態(tài)變量是因?yàn)橐涗浬弦淮蔚倪\(yùn)行結(jié)果 ? ?? ?int endTime = clock(); ?? ?if(endTime - startTime[id] >= duration)? ?? ?{ ?? ??? ?//下一次開始的時(shí)間編程變成一次結(jié)束的時(shí)間 ?? ??? ?startTime[id] = endTime; ?? ??? ?return 1; ?? ?} ?? ?return 0; } ? int Move::hitBoard(Ball* pBall, Board* pBoard) { ? #if 0 ?? ?if(pBall->y + pBall->r == pBoard->y)? ?? ?{ ?? ??? ?if(pBall->x > pBoard->x && pBall->x < pBoard->x + pBoard->w)? ?? ??? ?{ ?? ??? ??? ?cout << "發(fā)生碰撞" << endl; ?? ??? ??? ?return 1; ?? ??? ?} ?? ??? ?else? ?? ??? ?{ ?? ??? ??? ?cout << "碰撞出錯(cuò)" << endl; ?? ??? ?} ?? ?} #else ?? ?if (pBall->y + pBall->r == pBoard->y) ?? ?{ ?? ??? ?if (pBall->x > pBoard->x && pBall->x <= pBoard->x + pBoard->w) ?? ??? ?{ ?? ??? ??? ?cout << "發(fā)生碰撞" << endl; ?? ??? ??? ?return 1; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?cout << "碰撞出錯(cuò)" << endl; ?? ??? ?} ?? ?} #endif ? ?? ?return 0; } ? int Move::hitBricks(Ball* pBall,int map[][8],int row,int cols) { ?? ?int j = pBall->x / 100; ?? ?int i = (pBall->y - pBall->r) / 25; ?? ?if(i < row && j < cols && map[i][j] != 0)? ?? ?{ ?? ??? ?map[i][j] = 0; ?? ??? ?return 1; ?? ?} ?? ?return 0; } ? int System::gameOver(Ball* pBall,Board* pBoard) { ?? ?if(pBall->y + pBall->r > pBoard->y)? ?? ?{ ?? ??? ?return 1; ?? ?} ?? ?return 0; } ? int System::windGame(int map[][8], int row, int cols) { ?? ?for(int i = 0; i < row; ++i)? ?? ?{ ?? ??? ?for(int j = 0; j < cols; ++j)? ?? ??? ?{ ?? ??? ??? ?if(map[i][j] !=0)? ?? ??? ??? ?{ ?? ??? ??? ??? ?return 0; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?return 1; } ? void System::outtextxyInfo(int x, int y, const char* info) { ?? ?settextstyle(45, 0, "楷體"); ?? ?settextcolor(RED); ?? ?outtextxy(x, y, info); } ? int main()? { ?? ?Map init; ?? ?Move move; ?? ?System psystem; ?? ?System judge; ?? ?srand((unsigned int)time(NULL)); ?? ?initgraph(800, 600); ?? ?int map[5][8]; ?? ?Board* pBoard = createBoard(300, 600 - 25, 200, 25, BLUE); ?? ?Ball* pBall = createBall(400, 300, 10, 15, -5, RED); ?? ?init.initMap(map, 5, 8); ?? ?BeginBatchDraw(); ?? ?while (true) ?? ?{? ?? ??? ?cleardevice();?? ? ?? ??? ?init.drawMap(map, 5, 8); ?? ??? ?init.drawBoard(pBoard); ?? ??? ?init.drawBall(pBall); ?? ??? ?if (judge.Timer(20, 0)) ?? ??? ??? ?move.moveBall(pBall, pBoard, map, 5, 8); ?? ??? ?judge.keyDown(pBoard); ?? ??? ?//Sleep(10);?? ??? ? ?? ??? ?if (judge.gameOver(pBall, pBoard))? ?? ??? ?{ ?? ??? ??? ?psystem.outtextxyInfo(300, 350, "游戲失敗"); ?? ??? ??? ?FlushBatchDraw(); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?if (judge.windGame(map, 5, 8))? ?? ??? ?{ ?? ??? ??? ?psystem.outtextxyInfo(300, 350, "游戲勝利"); ?? ??? ??? ?FlushBatchDraw(); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?FlushBatchDraw(); ?? ?? ?} ?? ?Sleep(5000); ?? ?EndBatchDraw(); ? ? ? ?? ?? ? ?? ?closegraph(); ?? ?return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C語(yǔ)言中參數(shù)的傳值問(wèn)題
C語(yǔ)言中參數(shù)的傳值一直比較含糊,今天在網(wǎng)上看到三個(gè)面試題的詳解,感覺(jué)講的很好,就拿來(lái)記下,方便學(xué)習(xí)和記憶2013-10-10C語(yǔ)言實(shí)現(xiàn)刪除某一個(gè)數(shù)組值的方法
這篇文章主要給大家分享C語(yǔ)言數(shù)組中刪除數(shù)組中某個(gè)值的方法,既然要學(xué)習(xí)刪除數(shù)組中的元素,我們就必須得先知道數(shù)組中有哪些元素。同時(shí)還要定義一個(gè)變量,并將需要?jiǎng)h除的元素賦值給那個(gè)變量。下面來(lái)看看文章的詳細(xì)內(nèi)容吧2021-11-11編譯錯(cuò)誤error: stray ‘\343’in program的解決方法
以下是對(duì)編譯錯(cuò)誤error: stray ‘\343’in program的解決方法進(jìn)行了詳細(xì)的分析介紹,如遇此問(wèn)題的朋友們可以過(guò)來(lái)參考下2013-07-07QT中窗口關(guān)閉自動(dòng)銷毀的實(shí)現(xiàn)示例
這篇文章主要介紹了QT中窗口關(guān)閉自動(dòng)銷毀,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)計(jì)算圓周長(zhǎng)以及面積方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11