C++基于easyx圖形庫實現(xiàn)打磚塊游戲
更新時間:2022年05月11日 14:07:29 作者:麥克學肖邦
這篇文章主要為大家詳細介紹了C++基于easyx圖形庫實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++基于easyx實現(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: ?? ? ?? ?//移動球 ?? ?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); ? ?? ?//計時器 ?? ?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 坐標 , 木板的坐標加上 寬度 和高度? ?? ?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)? { ?? ?//修改木板的坐標 ?? ?//_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)); //隨機顏色 ?? ?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 << "沒有發(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)變量自動初始化為零 ?? ?//用靜態(tài)變量是因為要記錄上一次的運行結(jié)果 ? ?? ?int endTime = clock(); ?? ?if(endTime - startTime[id] >= duration)? ?? ?{ ?? ??? ?//下一次開始的時間編程變成一次結(jié)束的時間 ?? ??? ?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 << "碰撞出錯" << 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 << "碰撞出錯" << 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; }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
編譯錯誤error: stray ‘\343’in program的解決方法
以下是對編譯錯誤error: stray ‘\343’in program的解決方法進行了詳細的分析介紹,如遇此問題的朋友們可以過來參考下2013-07-07