C++制作简单打砖块小游戏

C++制作简单打砖块小游戏

导入需要使用的头文件,库文件,安装EasyX 图形库。
直接放源码吧,大概300来行就完成了整个游戏。

下面展示一些 内联代码片

#include “easyx_c.h”

void start();//声明启动页面的函数
void drow_origin(int num[][10]);
void game();
void draw_ball(int x, int y, int r, COLORREF color);
void draw_baffle(int x, int y, COLORREF color);
//int check_baffle_collision_detection(int x, int y, int r, int num[][10]);
//int game_over_window(int score);

int main()
{
UINT nID = mopen(“背景音乐.mp3”, “mpegvideo”);
start();
game(); //调用游戏函数
getch();//等待用户按键
mclose(nID);
return 0;
}

void start() {
initgraph(400, 280);
setbkcolor(CYAN);
cleardevice();
settextcolor(RED);
setbkmode(TRANSPARENT);
settextstyle(30, 0, “楷体”);
outtextsxy(140, 80,“打砖块”);
settextstyle(20, 0, “楷体”);
outtextsxy(130, 180, “版本1.0”);
outtextsxy(130, 200, “作者:zzz”);
settextcolor(DARKGRAY);
outtextsxy(100, 240, “按任意键开始…”);
getch();// 等待用户按键

}

//获取挡板位置的效果
int get_baffle_position(int xb) {

if (kbhit()){
	int ch = getch();
	if (ch==75)//按了左键,传asii码值
	{
		if (xb-20>0)
		{
			xb -= 20;//没有越界
		}
		else
		{
			xb = 1;//发生了越界
		}
	}
	else if(ch==77)//按了右键
	{
		if (xb+20<578)
		{
			xb += 20;
		}
		else
		{
			xb = 578;
		}
	}
	else if (ch ==27)
	{
		xb = -1;
	}
}
return xb;

}

void draw_brick(int i, int j, COLORREF line, COLORREF fill) {
setlinecolor(line);
rectangle(j * 80 + 1, i * 20, 80 * (j + 1), (i + 1) * 20);//砖位置
setfillstyle(BS_SOLID);//填充方式,完全填充
setfillcolor(fill);//填充颜色,亮红
floodfill(j * 80 + 2, i * 20 + 2, line);//从1,1开始填充遇到red颜色终止
}
//实现碰撞函数
int check_baffle_collision_detection(int x, int y, int r, int num[][10]) {

int i, j;
int lf = x - r, rg = x + r, t = y - r, bt = y + r;
for ( i = 0; i < 7; i++)
{
	for (j = 0; j < 8; j++) {
		if (num[i][j]==0) continue;
		int left = 1 + j * 80, right = (j + 1) * 80, top = 1 + i * 20, bottom = (i + 1) * 20;
		int status = 0;
		if (((left <= lf) && (lf <= right)) && ((top <= t) && (bottom >= t)))
		{
			status |= 1;
		}
		if (((left <= rg) && (rg <= right)) && ((top <= t) && (bottom >= t)))
		{
			status |= 2;
		}
		if (((left <= rg) && (rg <= right)) && ((top <= bt) && (bottom >= bt)))
		{
			status |= 4;
		}
		if (((left <= lf) && (lf <= right)) && ((top <= bt) && (bottom >= bt)))
		{
			status |= 8;
		}
		if (status>0)
		{
			num[i][j] = 0;
			draw_brick(i, j, LIGHTGREEN, LIGHTGREEN);
		}
		switch (status)
		{
		case 3:
		case 12:
			return 1;
		case 6:
		case 9:
			return 2;
		case 1:
		case 2:
		case 4:
		case 8:
			return 3;
		default:
			break;
		}

	}
}
return 0;

}

int game_over_window(int score) {
//todo 游戏结束窗口
char s[64];
initgraph(440, 280);
setbkcolor(RED);
cleardevice();
settextcolor(BLUE);
settextstyle(40, 0, “楷体”);
outtextsxy(120, 80, “游戏结束!”);
settextcolor(YELLOW);
settextstyle(20, 0, “楷体”);
outtextsxy(150, 200, “再来一局!”);
sprintf(s, “你的得分:%d”, score);
outtextsxy(140, 180, s);
settextcolor(GREEN);
outtextsxy(90, 230, “按任意键结束游戏,按Y继续~”);
return getch() == ‘y’;
}

//游戏的主函数
void game() {
int num[10][10];//定义砖的状态,0表示消失,1表示存在。
int x = 200, y = 400, r = 10, dx = -2, dy = -2;//球位置坐标
int xb = 320;//挡板位置坐标
int score = 0;//打砖块所获得的积分
drow_origin(num);
do
{
draw_ball(x, y, r, LIGHTGREEN);
draw_baffle(xb, 400, LIGHTGREEN);//清除挡板
int position = check_baffle_collision_detection(x, y, r, num);//判断碰撞
if (position > 0)
{
PlaySound(".\打击声.wav", NULL, SND_FILENAME | SND_ASYNC);
score += 10;

		switch (position)
		{
		case 1: //垂直碰撞
			dy = -dy;
			break;
		case 2:	//水平碰撞
			dx = -dx;
			break;
		case 3:	//角碰撞
			dx = -dx;
			dy = -dy;
			break;

		}
	}
	x += dx;
	y += dy;
	xb = get_baffle_position(xb);//获取用户操作挡板
	if (xb == -1)
	{
		int ret = game_over_window(score);
		if (ret == 1)
		{	//todo游戏初始化
			x = 200, y = 400, dx = -2, dy = -2;
			xb = 320, score = 0;
			drow_origin(num);
			continue;
		}
		break;
	}
	//检测小球和挡板的碰撞
	if ((y - r < 400) && (400 < y + r))
	{
		if ((x>xb-r) && (x < xb + 60 + r))
		{//todo:碰撞处理
			dy = -dy;//改变球的方向
			y = 400 - 1 - r; //将球移到挡板上
			PlaySound(".\\接球声.wav", NULL, SND_FILENAME | SND_ASYNC);//播放接球声音
		}
	}

	if (x <= r + 4 || (x >= 636 - r))
	{
		dx = -dx;
	}
	if (y <= r + 4)
	{
		dy = -dy;
	}
	if (y > 440)
	{
		int ret = game_over_window(score);
		if (ret == 1)
		{	//游戏初始化
			x = 200, y = 400, dx = -2, dy = -2;
			xb = 320, score = 0;
			drow_origin(num);
			continue;

		}
		break;
	}
	draw_baffle(xb, 400, RED);//绘制挡板
	draw_ball(x, y, r, BROWN);
	Sleep(15);

} while (1);

}
void draw_baffle(int x,int y,COLORREF color) {
setlinecolor(color);
rectangle(x, y, x+60, y+6);
setfillstyle(BS_SOLID);
setfillcolor(color);
floodfill(x+2, y+2, color);

}

void draw_ball(int x,int y,int r,COLORREF color) {
setlinecolor(color);
circle(x, y, r);
setfillstyle(BS_SOLID);
setfillcolor(color);
floodfill(x+2, y+2, color);
}

//绘制游戏起始页面
/*void drow_origin(int num[][10]) {
HWND hWnd=initgraph(640, 480);// 初始化图形界面
setbkcolor(LIGHTGREEN);//背景颜色
cleardevice();
//绘制游戏边界
setlinecolor(BLUE);//设置线条颜色
rectangle(0, 0, 639, 479);
//绘制砖块 第一块砖
setlinecolor(RED);
rectangle(0, 0, 80, 20);//砖位置
setfillstyle(BS_SOLID);//填充方式,完全填充
setfillcolor(LIGHTRED);//填充颜色,亮红
floodfill(1, 1, RED);//从1,1开始填充遇到red颜色终止
num[0][0] = 1;//记录砖块是否存在
//第二块砖
setlinecolor(RED);
rectangle(81, 0, 161, 20);//改变砖块位置
setfillstyle(BS_SOLID);
setfillcolor(LIGHTRED);
floodfill(82, 1, RED);//颜色的位置
num[0][0] = 1;
//第一块砖下面的砖
setlinecolor(RED);
rectangle(0, 21, 80, 41);//改砖块位置
setfillstyle(BS_SOLID);
setfillcolor(LIGHTRED);
floodfill(1, 22, RED);//颜色的位置
num[0][0] = 1;

}*/
void drow_origin(int num[][10]) {

int i, j;
HWND hWnd = initgraph(640, 480);// 初始化图形界面
setbkcolor(LIGHTGREEN);//背景颜色
cleardevice();
//绘制游戏边界
setlinecolor(BLUE);//设置线条颜色
rectangle(0, 0, 639, 479);
//绘制砖块 第一块砖 双循环
for ( j = 0; j < 7; j++)
{
for ( i = 0; i < 8; i++)
{
	draw_brick(j, i, RED, LIGHTRED);
	num[j][i] = 1;//记录砖块是否存在
}
}
//绘制挡板
draw_baffle (400,200,RED);
//绘制小球
draw_ball(200,400,10,BROWN);

}


你可能感兴趣的:(C++制作简单打砖块小游戏)