打砖块游戏代码

2023-10-30

#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;
		}
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打砖块游戏代码 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • uniPush2.0云函数

    首先 按照下面链接 把预备工作做完 基本可以实现dcloud后台网页推送 uniPush2 0 消息推送 没有白天的CXY的博客 CSDN博客 第二步 走完本流程后 会遇到各种坑 一个一个来踩 第一 客户端推送 由于uniapp文档紊乱 跳
  • Android, 关于ViewModel的一些使用小技巧。

    情景 app使用了navigation组件 用一个Activity装载了多个Fragment 通过Fragment间的跳转来实现页面间的切换 当 界面有A fragment 跳转到 B fragment时 会将部分参数字段传递给Fragme
  • mysql基于SSM的学生社团管理系统 毕业设计源码211531

    SSM学生社团管理系统设计与实现 摘 要 21世纪时信息化的时代 几乎任何一个行业都离不开计算机 将计算机运用于社团管理也是十分常见的 过去使用手工的管理方式对学生社团进行管理 造成了管理繁琐 难以维护等问题 如今使用计算机对社团的各项基本
  • flex中dispatchEvent的用法(自定义事件)

    Evevt和EventDispatcher类在 as3的 事件机制中是很重要的角色 dispatchEvent 是EventDispatcher类的一个事件发送方法 它可以发送出Event类或其子类的实例 在as3中所有的显示 对象都可以发
  • MySql数据库修改表字段date类型为datetime类型

    语法 ALTER TABLE 表 MODIFY COLUMN 字段 字段类型 DEFAULT 默认值 COMMENT 说明 例如 alter table t user modify column createTime datetime de
  • 【正点原子FPGA连载】 第三十二章基于lwip的TCP服务器性能测试实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    第三十二章基于lwip的TCP服务器性能测试实验 上一章的lwip Echo Server实验让我们对lwip有一个基本的了解 而Echo Server是基于TCP协议的 TCP协议是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计
  • 游戏服务器开发需要学习的技术

    一 游戏服务器编程语言的选择 所谓的游戏服务器编程语言其实有很多 基本上任何一种语言都可以作为游戏服务器的编程语言 这需要根据自己游戏的类型和要求加以选择 比如C Java Erlang go等等 目前我用过的只有C 和Java 但是以Ja
  • Android Native APP开发笔记:双击返回键退出应用&单击返回键返回桌面

    文章目录 目的 基础说明 双击返回键退出应用 单击返回键回到桌面 总结 目的 双击返回键退出应用 很早之前就是Android中非常常见的一种功能 而目前好多安卓应用为了应用常驻都改为使用 单击返回键返回桌面 这篇文章将对相关内容做个简单记录
  • SQL热身测试

    创建数据库 CREATE DATABASE test 切换数据库 USE test 在test数据库中创建一个student的表格 CREATE TABLE student Id INT 10 PTIMARY KEY NOT NULL AU
  • Think in Java 异常类(第12章) 读书笔记

    概念 首先看一下Java中的异常体系 Error 一般是指与虚拟机相关的问题 如 OOM ThreadDeath RuntimeExprion NullPointerException ClassCastException IllegalA
  • 网络时间协议服务器检测,NTP网络时间服务器优势

    NTP网络时间服务器是一种利用NTP网络时间协议进行授时的时间服务器 NTP网络时间协议是用来同步计算机的一种协议 它能提供高精度的时间信息进行校时 NTP网络时间服务器以卫星信号为时间基准 并通过网络 串口 秒脉冲等输出信号给设备进行授时
  • Windows: 如何给USB设备安装驱动?

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 本文目标 系统下连接了一个USB设备 但系统没有自带的驱动 那么我们要如何找 到该设备对应的驱动呢 3 寻找USB驱动 3 1 找到设备的VID P
  • Spring Boot进阶:原理、实战与面试题分析

    在当下的互联网应用中 业务体系日益复杂 业务功能也在不断地变化 以典型的电商类应用为例 其背后的业务功能复杂度以及快速迭代要求的开发速度 与5年前的同类业务系统相比 面临着诸多新的挑战 这些挑战中核心的一点就是快速高效地实现系统功能 同时保
  • 再过几年,你可能就不用上班了

    内容来源 2023年6月10日 笔记侠举办的 AI新视野 增长新势能 新商业千人大会 注 未经讲者审阅 转载自笔记侠微信公众号 ID Notesman 笔记君说 6月10日 笔记侠在广州举办了第一届 AI新视野 增长新势能 新商业大会 此次
  • 大教堂和集市--两种不同的软件开发模式 论文阅读笔记

    该博文来自 The Cathedral and the Bazaar 一文的阅读总结 再加入一些自己的理解 今天又发现网上的一个资料 可以说是对本文的一个纲领吧 大教堂与集市 维基语录 1 Given enough eyeballs all
  • setlocale()用法笔记

    http www cnblogs com hnrainll archive 2011 05 07 2039700 html C 和 C 的标准库分别有自己的 locale 操作方法 C 标准库的 locale 设定函数是 setlocale
  • 【报告分享】快手磁力金牛达人商家成长白皮书-磁力金牛(附下载)

    摘要 过去品牌与达人主要通过合作带货模式实现双方营销增长 现在则转为以品牌自播 达人分销双线并行模式为核心 这不仅有利于沉淀品牌数据和品牌资产 也是帮助品牌在快手形成长期营销阵地的基础 同时品牌客户的引入和成长 也带来了平台货品的极大丰富
  • 搭建私有Nuget服务器(.Net Core框架)

    目录 概述 搭建nuget服务 Baget服务 服务器搭建后台 管理nuget包 设置私有nuget服务器地址 命令行 下载自己推送的包 概述 在私有服务器上搭建Nuget服务 本地打包推送nuget包 实现对 net core项目自定义包
  • 火狐浏览器安装插件,访问Github速度加快

    github 访问超级慢 使用火狐浏览器安装GitHub加速这个插件 访问github瞬间提速 firefox安装插件 打开火狐浏览器 选择右上角三这个按钮 展开的下拉菜单中选择设置 输入github加速 按下回车键 再次访问github网
  • 打砖块游戏代码

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