Easyx-----c语言实现打砖块

用键盘上下左右键控制小球移动撞击并消除方块

效果如下:

 

创建源文件选择.cpp 

vs2019下载Easyx并包含头文件     

#include<graphics.h>

Easyx图形库下载地址 www.easyx.cn

项目->属性->高级->字符集改为多字节字符集

把图片和含有.cpp文件夹放在一起

准备就绪 上代码

#include<stdio.h>
#include<graphics.h>
#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; //Broad初始化
int  Broad_y = WINDOW_Height - Broad_Height;
int circle_x = WINDOW_Width / 2;                //circle初始化
int  circle_y = WINDOW_Height - Radius - Broad_Height;
int Ball_x=6;//球x方向向量   为+右,为-左
int Ball_y=-6;//球y方向向量  为+下,为-上

//全局变量 0 false 存在    1 true 不存在
bool Brick[Brick_ROWS][ZK_COLS] = { 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();
	loadimage(0, "w.jpg");
	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() 
{
	//球如果往右边移动,检测球是否撞上右边沿
	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;
		
	}
	//检测球是否撞上板子,只能从上往下撞,只有两种极限情况
	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 (true == _kbhit())
	{                       //检测是否有按键
	ch = _getch();//获取按键的值
	switch (ch) 
	{
	case 'a':
	case 'A':
	case 75:
		Broad_x -=20;
		break;
	case 'd':
	case 'D':
	case 77:
		Broad_x +=20;
		break;
	}
  }
}
int main()
{
	initgraph(WINDOW_Width, WINDOW_Height); //width宽 height高
	loadimage(0, "w.jpg");
	while (1) 
    {
		GameDraw();
		CircleMove();
		KeyControl();	
		DisappearBrick();
		Sleep(50);
	/*Brick[1][1] = Brick[2][2] = 1;
	DrawAllBrick();*/		
	}
	while (1);
	return 0;
}

 w.jpg


版权声明:本文为weixin_60569662原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。