最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • C++ 網(wǎng)絡(luò)編程 總結(jié)

    C++ 網(wǎng)絡(luò)編程 總結(jié)

    這篇文章主要介紹了C++ 網(wǎng)絡(luò)編程的一些詳細相關(guān)內(nèi)容,有需要的小伙伴可以參考下。
    2015-06-06
  • C語言中函數(shù)的聲明、定義及使用的入門教程

    C語言中函數(shù)的聲明、定義及使用的入門教程

    這篇文章主要介紹了C語言中函數(shù)的聲明、定義及使用的入門教程,重點講述了main函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2015-12-12
  • 如何使用Qt實現(xiàn)實時數(shù)據(jù)動態(tài)繪制的折線圖效果

    如何使用Qt實現(xiàn)實時數(shù)據(jù)動態(tài)繪制的折線圖效果

    使用Qt的QChartView和定時器,本教程詳細介紹了如何動態(tài)繪制折線圖,通過定時器觸發(fā)數(shù)據(jù)點的動態(tài)添加和坐標軸范圍的自動調(diào)整,實現(xiàn)了實時更新數(shù)據(jù)的動態(tài)折線圖應(yīng)用,程序結(jié)合QLineSeries或QSplineSeries繪制折線或樣條曲線,配合動畫效果,展現(xiàn)數(shù)據(jù)變化
    2024-10-10
  • 馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現(xiàn)代碼

    馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現(xiàn)代碼

    這篇文章主要介紹了馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現(xiàn)代碼,需要的朋友可以參考下
    2014-08-08
  • 深入了解C++中map用法

    深入了解C++中map用法

    下面小編就為大家?guī)硪黄钊肓私釩++中map用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨想過來看看吧
    2016-06-06
  • CreateThread()與beginthread()的區(qū)別詳細解析

    CreateThread()與beginthread()的區(qū)別詳細解析

    很多開發(fā)者不清楚這兩者之間的關(guān)系,他們隨意選一個函數(shù)來用,發(fā)現(xiàn)也沒有什么大問題,于是就忙于解決更為緊迫的任務(wù)去了。等到有一天忽然發(fā)現(xiàn)一個程序運行時間很長的時候會有細微的內(nèi)存泄露,開發(fā)者絕對不會想到是因為這兩套函數(shù)用混的結(jié)果
    2013-09-09
  • VS Code如何編寫C/C++程序的實現(xiàn)步驟

    VS Code如何編寫C/C++程序的實現(xiàn)步驟

    本文主要介紹了VS Code如何編寫C/C++程序的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++線性時間的排序算法分析

    C++線性時間的排序算法分析

    這篇文章主要介紹了C++線性時間的排序算法分析,是非常經(jīng)典的非比較排序算法,對于C++程序員有很大的借鑒價值,需要的朋友可以參考下
    2014-08-08
  • 使用C語言實現(xiàn)CRC校驗的方法

    使用C語言實現(xiàn)CRC校驗的方法

    本篇文章是對使用C語言實現(xiàn)CRC校驗的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++輸入流和輸出流 超級詳細

    C++輸入流和輸出流 超級詳細

    C++ 的開發(fā)者認為數(shù)據(jù)輸入和輸出的過程也是數(shù)據(jù)傳輸?shù)倪^程,數(shù)據(jù)像水一樣從一個地方流動到另一個地方,所以 C++ 中將此過程稱為“流”,實現(xiàn)此過程的類稱為“流類”。下面小編將詳細介紹這個話題,需要的朋友可以參考一下
    2021-09-09

最新評論

怀来县| 澎湖县| 松桃| 珠海市| 赫章县| 防城港市| 霍山县| 扎赉特旗| 临猗县| 崇州市| 江陵县| 石台县| 长泰县| 苍溪县| 三门县| 凤山县| 石狮市| 页游| 丽水市| 蒙山县| 嘉善县| 团风县| 华池县| 徐水县| 莱西市| 雅安市| 班戈县| 永川市| 鹤庆县| 双桥区| 红原县| 都兰县| 旺苍县| 青田县| 呼伦贝尔市| 东兰县| 绍兴市| 佛冈县| 荥阳市| 新沂市| 会理县|