C语言—用EasyX实现反弹球消砖块游戏

代码效果如下

#undef UNICODE
#undef _UNICODE
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<stdio.h>

#define width 640
#define high 480
#define brick_num 10

int ball_x, ball_y;
int ball_vx, ball_vy;
int radius;
int bar_x, bar_y;
int bar_high, bar_width;
int bar_left, bar_right, bar_top, bar_bottom;

int isbrickexisted[brick_num];
int brick_high, brick_width;

int score;

void startup()
{
	srand(time(NULL));
	ball_x = rand()%(width/3)+width/3;
	ball_y = rand()%(high/4)+high/6;
	ball_vx = 2;
	ball_vy = 1;
	radius = 20;

	bar_high = high / 20;
	bar_width = width / 5;
	bar_x = width / 2;
	bar_y = high - bar_high / 2;
	bar_left = bar_x - bar_width / 2;
	bar_right = bar_x + bar_width / 2;
	bar_top = bar_y - bar_high / 2;
	bar_bottom = bar_y + bar_high / 2;

	brick_width = width / brick_num;
	brick_high = high / brick_num;

	int i;
	for (i = 0; i < brick_num; i++)
		isbrickexisted[i] = 1;

	initgraph(width, high, SHOWCONSOLE);
	BeginBatchDraw();
	
	score = 0;
}

void clean()
{
	setcolor(BLACK);
	setfillcolor(BLACK);
	fillcircle(ball_x, ball_y, radius);
	bar(bar_left, bar_top, bar_right, bar_bottom);

	int i, brick_left, brick_right, brick_top, brick_bottom;
	for (i = 0; i < brick_num; i++)
	{
		brick_left = i * brick_width;
		brick_right = brick_left + brick_width;
		brick_top = 0;
		brick_bottom = brick_high;
		if (!isbrickexisted[i])
			fillrectangle(brick_left, brick_top, brick_right, brick_bottom);
	}
}

void show()
{
	setbkcolor(RGB(0, 200, 200));
	cleardevice();
	setcolor(YELLOW);
	setfillcolor(GREEN);
	fillcircle(ball_x, ball_y, radius);
	bar(bar_left, bar_top, bar_right, bar_bottom);

	int i, brick_left, brick_right, brick_top, brick_bottom;

	for (i = 0; i < brick_num; i++)
	{
		brick_left = i * brick_width;
		brick_right = (i + 1) * brick_width;
		brick_top = 0;
		brick_bottom = brick_high;

		if (isbrickexisted[i])
		{
			setcolor(GREEN);
			setfillcolor(YELLOW);
			fillrectangle(brick_left, brick_top, brick_right, brick_bottom);
		}
	}

	char s[5];
	sprintf_s(s, "%d", score);
	settextcolor(YELLOW);
	settextstyle(30, 0, s);
	outtextxy(0, high-high/6, "消的砖块数:");
	outtextxy(30*6, high-high/6, s);

	FlushBatchDraw();
	Sleep(1);
}

void updatewithoutinput()
{
	if (ball_y + radius >= bar_top && ball_x >= bar_left && ball_x <= bar_right)
	{
		ball_vy = 4;
		ball_vy = -ball_vy;
		int sign = 1;
		if (ball_vx < 0)
			sign = -1;
		ball_vx = (rand() % 3 + 2) * sign;
	}

	ball_x += ball_vx;
	ball_y += ball_vy;

	float distant_right,distant_left;
	distant_right = (ball_x - bar_right) * (ball_x - bar_right) + (ball_y - bar_top) * (ball_y - bar_top);
	distant_left= (ball_x - bar_left) * (ball_x - bar_left) + (ball_y - bar_top) * (ball_y - bar_top);
	if (distant_right <= radius * radius + 1 || distant_left <= radius * radius + 1)
	{
		ball_vx = -ball_vx;
		ball_vy = -ball_vy;
	}

	if (ball_x - radius <= 0 || ball_x + radius >= width)
		ball_vx = -ball_vx;
	if (ball_y - radius <= 0)
		ball_vy = -ball_vy;
	if (ball_y + radius >= high)
	{
		printf("\n游戏失败!\n");
		Sleep(1000);
		EndBatchDraw();
		closegraph();
		exit(0);
	}

	int i, brick_left, brick_right, brick_top, brick_bottom;
	for (i = 0; i < brick_num; i++)
	{
		if (isbrickexisted[i])
		{
			brick_left = brick_width * i;
			brick_right = brick_width * (i + 1);
			brick_top = 0;
			brick_bottom = brick_high;
			if (ball_y - radius <= brick_bottom && ball_x >= brick_left && ball_x <= brick_right)
			{
				score++;
				printf("\a");
				isbrickexisted[i] = 0;
				ball_vy = -ball_vy;
			}
		}
	}
	int flag = 0;
	for (i = 0; i < brick_num; i++)
	{
		if (isbrickexisted[i] == 1)
			flag = 1;
	}
	if (flag == 0)
	{
		for (i = 0; i < brick_num; i++)
		{
			isbrickexisted[i] = 1;
		}
	}

}

void updatewithinput()
{
	char input;
	if (_kbhit())
	{
		input = _getch();
		if (input == 'a'&&bar_left>0)
		{
			bar_x = bar_x - 15;
			bar_left = bar_x - bar_width/2;
			bar_right = bar_x + bar_width/2;
		}
		if (input == 'd'&&bar_right<width)
		{
			bar_x += 15;
			bar_left = bar_x - bar_width/2;
			bar_right = bar_x + bar_width/2;
		}
	}
}

void gameover()
{
	EndBatchDraw();
	closegraph();
}

int main()
{
	system("pause");
	startup();
	while (1)
	{
		clean();
		updatewithoutinput();
		updatewithinput();
		show();
	}
	gameover();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

删除中间节点(狸猫换太子法)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一个裂缝都是为透出光而努力&#…

香橙派OPI Airpro上的智能交通监管系统(保姆级代码)

首先&#xff0c;你需要安装必要的软件包和库&#xff0c;例如Python3和TensorFlow。然后&#xff0c;你可以编写脚本来处理数据采集、分析和报告生成等任务。以下是一个简单的示例&#xff1a; # 安装必要的软件包 sudo apt-get update sudo apt-get install -y python3 pyth…

腾讯云4核8G服务器性能怎么样?大明白来说说

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

4月4号总结

java学习 一.接口 1.介绍 定义接口需要使用到关键字interface去定义接口。 格式如下&#xff1a; 类与接口的关系不是继承&#xff0c;而是实现&#xff0c;用关键字 implements &#xff0c;格式如下&#xff1a; 这个类去实现接口&#xff0c;其中的关系就相当于&#xf…

DFS(基础,回溯,剪枝,记忆化)搜索

DFS基础 DFS(深度优先搜索) 基于递归求解问题&#xff0c;而针对搜索的过程 对于问题的介入状态叫初始状态&#xff0c;要求的状态叫目标状态 这里的搜索就是对实时产生的状态进行分析检测&#xff0c;直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态…

不到2000字,轻松带你搞懂STM32中GPIO的8种工作模式

大家好&#xff0c;我是知微&#xff01; 学习过单片机的小伙伴对GPIO肯定不陌生&#xff0c;GPIO &#xff08;general purpose input output&#xff09;是通用输入输出端口的简称&#xff0c;通俗来讲就是单片机上的引脚。 在STM32中&#xff0c;GPIO的工作模式被细分为8种…

gitcode 配置 SSH 公钥

在 gitcode 上配置SSH公钥后&#xff0c;可以通过SSH协议安全地访问远程仓库&#xff0c;无需每次都输入用户名和密码。以下是配置SSH公钥的步骤&#xff1a; 5分钟解决方案 用 OpenSSH公钥生成器 生成 公钥和私钥&#xff0c;私钥文件&#xff08;id_rsa&#xff09;下载&am…

算法设计与分析实验报告python实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

python中如何使用help()

help()函数帮助我们了解模块、类型、对象、方法、属性的详细信息。 1、帮助查看类型详细信息&#xff0c;包含类的创建方式、属性、方法 >>> help(list) Help on class list in module builtins: class list(object)| list() -> new empty list| list(iterable)…

EmpireCMS:帝国源码cms网站搬家/数据迁移方法教程

帝国cms迁移数据&#xff0c;从一台旧的服务器把网站文件都搬迁到新的服务器&#xff0c;会涉及到附件&#xff0c;数据库信息等&#xff0c;很多人在搬迁的时候也会遇到各种问题&#xff0c;下面是小编整理的关于如何搬迁帝国cms数据的解决方案和思路&#xff0c;方便新手站长…

957: 逆置单链表

学习版 【C语言】 #include<iostream> using namespace std; typedef struct LNode {char data;struct LNode* next;LNode(char x) :data(x), next(nullptr) {} }LNode; void creatlist(LNode *&L) {int n;char e;cin >> n;LNode* p1, * p2;p1 L;for (int i…

Kubernetes的基础概念

目录 一、概述 二、为什么要用Kubernetes 2.1 从技术层面分析 2.1.1 问题解答 2.1.2 Docker等“裸容器”的不足 2.1.2.1 宕机无法自动恢复 2.1.2.2 健康检查不到位 2.1.2.3 部署、回滚、扩容问题 2.1.2.4 运维难 2.1.3 总结 2.2 从开发人员层面分析 2.2.1 分析日志 …

关于首助编辑高手

首助编辑高手是一款专为现代办公场景设计的集合软件&#xff0c;致力于提升用户的办公效率和便利性。它集成了多种实用的办公辅助工具&#xff0c;包括但不限于文档编辑、图片处理、PDF编辑、文本批量操作等功能&#xff0c;帮助用户轻松应对各种办公挑战。 首助编辑高手主要功…

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 向量加载和存储

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头&#xff0c;旨在建立基于现有开源最佳实践的安全…

我认识的Git-Git工作流

WorkFlow 的字面意思&#xff0c;工作流&#xff0c;即工作流程。工作流不涉及任何命令&#xff0c;因为它就是一个规则&#xff0c;完全由开发者自定义&#xff0c;并且自遵守。 集中式工作流 集中式工作流以中央仓库作为项目所有修改的单点实体。相比svn缺省的开发分支trunk…

canvas+javascript 实现贪吃蛇游戏

引言 在当今数字化时代&#xff0c;编程已经成为一种极具创造力和趣味性的活动。通过编写代码&#xff0c;我们可以创造出各种各样的应用程序和游戏&#xff0c;其中包括经典的贪吃蛇游戏。本文将向您介绍如何使用 JavaScript 编程语言制作一个简单而有趣的贪吃蛇游戏&#xf…

韩顺平Java | C23 反射Reflection

需求&#xff1a;通过外部文件配置&#xff0c;在不修改源码情况下控制程序&#xff08;符合设计模式ocp开闭原则&#xff1a;不修改源码的情况下扩容功能&#xff09; ※反射机制 反射机制允许程序在执行期间借助于ReflectioAPI取得任何类的内部信息&#xff08;如成员变量&…

数据仓库的建立

实验 目的 熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; 了解大数据处理的基本流程&#xff1b; 熟悉数据预处理方法&#xff1b; 熟悉在不同类型数据库之间进行数据相互导入导出&#xff1b; 熟悉使用R语言进行可视化…