砸砖块

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;
}

如果您觉得还不错的话请给我个关注吧,嘻嘻~*
*运行结果如图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LYXlyxll/article/details/107914948