码迷,mamicode.com
首页 > 编程语言 > 详细

C++小游戏BrickHit

时间:2018-02-11 16:21:25      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:rtb   int   mes   ons   rtc   窗口   oid   清除   UI   

打砖块小游戏。材料:EasyX图形库。

碰撞的处理,木板移动方法还需要优化。

  1 //定义 Circle,Brick,Broad
  2 #include<cmath>
  3 #include<graphics.h>
  4 
  5 #ifndef _PROPERTY_H_
  6 #define _PROPERTY_H_
  7 struct Circle {
  8     int x0, y0, r;
  9     int mvX, mvY;
 10     COLORREF color;
 11     virtual ~Circle() {}
 12     Circle(int x0_, int y0_, int r_, int mvX_, int mvY_, COLORREF color_)
 13         :x0(x0_), y0(y0_), r(r_), mvX(mvX_), mvY(mvY_), color(color_) {}
 14     //小球起始位置
 15     void prtCirl() {
 16         setfillcolor(color);
 17         solidcircle(x0, y0, r);
 18     }
 19     //小球的移动
 20     void CirlMove() {
 21         setfillcolor(BLACK);
 22         solidcircle(x0, y0, r);
 23         x0 += mvX;
 24         y0 += mvY;
 25         setfillcolor(color);
 26         solidcircle(x0, y0, r);
 27     }
 28     //判断小球是否离开宽口内。
 29     //参数:窗口左上坐标、宽、高。
 30     //离开返回真。
 31     bool IsCirlQuit(int x, int y, int width, int height) {
 32         if (x0 - x <= r && mvX < 0) {
 33             mvX = -mvX;
 34             return false;
 35         }
 36         else if (x + width - x0 <= r && mvX > 0) {
 37             mvX = -mvX;
 38             return false;
 39         }
 40         else if (y0 - y <= r && mvY < 0) {
 41             mvY = -mvY;
 42             return false;
 43         }
 44         else if (y + height - y0 <= r)
 45             return true;
 46         return false;
 47     }
 48 };
 49 struct Brick {
 50     int x0, y0;
 51     COLORREF color;
 52     int height, width;
 53     virtual ~Brick() {}
 54     Brick(int x0_, int y0_, int width_, int height_, COLORREF color_)
 55         :x0(x0_), y0(y0_), width(width_), height(height_), color(color_) {}
 56     //砖块的绘制
 57     void prtBrick() {
 58         setfillcolor(color);
 59         solidrectangle(x0, y0, x0 + width, y0 + height);
 60     }
 61     //判断砖块是否与小球发生碰撞
 62     //参数:小球
 63     //发生碰撞返回真
 64     bool IsCrashCirl(Circle &arg) {
 65         if (arg.x0 + arg.r < x0 || x0 + width < arg.x0 - arg.r)
 66             return false;
 67         int disY = min(abs(y0 - arg.y0), abs(y0 + height - arg.y0));
 68         if (disY <= arg.r) {
 69             arg.mvY = -arg.mvY;
 70             return true;
 71         }
 72         return false;
 73     }
 74     //砖块的清除
 75     void BrickClr() {
 76         setfillcolor(BLACK);
 77         solidrectangle(x0, y0, x0 + width, y0 + height);
 78     }
 79 };
 80 struct Broad :public Brick{
 81     int mvX;
 82     int floor, ceiling;
 83     virtual ~Broad() {}
 84     Broad(int x0_, int y0_, int width_, int height_, int mvX_,
 85         int floor_, int ceiling_, COLORREF color_)
 86         :Brick(x0_, y0_, width_, height_, color_), mvX(mvX_), floor(floor_), ceiling(ceiling_) {}
 87     //重载,判断木板是否与小球发生碰撞
 88     //参数:小球
 89     //发生碰撞返回真
 90     bool IsCrashCirl(Circle &arg) {
 91         if (arg.x0 + arg.r < x0 || x0 + width < arg.x0 - arg.r)
 92             return false;
 93         if (y0 - arg.y0 <= arg.r&&arg.mvY > 0) {
 94             arg.mvY = -arg.mvY;
 95             return true;
 96         }
 97         return false;
 98     }
 99     //木板移动
100     void BroadMove() {
101         POINT point;
102         GetCursorPos(&point);
103         if (x0 <= point.x&&point.x <= x0)
104             return; 
105         BrickClr();
106         if (point.x < x0)
107             x0 = max(x0 - mvX, floor);
108         else
109             x0 = min(x0 + mvX, ceiling - width);
110         setfillcolor(color);
111         solidrectangle(x0, y0, x0 + width, y0 + height);
112     }
113 };
114 #endif // _PROPERTY_H_
//Main.cpp
#include<list>
#include<algorithm>
#include"property.cpp"
using namespace std;

const int WndW = 400, WndH = 400; //窗口大小
list<Brick> CreatBricks();
bool theGame(list<Brick> &MyBrks, Broad &MyBrd, Circle&MyCirl);

int main() { 
    //brick布局
    list<Brick> MyBrks = move(CreatBricks());
    //broad:60*20,移速5,WHITE
    Broad MyBrd(WndW/2 - 30, WndH - 20, 60, 20, 5, 0, WndW, WHITE);
    //circle:半径5,移速5,DARKGRAY
    Circle MyCirl(WndW/2 - 10, WndH - 20 - 10, 10, 5, 5, DARKGRAY);
    HWND Hwnd = initgraph(WndW, WndH);
    bool GameOver = theGame(MyBrks, MyBrd, MyCirl);
    if (GameOver)
        MessageBox(Hwnd, L"u Win!", L"BrickHit",MB_OK);
    else
        MessageBox(Hwnd, L"default!", L"BrickHit", MB_OK);
    closegraph();
    return 0;
}
//bricks的实现
list<Brick> CreatBricks() {
    //brick信息:5行10列,40*10
    int Row = 5, Col = 10;
    int BrickW = WndW / Col;
    int BrickH = 10;
    list<Brick> MyBrks;
    bool ColChoice = true;
    for (int i = Row - 1; i >= 0; i--) {
        ColChoice = !ColChoice;
        for (int j = 0; j < Col; j++)
            switch (ColChoice) {
            case true:
                MyBrks.push_back({ BrickW*j,BrickH*i,BrickW,BrickH,LIGHTGREEN });
                ColChoice = !ColChoice;
                break;
            case false:
                MyBrks.push_back({ BrickW*j,BrickH*i,BrickW,BrickH,LIGHTCYAN }); 
                ColChoice = !ColChoice;
                break;
            }
    }
    return MyBrks;
}
//游戏的实现
bool theGame(list<Brick> &MyBrks, Broad &MyBrd, Circle&MyCirl) {
    //游戏起始界面
    for_each(MyBrks.begin(), MyBrks.end(), [](Brick it) { it.prtBrick(); });
    MyBrd.prtBrick();
    MyCirl.prtCirl();
    //游戏循环
    while (!MyBrks.empty()) {
        MyCirl.CirlMove();
        MyBrd.BroadMove();
        if (MyCirl.IsCirlQuit(0, 0, WndW, WndH))
            return false;
        MyBrd.IsCrashCirl(MyCirl);
        auto theBrick = find_if(MyBrks.begin(), MyBrks.end(),
            [&MyCirl](Brick it) { return it.IsCrashCirl(MyCirl); });
        if (theBrick != MyBrks.end()) {
            theBrick->BrickClr();
            MyBrks.erase(theBrick);
        }
        Sleep(30);
    }
    return true;
}

2018-02-11

C++小游戏BrickHit

标签:rtb   int   mes   ons   rtc   窗口   oid   清除   UI   

原文地址:https://www.cnblogs.com/WYK-paint/p/8441455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!