C/C++小游戏 砸砖块
90后00后的同学们,还记得在没有电脑的童年里的黑白机么?那时候带手柄的黑白游戏机就是大家最快乐的娱乐消遣方式吧,哈哈
我是从差不多五岁开始接触的,"砸砖块"这个游戏我相信应该是当时比较火的游戏吧,这是一款非常有意思的休闲游戏,游戏的画风非常的简单,玩家可以在游戏中进行简单的操作就可以快速游戏了,这也是我唯一一个打通关的游戏,呜呜~
期待你的关注~
群内有各种学习资料,欢迎大家一起来学习哦~
如果大家遇到什么问题也欢迎大家进群讨论哦~
qq群:759252814
话不多说直接上代码:
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
HWND hwnd = NULL; //句柄,相当于你要去银行办理业务先挂号
//砖头地图,游戏上方的砖头显示用的数组
int map[4][4];
//储存球信息的结构体
struct Ball
{
int x; //球的坐标x和y坐标
int y;
int r; //球的半径
int movex; //球的x和y坐标的偏移量
int movey;
};
//储存木板信息的结构体
struct Board
{
int x; //木板的坐标x和y坐标
int y;
int speed; //木板的移动速度
};
struct Ball ball = { 200,300,10,5,5}; //球的信息
struct Board board = { 100,600 - 25,10 }; //木头的信息
//木板反弹,有些同学可能不知道bool,这里使用int
int hitboard()
{
//如果球的y坐标加半径等于木板的y坐标并且球x的坐标在木板内,返回1否则返回0
if ((ball.y + ball.r == board.y) && (ball.x >= board.x && ball.x <= board.x + 200))
{
return 1;
}
return 0;
}
//初始化地图
void initmap()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
//利用rand()产生随机数并使用取余数的运算符'%',使结果在 0,1,2,3 四个数字之间
map[i][j] = rand() % 4;
}
}
}
//设置砖块被球撞击后的状态
int hitdrawBrick()
{
int j = ball.x / 100;
int i = ball.y / 25;
//如果球撞击这个地方的值不是-1则设置为-1
if (i < 4 && j < 4 && map[i][j] != -1)
{
map[i][j] = -1;
return 1;
}
return 0;
}
//判断砖头是否全部消除
int clearAli()
{
//通过遍历判断砖头是否全部消除,如果有一个位置的砖块未消除返回0游戏继续,否则返回1,游戏结束并提示"你胜利啦!"
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
//-1为 没有砖头
if (map[i][j] != -1)
return 0;
}
}
return 1;
}
//画出当前砖块
void drawBrick()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
//砖块的长为100,高为25
int x = j * 100;
int y = i * 25;
//根据map地图的值来画出不同颜色的砖块
switch(map[i][j])
{
case 0:
setfillcolor(RED); //设置当前填充颜色,填充色为RED:红色
fillrectangle(x, y, x + 100, y + 25); //画填充矩形(有边框)
break;
case 1:
setfillcolor(GREEN);
fillrectangle(x, y, x + 100, y + 25);
break;
case 2:
setfillcolor(BLUE);
fillrectangle(x, y, x + 100, y + 25);
break;
case 3:
setfillcolor(RGB(253,10,253));
fillrectangle(x, y, x + 100, y + 25);
break;
}
}
}
}
//画出球
void drawball()
{
setfillcolor(YELLOW);
solidcircle(ball.x,ball.y,ball.r); //画填充圆(无边框)
}
//画出木板
void drawboard()
{
setfillcolor(YELLOW);
solidrectangle(board.x, board.y, board.x + 200, board.y + 25);
}
//移动球
void moveball()
{
if (ball.x - ball.r <= 0 || ball.x + ball.r >= 400) //如果球的x坐标减或加上球的半径碰到墙壁,移动的坐标变为相反数
{
ball.movex = -ball.movex;
}
if (ball.y - ball.r <= 0 || hitboard() || hitdrawBrick()) //如果球的y坐标减去球的半径碰到墙壁或者撞到模板和砖头,移动的坐标变为相反数
{
ball.movey = -ball.movey;
}
if (ball.y+ball.r >= 600) //如果球碰到最底下,则游戏结束,并弹出提示
{
MessageBox(hwnd,"游戏失败!", "砖头游戏",MB_OK);
exit(0);
}
ball.x += ball.movex; //球的x坐标下一次的位置
ball.y += ball.movey; //球的y坐标下一次的位置
}
//
void keyDown()
{
//按左键模板向左移动
if (GetAsyncKeyState(VK_LEFT))
{
board.x -= board.speed;
//如果的左上坐标的x坐标碰到墙壁则使用"board.x = 0;"语句让木板不再移动
if (board.x <= 0)
{
board.x = 0;
}
}
//按左键模板向右移动
if (GetAsyncKeyState(VK_RIGHT))
{
board.x += board.speed;
//如果的左上坐标的x坐标碰到墙壁则使用"board.x = 400-200;"语句让木板不再移动
if (board.x >= 400-200)
{
board.x = 400-200; //游戏屏幕的宽为400,木板的长度为200
}
}
}
int main(void)//
{
srand((unsigned int) time(NULL)); //随机函数种子
//hwnd=initgraph(400, 600)使弹窗出现在游戏屏幕之上
hwnd=initgraph(400, 600); //初始化图形环境,第一个参数为宽,第二个参数为高
setlinestyle(PS_SOLID, 2); //设置当前画线样式
initmap();
//一直循环知道游戏结束
while (TRUE)
{
BeginBatchDraw(); //开始批量绘制,双缓冲,防止闪屏用的
cleardevice(); //清屏
drawBrick();
drawball();
moveball();
drawboard();
keyDown();
Sleep(40); //执行挂起一段时间,也就是等待一段时间在继续执行,括号里的时间,在windows下是已毫秒为单位,而Linux是以秒为单位
if (clearAli())
{
MessageBoxA(hwnd, "你胜利啦!", "砖头游戏", MB_OK);
exit(0);
}
EndBatchDraw(); //结束批量绘制,并执行未完成的绘制任务
}
closegraph(); //关闭图形环境
return 0;
}
如果您觉得还不错的话请给我个关注吧,嘻嘻~*
*运行结果如图: