IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c/c++ 实现打砖块小游戏(简化版) -> 正文阅读

[C++知识库]c/c++ 实现打砖块小游戏(简化版)

#include <stdio.h>
#include <easyx.h>
#include <conio.h>

//----------------------------------------------------------------------------------
//窗口宽高
#define WINDOW_W 569
#define WINDOW_H 600

//砖块 宽 高 行 列
#define BRICK_W 71 //宽
#define BRICK_H 20 //高
#define BRICK_R 5  //行
#define BRICK_C 8 //列

//圆的半径
#define RADIUS 15

//板子宽 高
#define BOARD_W 200  //宽
#define BOARD_H 20  //高
//----------------------------------------------------------------------------------

//----------------------------------------------------------------------------------
//画砖块
void drawBrickWall(int x, int y);
//显示所有砖块
void displaysAllBrick(void);
//画板子
void drawBoard(void);
//画球
void drawBall(void);
//游戏所有显示
void displaysGame(void);
//球的移动
void ballMove(void);
//按键处理
void keyDown(void);
//碰撞检测
void collisionDetection(void);

//----------------------------------------------------------------------------------

//----------------------------------------------------------------------------------
//全局二维数组   0表示砖块存在(自动补零)   1表示不存在
bool brickWall[BRICK_R][BRICK_C] = { 0 };
//游戏是否继续
bool isContinue = true;
//球的圆心坐标
int ball_x, ball_y;
//球的向量   3右 -3左    -3上 3下
int ballDir_x = 10, ballDir_y = -10;
//板子左 右上角的坐标
int board_x, board_y;
//----------------------------------------------------------------------------------

int main(int argc, char const *argv[])
{
	initgraph(WINDOW_W, WINDOW_H);
	//板子初始坐标
	board_x = (WINDOW_W - BOARD_W)/ 2;
	board_y = WINDOW_H - BOARD_H;

	//球心初始坐标
	ball_x = WINDOW_W / 2;
	ball_y = WINDOW_H - BOARD_H - RADIUS;

	//游戏循环显示
	while (isContinue)
	{
		displaysGame();
		ballMove();
		keyDown();
		Sleep(10);//画面帧率
	}
	while (1);
	return 0;
}

//画砖块
void drawBrickWall(int x, int y)
{
	if (brickWall[y][x] == 0)
	{
		setlinecolor(BLACK);
		setfillcolor(YELLOW);
		fillrectangle(x*BRICK_W, y*BRICK_H, x*BRICK_W + BRICK_W, y*BRICK_H + BRICK_H);
	}
	return;
}
//显示砖块
void displaysAllBrick(void)
{
	for (int i = 0; i < BRICK_R; ++i)//砖块行
	{
		for (int j = 0; j < BRICK_C; ++j)//砖块列
		{
			if (brickWall[i][j] == 0)
				 drawBrickWall(j, i);
		}
	}
	return;
}
//画板子
void drawBoard(void)
{
	setlinecolor(RED);
	setfillcolor(BLUE);
	fillrectangle(board_x, board_y, board_x + BOARD_W, board_y + BOARD_H);
	return;
}
//画球
void drawBall(void)
{
	setlinecolor(MAGENTA);
	setfillcolor(MAGENTA);
	fillcircle(ball_x, ball_y,RADIUS);
	return;
}
//显示所有画面
void displaysGame(void)
{
	BeginBatchDraw();
	cleardevice();
	displaysAllBrick();
	drawBall();
	drawBoard();
	EndBatchDraw();
	return;
}
//球的移动
void ballMove(void)
{
	ball_x += ballDir_x;
	ball_y += ballDir_y;
	return;
}
//碰撞检测
void collisionDetection(void)
{
	 //判断是否往右走并且是否撞上右上沿
	if ((ballDir_x > 0) && (ball_x >= (WINDOW_W - RADIUS)))
		 ballDir_x = -3;
	 //判断是否往左走并且是否撞上左上沿
	if ((ballDir_x < 0) && (ball_x <= RADIUS))
		 ballDir_x = 3;
	//判断是否往上走并且是否撞上上边沿
	if ((ballDir_y < 0) && (ball_y <= RADIUS))
		 ballDir_y = 3;
	//判断是否往下走并且是否撞上下边沿
	if ((ballDir_y > 0) && (ball_y >= (WINDOW_H - RADIUS)))
	{
		isContinue = false;
		LOGFONT font = { 0 };
		font.lfHeight = 40;
		font.lfWidth = 20;
		settextstyle(&font);
		outtextxy(WINDOW_W / 2-125, WINDOW_H / 2, L"Game Over!!!");
	}

	//检测球是否撞上了板子
	//(球的x坐标大于等于板子x坐标)并且(球的x坐标小于等于板子x坐标+板子宽)
	//并且球的y坐标大于等于板子y坐标减去球半径
	if ((ballDir_y > 0) && (ball_x >= board_x) && (ball_x <= (board_x + BOARD_W)) \
		&& (ball_y >= (board_y - RADIUS)))
		 ballDir_y = -3;

	//检测小球是否碰撞到砖块
	int flag = 0;
	for (int i = 0; i < BRICK_R; ++i)
	{
		for (int j = 0; j < BRICK_C; ++j)
		{
			int x = j * BRICK_W;
			int y = i * BRICK_H;
			//if (brickWall[i][j] == 0 && x - ball_x <= 15 && ball_x - x <= 81 && ball_y - y >= 10 && ball_y - y <= 40)
			if (brickWall[i][j] == 0 && (ball_x>=x -RADIUS) &&(ball_x<= x+BRICK_W+RADIUS)&&(ball_y<=y+BRICK_H+RADIUS)\
				&&(ball_y>= y+RADIUS))
			{
				ballDir_y = -1 * ballDir_y;
				brickWall[i][j] = 1;
				flag = 1;
				break;
			}
		}
		if (flag == 1) break;
	}

	//检测砖块是否打完
	int count = 0;
	for (int i = 0; i < BRICK_R; ++i)
	{
		for (int j = 0; j < BRICK_C; ++j)
		{
			if (brickWall[i][j] == 0)
				++count;
		}
	}
	if (count == BRICK_R * BRICK_C)
	{
		LOGFONT font = { 0 };
		font.lfHeight = 40;
		font.lfWidth = 20;
		settextstyle(&font);
		outtextxy(WINDOW_W / 2 - 125, WINDOW_H / 2, L"Game victory");
	}
	return;
}
//按键处理
void keyDown(void)
{
	collisionDetection();//不管有没有按键都要碰撞处理
	if (_kbhit() == 1)
	{
			int ch = _getch();
			switch (ch)
			{
			case 'A':
			case 'a':
			case 75:
				board_x -= 15;
				break;
			case 'D':
			case 'd':
			case 77:
				board_x += 15;
				break;
		}
	}

	//防止木板出界面
	if (board_x <= 0)
		board_x = 0;

	if (board_x >= (WINDOW_W - BOARD_W))
		board_x = (WINDOW_W - BOARD_W);
	return;

运行结果:
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2021-10-25 12:21:44  更:2021-10-25 12:24:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:22:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码