打砖块游戏代码

#if 0
作业:
添加  打砖块的检测 消除砖块
提示1:给zk数组赋值可以消除砖块
提示2:循环检测
提示3:打掉了的,就别再检测了
提示4:注意看球碰撞板子的检测方式
#endif

#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#define WIDTH 300
#define HEIGHT 400
#define BRICK_WIDTH  50
#define BRICK_HEIGHT 15
#define ROWS 4
#define COLS 6
#define BOARD_WIDTH  100
#define BOARD_HEIGHT 15
#define RADIUS 10 
int board_x, board_y;
int ball_x, ball_y;
int ball_xfx = 3, ball_yfx = -3;

bool brick[ROWS][COLS] = { 0 };       //把0认为真,初始砖块都存在
bool isContinue = true;

void DrawBrick(int x, int y);
void DrawAllBrick();
void DrawBoard();
void DrawBall();
void DrawGame();
void BallMove();
void check();
void ctolGame();

void RemoveBrick()
{
	for (int i = ROWS; i >0; i--)
	{
		for (int j =0; j <COLS ; j++)
			if ((ball_yfx <0) &&
				(ball_y <= (ROWS *BRICK_HEIGHT- RADIUS)) &&//球y坐标
				(ball_x >= COLS * BRICK_WIDTH) &&
				(ball_x <= (COLS * BRICK_WIDTH + BOARD_WIDTH))) {
				brick[i - 1][j] = false;
			}
	}
}

int main()
{
	initgraph(WIDTH,HEIGHT, SHOWCONSOLE);
	board_x = (WIDTH - BOARD_WIDTH) / 2;
	board_y =HEIGHT - BOARD_HEIGHT;

	ball_x = WIDTH / 2;
	ball_y = HEIGHT - BOARD_HEIGHT - RADIUS;
	while (isContinue) {
		DrawGame();
		BallMove();
		ctolGame();
		Sleep(10); 
	}

	settextcolor(RED);
	LOGFONT font = { 0 };
	font.lfHeight = 40;
	font.lfWidth = 20;
	settextstyle(&font);
	outtextxy(WIDTH / 2 - 100,HEIGHT / 2,"Game Over!!!");
	
	/*Sleep(2000);
	cleardevice();
	brick[1][1] = brick[2][2] = 1;
	DrawAllBrick();*/
	while (1);
}
void DrawBrick(int x, int y)
{
	if (1 == brick[y][x])	return;
	setlinecolor(RED);                   //无,默认白色
	setfillcolor(GREEN);
	fillrectangle(x * BRICK_WIDTH, y * BRICK_HEIGHT, x * BRICK_WIDTH + BRICK_WIDTH, y * BRICK_HEIGHT + BRICK_HEIGHT);
}
void DrawAllBrick()
{
	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			DrawBrick(j, i);

		}
	}
}
void DrawBoard()
{
	setlinecolor(YELLOW);
	setfillcolor(YELLOW);
	fillrectangle(board_x, board_y, board_x + BOARD_WIDTH, HEIGHT);
}
void DrawBall()
{
	setlinecolor(RED);
	setfillcolor(RED);
	fillcircle(ball_x, ball_y, RADIUS);
}

void BallMove()
{
	ball_x += ball_xfx;
	ball_y += ball_yfx;
}
void DrawGame()
{
	BeginBatchDraw();

	cleardevice();
	DrawAllBrick();
	DrawBoard();
	DrawBall();
	EndBatchDraw();

}
//碰撞检测
void check() {
	//检测球是否撞上右边沿
	if ((ball_xfx > 0) && //球往右边走
		(ball_x >= (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 >= (HEIGHT - RADIUS))) {//撞上了下边沿
		//ball_yfx = -3;
		isContinue = false;
	}

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

	//检测撞砖块

	for (int i = 0; i < ROWS; i++) {
		for (int j = 0; j < COLS; j++) {
			//  zk[i][j]      x:j*BRICK_WIDTH    y:i*BRICK_HEIGHT

			//左上角坐标 (j*BRICK_WIDTH,i*BRICK_HEIGHT)   
			//右下角坐标(j*BRICK_WIDTH+BRICK_WIDTH,i*BRICK_HEIGHT+BRICK_HEIGHT)

			if (3 == ball_xfx) {//检测从左往右撞

			/*	if ((false == brick[i][j])
					&& (ball_x > (j * BRICK_WIDTH - RADIUS))    
					&& (ball_y > i * BRICK_HEIGHT)
					&& (ball_y < (i * BRICK_HEIGHT + BRICK_HEIGHT))
					) {
					brick[i][j] = true;
					ball_xfx = -3;
				}
			*/
			}
			if (-3 == ball_xfx) {//检测从右往左撞
				
			/*	if ((false == brick[i][j])
				&& (ball_x <(j* BRICK_WIDTH + BRICK_WIDTH + RADIUS))  
				&& (ball_y>i* BRICK_HEIGHT)
				&& (ball_y < (i* BRICK_HEIGHT + BRICK_HEIGHT))
				){
					brick[i][j] = true;
					ball_xfx = 3;
				}
			*/
			}
			if (-3 == ball_yfx) {//检测从下往上撞
				if ((false == brick[i][j])			
					&& (ball_x > j * BRICK_WIDTH)    
					&& (ball_x < (j * BRICK_WIDTH + BRICK_WIDTH))
					&& (ball_y < (i * BRICK_HEIGHT + BRICK_HEIGHT + RADIUS))
					) {
						brick[i][j] = true;
						ball_yfx = 3;
				}
			}
			if (3 == ball_yfx) {//检测从上往下撞
				
			/*	if ((false == brick[i][j])
				&& (ball_x > j * BRICK_WIDTH)    
				&& (ball_x < (j * BRICK_WIDTH + BRICK_WIDTH))
				&& (ball_y > (i * BRICK_HEIGHT - RADIUS))
				){
					brick[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:
			board_x -= 30;
			break;
		case 'd':
		case 'D':
		case 77:
			board_x += 30;
			break;
		}
	}
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪八戒1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值