简易版------打砖块

这个只要安装了easyx图形库就可以直接复制运行。

easyx的安装可以参考这个:

easyx的安装与基于easyx的C语言扫雷小游戏_makabaka12138的博客-CSDN博客

这个游戏也比较粗糙,只做了个大概,有感兴趣的可以自己改进一下。

喜欢的点个赞吧。

展示:

 

#include <stdio.h>
#include <stdbool.h>
#include <graphics.h>  //easyX  库
#include <conio.h>

//砖块宽
#define  ZK_WIDTH	120
//砖块高
#define  ZK_HEIGHT  40

//行数
#define  ZK_ROWS   4
//列数
#define  ZK_COLS   5

//宽  60  高  20
//窗口高
#define WINDOW_HEIGHT 600
//窗口宽
#define WINDOW_WIDTH  (ZK_WIDTH*ZK_COLS)
//球的半径
#define RADIUS  10
//板子宽
#define BZ_WIDTH  300
//板子高
#define BZ_HEIGHT 20


//全局变量   0 false 存在    1 true 不存在
bool zk[ZK_ROWS][ZK_COLS] = { 0 };
//球的圆心坐标
int ball_x, ball_y;
//板子左上角那个点的坐标
int bz_x, bz_y;
//球的方向向量    3 右 -3 左     -3上  3下
int ball_xfx=3, ball_yfx=-3;

//游戏是否继续
bool isContinue = true;




//画板子
void drawBZ();
//画球
void drawBall();


//打印一块砖
// x y  下标
void drawZK(int x, int y);

//显示所有的砖
void drawAllZK();

//游戏的所有显示
void drawGame();

//球移动  
void ballMove();
//碰撞检测
void check();
//控制    是否按键  根据按键来处理
void ctolGame();


int main(){
	initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
	//板子的初始坐标
	bz_x = (WINDOW_WIDTH - BZ_WIDTH) / 2;
	bz_y = WINDOW_HEIGHT - BZ_HEIGHT;

	//球心初始坐标
	ball_x = WINDOW_WIDTH / 2;
	ball_y = WINDOW_HEIGHT - BZ_HEIGHT - RADIUS;

	while (isContinue){
		drawGame();
		ballMove();
		ctolGame();
		Sleep(10);//帧率100   1秒钟图片切换张数  16以上  100以下
	}
	
	settextcolor(RED);
	LOGFONT font = { 0 };
	font.lfHeight = 40;
	font.lfWidth = 20;
	settextstyle(&font);
	outtextxy(WINDOW_WIDTH / 2 - 100, WINDOW_HEIGHT / 2,
		L"Game Over!!!");
	

	/*
	Sleep(2000);
	cleardevice();//清屏
	zk[1][1] = zk[2][2] = 1;
	drawAllZK();
	*/

	while (1);
	return 0;
}

//球移动  
void ballMove(){
	ball_x += ball_xfx;
	ball_y += ball_yfx;
}

//碰撞检测
void check(){
	//检测球是否撞上右边沿
	if ((ball_xfx > 0) && //球往右边走
		(ball_x >= (WINDOW_WIDTH - RADIUS))){//撞上了右边沿
		ball_xfx = -3;
	}
	//检测球是否撞上左边沿
	if ((ball_xfx < 0) && //球往左边走
		(ball_x <= RADIUS)){//撞上了左边沿
		ball_xfx = 3;
	}
	//检测球是否撞上上边沿
	if ((ball_yfx < 0) && //球往上边走
		(ball_y <= RADIUS)){//撞上了上边沿
		ball_yfx = 3;
	}
	//检测球是否撞上下边沿
	if ((ball_yfx > 0) && //球往下边走
		(ball_y >= (WINDOW_HEIGHT-RADIUS) )){//撞上了下边沿
		//ball_yfx = -3;
		isContinue = false;
	}

	//检测球是否撞上板子
	if ((ball_yfx > 0) &&
		(ball_y >= (bz_y - RADIUS)) &&//球y坐标
		(ball_x >= bz_x) &&
		(ball_x <= (bz_x + BZ_WIDTH))){
		ball_yfx = -3;
	}


	//检测撞砖块

	for (int i = 0; i < ZK_ROWS; i++){
		for (int j = 0; j < ZK_COLS; j++){
			//  zk[i][j]      x:j*ZK_WIDTH    y:i*ZK_HEIGHT

			//左上角坐标 (j*ZK_WIDTH,i*ZK_HEIGHT)   
			//右下角坐标(j*ZK_WIDTH+ZK_WIDTH,i*ZK_HEIGHT+ZK_HEIGHT)

			if (3 == ball_xfx){//检测从左往右撞
				/*
				if ((false == zk[i][j])			//砖块存在
					&& (ball_x > (j*ZK_WIDTH-RADIUS) )    //左边边界
					&& (ball_y>i*ZK_HEIGHT)//上边边界
					&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT))//下边边界
					){
					zk[i][j] = true;//把砖块打掉
					ball_xfx = -3;
				}
				*/
			}
			if (-3 == ball_xfx){//检测从右往左撞
				/*
				if ((false == zk[i][j])			//砖块存在
					&& (ball_x <(j*ZK_WIDTH + ZK_WIDTH + RADIUS))  //右边边界
					&& (ball_y>i*ZK_HEIGHT)//上边边界
					&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT))//下边边界
					){
					zk[i][j] = true;//把砖块打掉
					ball_xfx = 3;
				}
				*/
			}
			if (-3 == ball_yfx){//检测从下往上撞
				if ((false == zk[i][j])			//砖块存在
					&& (ball_x > j*ZK_WIDTH)    //左边边界
					&& (ball_x < (j*ZK_WIDTH + ZK_WIDTH))//右边边界
					&& (ball_y < (i*ZK_HEIGHT + ZK_HEIGHT + RADIUS))//上边边界
					){
					zk[i][j] = true;//把砖块打掉
					ball_yfx = 3;
				}
			}
			if (3 == ball_yfx){//检测从上往下撞
				/*
				if ((false == zk[i][j])			//砖块存在
					&& (ball_x > j*ZK_WIDTH)    //左边边界
					&& (ball_x < (j*ZK_WIDTH + ZK_WIDTH))//右边边界
					&& (ball_y > (i*ZK_HEIGHT - RADIUS))//上边边界
					){
					zk[i][j] = true;//把砖块打掉
					ball_yfx = -3;
				}
				*/
			}
		}
	}
}
//控制    是否按键  根据按键来处理
void ctolGame(){
	check();//不管有没有按键,都要碰撞检测

	int ch;
	if (true == _kbhit()){//检测是否有按键
		ch = _getch();//获取按键的值
		printf("ch:%d\n", ch);

		switch (ch){
		case 'a':
		case 'A':
		case 75:
			bz_x -= 5;
			break;
		case 'd':
		case 'D':
		case 77:
			bz_x += 5;
			break;
		}
	}
}

//游戏的所有显示
void drawGame(){
	BeginBatchDraw();//绘图前    防闪

	//清屏
	cleardevice();
	drawAllZK();
	drawBZ();
	drawBall();

	EndBatchDraw();//绘图后    防闪
}

//打印一块砖
// x y  下标
void drawZK(int x, int y){
	if (0 == zk[y][x]){
		setlinecolor(RED);
		setfillcolor(GREEN);
		fillrectangle(x * ZK_WIDTH, y * ZK_HEIGHT,
			x * ZK_WIDTH + ZK_WIDTH, y * ZK_HEIGHT + ZK_HEIGHT);
	}
	/*
	if(1 == zk[y][x]) return;
	setlinecolor(RED);
	setfillcolor(GREEN);
	fillrectangle(x * ZK_WIDTH, y * ZK_HEIGHT,
		x * ZK_WIDTH + ZK_WIDTH, y * ZK_HEIGHT + ZK_HEIGHT);
	*/
}

//显示所有的砖
void drawAllZK(){
	for (int i = 0; i < ZK_ROWS; i++){//5行
		for (int j = 0; j < ZK_COLS; j++){//30列
			//if (0 == zk[i][j])
				drawZK(j, i);
		}
	}
}

//画板子
void drawBZ(){
	setlinecolor(YELLOW);
	setfillcolor(YELLOW);
	fillrectangle(bz_x, bz_y, bz_x + BZ_WIDTH, bz_y + BZ_HEIGHT);
}
//画球
void drawBall(){
	setlinecolor(BLUE);
	setfillcolor(RED);
	fillcircle(ball_x, ball_y, RADIUS);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值