//---------------------------------------------------首先是头文件的所有需要---------------------------------------------------------------
#include<graphics.h>//easyx图形库头文件
#include<iostream>
#include<conio.h>// 控制台输入输出函数头文件
#include<time.h>//我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。
#include<windows.h>//写window程序需要的重要头文件
using namespace std;
//-------------------------------------------------对游戏各方面的初始化以及设定---------------------------------------------------------
HWND hwnd = NULL;//窗口句柄的初始化
int map[4][4];//初始化地图,用二维数组来代替
void drawthemap()//给地图每个brick赋一个值
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
map[i][j] = rand() % 4;//二维数组的值均为0-3,取余用法
}
}
}
//二维数组随机赋值
void drawbricks()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
int x = j * 100;//一块brick的长度
int y = i * 25;//一块brick的宽度
switch (map[i][j])//通过给二维数组每个值随机赋值来达到给brick随机上色的目的
{
case 0:
setfillcolor(BLUE);//设置填充颜色
fillrectangle(x, y, x + 100, y + 25);//矩形填充,矩形的四个坐标
break;
case 1:
setfillcolor(RED);
fillrectangle(x, y, x + 100, y + 25);
break;
case 2:
setfillcolor(YELLOW);
fillrectangle(x, y, x + 100, y + 25);
break;
case 3:
setfillcolor(GREEN);
fillrectangle(x, y, x + 100, y + 25);
break;
}
}
}
}
//brick绘制函数
struct BALL
{
int x;//小球的横坐标
int y;//小球的纵坐标
int r;//小球的半径
int addx;//小球的x坐标速度增加值
int addy;//小球的y坐标速度增加值
};
//小球结构体
struct BALL ball = { 200,300,10,5,5 };
//小球实例化
struct BOARD
{
int x;//木板横坐标
int y;//木板纵坐标
int speed;//木板的移动速度
};
//木板结构体
struct BOARD board = { 100,500,20 };
//木板实例化
void drawball()
{
setfillcolor(BROWN);
solidcircle(ball.x, ball.y, ball.r);
}
//绘制ball函数
void drawboard()
{
setfillcolor(YELLOW);
solidrectangle(board.x, board.y, board.x + 200, board.y + 25);
}
//绘制木板函数
//----------------------------------------------------接下来做运动以及碰撞细节----------------------------------------------------------
int hitboard()
{
if ((ball.y + ball.r == board.y) && (ball.x >= board.x && ball.x <= board.x + 200))//球在木板中间的x坐标并且球已经触及板
{
return 1;
}
return 0;
}
//球撞击木板
int hitbricks()
{
int j = ball.x / 100;//将ball的横坐标除100得出是第几列的brick
int i = ball.y / 25;//将ball的纵坐标除25得出是第几行的brick
if (i < 4 && j < 4 && map[i][j] != -1)//确保i,j正常情况将二维数组的对应数进行置-1,对brick进行消除
{
map[i][j] = -1;
return 1;
}
return 0;
}
//ball hit brick
void moveball()
{
if (ball.x - ball.r <= 0 || ball.x + ball.r >= 400)
{
ball.addx = -ball.addx;//ball的横坐标小于0或者大于400(超出窗口即撞墙)需要反弹,将小球的横坐标反向增加
}
if ((ball.y - ball.r <= 0) || hitboard() || hitbricks())//纵坐标即小球撞板或者砖块需要进行反弹,纵坐标反向增加
{
ball.addy = -ball.addy;
}
if (ball.y + ball.r >= 600)//小球触底,游戏结束
{
MessageBox(hwnd, TEXT("你失败了!"), TEXT("消息"), MB_OK);
exit(0);
}
//小球的横纵坐标不断改变add值
ball.x += ball.addx;
ball.y += ball.addy;
}
//ball移动
int hitall()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (map[i][j] != -1)
return 0;
}
}
return 1;
}
//全部brick消除判定
void keyDown()
{
if (GetAsyncKeyState('a') || GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A'))
{
board.x -= board.speed;//获取键盘信息以进行左右移动,VK_LEFT是指小键盘<-
if (board.x <= 0)//防止木板到最左边发生越界
{
board.x = 0;
}
}
if (GetAsyncKeyState('d') || GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D'))
{
board.x += board.speed;//VK_RIGHT是指小键盘->
if (board.x >= 400 - 200)//防止木板到达最右边发生越界
{
board.x = 400 - 200;
}
}
}
//键盘操作
int main()
{
srand((unsigned int)time(NULL));//初始化时间种子
hwnd=initgraph(400, 600);//获取到初始化的窗口的句柄
setlinestyle(PS_SOLID, 3);//设置线风格,PS_SOLID 线形为实线。 3是线宽,以3个像素为线宽,后面两个参数缺省默认参数
drawthemap();
while (1)
{
BeginBatchDraw();//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
//防止闪屏
cleardevice();//这个函数用于清空绘图设备。具体的,是用当前背景色清空绘图设备,并将当前点移至 (0, 0)
drawbricks();//画出砖块
drawball();//画ball
moveball();
drawboard();
keyDown();
Sleep(100);//0.1s进行一次更新
if (hitall())//每循环一次进行一次判断
{
MessageBox(hwnd, TEXT("你成功了!"), TEXT("消息"), MB_OK);
exit(0);
}
EndBatchDraw();//begin-end中间的所有绘图操作都是缓冲绘图,防止闪屏
}//用循环来保持地图持续存在
_getch();//等待输入以让窗口存在
closegraph();//关闭窗口
return 0;
}
评论0