当前位置: 首页 > article >正文

c语言通过easyx窗口实现小球打砖块的游戏

 (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

在学完easyx之后,我们可以结合c语言,实现更高层次的游戏开发,今天我们就以小球打砖块为例

首先就是常规引入相关的头文件

#include<stdio.h>
#include<graphics.h>  //便于引入easyx窗口及其函数
#include<conio.h>     //按键控制 

接下来就是对这个游戏的各个变量进行定义

包括Brick:砖块, Broad:木板, Ball_x:球的方向向量, circle_x:球心坐标

这里我们用define对各个变量进行定义

#define WINDOW_Width 700 //窗口宽度
#define WINDOW_Height 600//窗口高度
#define BrickWidth 50 //固定一个砖块的宽50  和高30 描述每一个砖块
#define BrickHeight 30//
#define Brick_ROWS 4  //砖块行
#define ZK_COLS 14    //砖块列
#define Broad_Width BrickWidth * 4//木板宽度
#define Broad_Height BrickHeight//木板高度
#define Radius 20     //球的半径

接下来就是对球和木板的坐标进行定义

int Broad_x = (WINDOW_Width - Broad_Width) / 2; //木板初始化
int  Broad_y = WINDOW_Height - Broad_Height;    
int circle_x = WINDOW_Width / 2;                             //球初始化
int  circle_y = WINDOW_Height - Radius - Broad_Height;
int Ball_x = 6;                                                            //球x方向向量   为+右,为-左
int Ball_y = -6;                                                            //球y方向向量  为+下,为-上 

 因为在后续的编写中,要考虑到砖块被消除的问题,所以我们这里定义砖块是否存在

int Brick[Brick_ROWS][ZK_COLS] = {0};//木板是否存在:1为不存在,0为存在 

接下来我们尝试画一个砖块

void DrawOneBrick(int x, int y)                  //xy下标                                            
{
    if (0 == Brick[y][x])
    {
        setlinecolor(BLACK);//线框颜色
        setfillcolor(RGB(250, 84, 101));//方块颜色
        fillrectangle(x * BrickWidth, y * BrickHeight, x *
            BrickWidth + BrickWidth, y * BrickHeight + BrickHeight);//(x1,y1),(x2,y2)方块大小
    }

如果你觉得颜色过于单调,可以改为

setfillcolor(RGB(rand()%255, rand() % 255, rand() % 255)) 

会有意想不到的色彩效果,哈哈哈哈哈 

然后就是全部砖块的绘制

void DrawAllBrick()
{
    for (int i = 0; i < Brick_ROWS; i++)
    {
        for (int j = 0; j < 14; j++)
            DrawOneBrick(j, i);
    }

 至于这里为什么先画一个砖块在绘制全部呢?是为了便于以后小球消砖块时可以一个一个消除而不会影响整体。

接下来就是绘制弹跳木板

void DrawDownBrick()
{
    setlinecolor(BLACK);//线框颜色
    setfillcolor(RGB(235, 107, 126));//木板颜色

    fillrectangle(Broad_x, Broad_y, Broad_x + Broad_Width, Broad_y + Broad_Height);//木板坐标

}

 接下来就是小球的绘制

void DrawCircle()
{
    setlinecolor(BLACK);
    setfillcolor(RGB(252, 190, 163));//红色
    fillcircle(circle_x, circle_y, Radius);//小球坐标和半径

}

 接着就是全部游戏的显示了,别忘了清屏和防止屏幕一闪一闪

 void GameDraw()
{
    BeginBatchDraw();//绘图前    防闪
    cleardevice();//清屏
    DrawAllBrick();//画全部方块
    DrawDownBrick();//画木板块
    DrawCircle();//画球
    EndBatchDraw(); //绘图后    防闪
}

 完成绘制之后,就要解决移动问题了,我们先来解决球的移动问题

void CircleMove()
{
    circle_x += Ball_x;
    circle_y += Ball_y;
}

以及球在运动中消砖块的情况 

int DisappearBrick()
{
    int ZK_COL = circle_x / BrickWidth;
    int ZK_ROW = circle_y / BrickHeight;

    if (ZK_ROW < 4 && ZK_COL < 14 && Brick[ZK_ROW][ZK_COL] == 0)
    {
        Brick[ZK_ROW][ZK_COL] = 1;
        return 1;
    }
    return 0;
}

 接下来就是球碰撞到边缘或者木板或者砖块时的运动情况

void CollisionDetection()
{
    HWND hwnd = GetHWnd();//获得一个窗口句柄,便于接下来弹出小窗口
    //球如果往右边移动,检测球是否撞上右边沿
    if (Ball_x > 0 && circle_x >= WINDOW_Width - Radius)
    {
        Ball_x = -6;
    }
    //球如果往上边移动,检测球是否撞上上边沿
    if (Ball_y < 0 && circle_y <= Radius || DisappearBrick())
    {
        Ball_y = 6;
    }
    //球如果往左边移动,检测球是否撞上左边沿
    if (Ball_x < 0 && circle_x <= Radius)
    {
        Ball_x = 6;
    }
    //球如果往下边移动,检测球是否撞上下边沿
    if (Ball_y > 0 && circle_y >= WINDOW_Height - Radius)
    {
        Ball_y = 0;
        Ball_x = 0;
        MessageBox(hwnd, "游戏结束", "出界", MB_OK);//弹出小窗口
    }
    //检测球是否撞上板子,只能从上往下撞,只有两种极限情况
    if ((Ball_y > 0) && (circle_y >= (Broad_y - Radius)) && //球y坐标
        (circle_x >= Broad_x) && (circle_x <= (Broad_x + Broad_Width)))
    {
        Ball_y = -6;
    }

}

接下来就是用键盘去操控木板的移动,如果大家对键盘操作不太明白,可以查阅(http://t.csdn.cn/QAMbU)

void KeyControl()
{
    CollisionDetection();    //不管有没有按键都要碰撞检测
    int ch;
    if (_kbhit())//检测是否有按键
    {                       
        ch = _getch();//获取按键的值
        switch (ch)
        {
        case 'a':
        case 'A':
        case 75:
            Broad_x -= 20;
            if (Broad_x <= 0)
            {
                Broad_x = 0;
            }
            break;
        case 'd':
        case 'D':
        case 77:
            Broad_x += 20;
            if (Broad_x >= 500)
            {
                Broad_x = 500;
            }
            break;
        }
    }

最后就是将一切汇总到主函数

int main()
{
    initgraph(WINDOW_Width, WINDOW_Height); //width宽 height高
    while (1)
    {
        GameDraw();
        CircleMove();
        KeyControl();
        DisappearBrick();
        Sleep(50);
    }
    return 0;

总体代码就是这样,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论

#include<stdio.h>
#include<graphics.h>  //便于引入easyx窗口及其函数
#include<conio.h>     //按键控制 
//Brick:砖块 Broad:木板 Ball_x:球的方向向量 circle_x:球心坐标
#define WINDOW_Width 700 //窗口宽度
#define WINDOW_Height 600//窗口高度
#define BrickWidth 50 //固定一个砖块的宽50  和高30 描述每一个砖块
#define BrickHeight 30//
#define Brick_ROWS 4  //砖块行
#define ZK_COLS 14    //砖块列
#define Broad_Width BrickWidth * 4//木板宽度
#define Broad_Height BrickHeight//木板高度
#define Radius 20     //球的半径
int Broad_x = (WINDOW_Width - Broad_Width) / 2; //木板初始化
int  Broad_y = WINDOW_Height - Broad_Height;    
int circle_x = WINDOW_Width / 2;                //球初始化
int  circle_y = WINDOW_Height - Radius - Broad_Height;
int Ball_x = 6;//球x方向向量   为+右,为-左
int Ball_y = -6;//球y方向向量  为+下,为-上int Brick[Brick_ROWS][ZK_COLS] = {0};//木板是否存在:1为不存在,0为存在//画一个方块
void DrawOneBrick(int x, int y)                  //xy下标   										 
{if (0 == Brick[y][x]){setlinecolor(BLACK);//线框颜色setfillcolor(RGB(250, 84, 101));//方块颜色fillrectangle(x * BrickWidth, y * BrickHeight, x *BrickWidth + BrickWidth, y * BrickHeight + BrickHeight);//(x1,y1),(x2,y2)方块大小}
}
//画全部方块
void DrawAllBrick()
{for (int i = 0; i < Brick_ROWS; i++){for (int j = 0; j < 14; j++)DrawOneBrick(j, i);}
}
//画木板块
void DrawDownBrick()
{setlinecolor(BLACK);//线框颜色setfillcolor(RGB(235, 107, 126));//木板颜色fillrectangle(Broad_x, Broad_y, Broad_x + Broad_Width, Broad_y + Broad_Height);//木板坐标}
//画球
void DrawCircle()
{setlinecolor(BLACK);setfillcolor(RGB(252, 190, 163));fillcircle(circle_x, circle_y, Radius);}
//所有游戏显示
void GameDraw()
{BeginBatchDraw();//绘图前    防闪cleardevice();//清屏DrawAllBrick();//画全部方块DrawDownBrick();//画木板块DrawCircle();//画球EndBatchDraw(); //绘图后    防闪
}
//球的移动
void CircleMove()
{circle_x += Ball_x;circle_y += Ball_y;
}
//消除砖块
int DisappearBrick()
{int ZK_COL = circle_x / BrickWidth;int ZK_ROW = circle_y / BrickHeight;if (ZK_ROW < 4 && ZK_COL < 14 && Brick[ZK_ROW][ZK_COL] == 0){Brick[ZK_ROW][ZK_COL] = 1;return 1;}return 0;
}
//碰撞检测int circle_x, int circle_y
void CollisionDetection()
{HWND hwnd = GetHWnd();//球如果往右边移动,检测球是否撞上右边沿if (Ball_x > 0 && circle_x >= WINDOW_Width - Radius){Ball_x = -6;}//球如果往上边移动,检测球是否撞上上边沿if (Ball_y < 0 && circle_y <= Radius || DisappearBrick()){Ball_y = 6;}//球如果往左边移动,检测球是否撞上左边沿if (Ball_x < 0 && circle_x <= Radius){Ball_x = 6;}//球如果往下边移动,检测球是否撞上下边沿if (Ball_y > 0 && circle_y >= WINDOW_Height - Radius){Ball_y = 0;Ball_x = 0;MessageBox(hwnd, "游戏结束", "出界", MB_OK);}//检测球是否撞上板子,只能从上往下撞,只有两种极限情况if ((Ball_y > 0) && (circle_y >= (Broad_y - Radius)) && //球y坐标(circle_x >= Broad_x) && (circle_x <= (Broad_x + Broad_Width))){Ball_y = -6;}}
//键盘控制
void KeyControl()
{CollisionDetection();	//不管有没有按键都要碰撞检测int ch;if (_kbhit())//检测是否有按键{                       ch = _getch();//获取按键的值switch (ch){case 'a':case 'A':case 75:Broad_x -= 20;if (Broad_x <= 0){Broad_x = 0;}break;case 'd':case 'D':case 77:Broad_x += 20;if (Broad_x >= 500){Broad_x = 500;}break;}}
}
int main()
{initgraph(WINDOW_Width, WINDOW_Height); //width宽 height高while (1){GameDraw();CircleMove();KeyControl();DisappearBrick();Sleep(50);}return 0;
}

加油

http://www.lryc.cn/news/2416087.html

相关文章:

  • Office2003打开office2007文件的补丁
  • PAS启动:制台登录不了,用curl在服务器端测试没有反应,后台日志报错:Threads are going to be renewed over time to
  • http://www.baidu.com/cb.php?,存在劫持风险的第三方JS地址
  • 总结24个Python接单赚钱的平台,兼职月入5000+
  • 网页特效----HTML中树的实现方法
  • 不同网段怎么ping通_【知识积累】两个不同网段的路由器,如何互通?
  • ubuntu11.04国内源
  • 数模学习:模糊综合评价(上)
  • 最新推荐:【凯立德 移动导航系统】【V4.0 破解版】3D高清地图
  • 番茄被捏碎 微软将失去更多市场份额
  • 如何查看谷歌地图,教你几招
  • IE8浏览器提示网页上有错误,怎么解决?
  • mysql idataparameter_[转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  • 我的卓越亚马逊和当当购书经历
  • bios升级工具_雨林木风U盘启动盘装系统制作工具再次升级。。。
  • Linux 之 信号量
  • webservice 安全和加密的方法
  • 【程序员侠】李飞往事之键盘侠刘一刀
  • 败家MM
  • C语言设计模式
  • C语言10个经典小程序——小白必备!
  • 探索一种C++二进制模块的热更新机制
  • alexa安装后不能显示工具条的方法
  • 理解Engine in Database
  • 操作系统期末复习题库(含答案)
  • PHP从基础到高级详细教程(完整版)_php高级教程(2)
  • CSS保姆级教程(四)(DIV+CSS实践:第一个网页开发)
  • 线性规划(基本原理+例题解析)
  • 测试网络质量常用的四条命令
  • 【竞赛篇-杭创】杭州市大学生创业大赛参赛经验