用C++实现简单的小游戏

2023-10-30

采用面向对象的编程思想

在头文件中引入acllic图形库,实现c++控制图片以及生成可视化窗口

所需工具:

acllib图形库下载地址:acl图形库下载地址

 win32位项目的创建:通过visual studio创建win32项目

三张图片:tom.bmp,jerry.bmp,heart.bmp

游戏规则很简单,如下:

1.猫和老鼠游戏,其中包含可以加分的红心(heart)。

2.用户通过上下左右键控制老鼠jerry的移动,每当老鼠jerry与猫tom碰撞时,用户分数会下降,当老鼠jerry与红心heart碰撞时,用户分数增加。

3.tom猫的个数会随着时间增加,上限为5只,生成位置随机。

游戏没有设置获胜或者失败条件。

游戏效果图:

工程结构图:

注:

setup()函数为acllib库里的启动函数,相当于一般c++程序中的主函数。

游戏的重点在于图片碰撞的检测算法,要考虑两张图片的位置x,y与两张图片的宽高width,height之间的关系,用if语句进行判断,若猫鼠碰撞则减分,若鼠心碰撞则加分。

要考虑猫主动碰撞鼠、鼠主动碰撞猫以及鼠主动碰撞红心3种情况。

游戏的第二重点在于猫的自动生成与运行轨迹。代码中采用计时器实现tom猫的随机生成与移动,生成位置的随机性使用rand()函数实现 。用结构体数组和循环实现五只tom猫。   开头的srand((unsigned)time(NULL));语句让rand()函数与时间无关。

 

源码:

#include "acllib.h"
#include <time.h>
#include <string>
using namespace std;
typedef struct rect
{
	int x;
	int y;
	int width;
	int  height;
}rect;
ACL_Image tomimg, jerryimg,heartimg;//变量
ACL_Color red = RED;
void timerEvent(int id);
void keyEvent(int key, int e);
int winWidth = 700, winHeight = 480;
int moveid = 0, movetime = 60;
int creatid = 1, creattime = 6000;
const int maxnum = 5;
const char* tomm = "tom.bmp";
const char* jerryy = "jerry.bmp";
const char* heartt = "heart.bmp";
void paint();
int score=0;//分数
int collision(rect r1, rect r2);

struct sprite {
	char const* name;
	int x, y;
	int distx, disty;
	int width, height;
};
struct sprite tom[maxnum], jerry , heart[maxnum];
int num = 0;


int Setup()
{
	srand((unsigned)time(NULL));
	initWindow("happy game", DEFAULT, DEFAULT, winWidth, winHeight);
	loadImage(tomm, &tomimg);
	loadImage(jerryy, &jerryimg);//
	loadImage(heartt, &heartimg);//

	tom[0].width = 100;
	tom[0].height = 100;
	tom[0].x = rand() % (winWidth - tom[0].width);
	tom[0].y = rand() % (winHeight - tom[0].height);
	tom[0].distx = tom[0].disty = 3;

	//tom[num] = (struct sprite*)malloc(sizeof(struct sprite));//?


	jerry.x = 40;
	jerry.y = 50;


	registerTimerEvent(timerEvent);
	startTimer(moveid, movetime);
	startTimer(creatid, creattime);
	//paint();

	registerKeyboardEvent(keyEvent);
	//paint();
	return 0;
}//windows编程   消息处理机制
void timerEvent(int id)
{
	
	if (id == 0)
	{
		for (int i = 0; i < maxnum; i++)
		{
			tom[i].x += tom[i].distx;
			tom[i].y += tom[i].disty;
			if (tom[i].x > (winWidth - tom[i].width) || tom[i].x <= 0) tom[i].distx = tom[i].distx * -1;
			if (tom[i].y > (winHeight - tom[i].height) || tom[i].y <= 0) tom[i].disty = tom[i].disty * -1;
		}
		for (int i = 0; i < num; ++i)
		{
			rect r1, r2;
			r1.x = jerry.x;
			r1.y = jerry.y;
			r1.width = 80;
			r1.height = 70;

			r2.x = tom[i].x;
			r2.y = tom[i].y;
			r2.width = tom[i].width;
			r2.height = tom[i].height;
			int c = collision(r1, r2);
			if (c == 1) score--;

		}//判断于tom是否主动碰撞jerry

	}
	if (id == 1)
	{
		
		 if (num < maxnum-1)
		 {
			 num++;
			 tom[num].width = 100;
			 tom[num].height = 100;
			 tom[num].x = rand() % (winWidth - tom[num].width);
			 tom[num].y = rand() % (winHeight - tom[num].height);
			 tom[num].distx = tom[num].disty = 3;
			 
			 


		 }
		 heart[num].width = 40;
		 heart[num].height = 40;
		 heart[num].x = rand() % (winWidth - tom[num].width);
		 heart[num].y = rand() % (winHeight - tom[num].height);
		 heart[num].distx = heart[num].disty = 0;
		

	}
	paint();

}

void paint()
{
	beginPaint();
	//putImage(&img,0,0);//把图片数据绘制到指定位置
	clearDevice();
	setTextSize(40);
	setTextColor(BLACK);
	paintText(1, 1, "分数:");
	char score1[20];
	sprintf_s(score1, "%d", score);
	paintText(99, 1, score1);
	setTextSize(20);
	setTextColor(BLUE);
	paintText(490, 450, "使用键盘控制jerry");
	putImageScale(&jerryimg, jerry.x, jerry.y, 80, 70);
	for (int i = 0; i <= num; i++)
	{
		putImageScale(&tomimg, tom[i].x, tom[i].y, tom[i].width, tom[i].height);
		putImageScale(&heartimg, heart[i].x, heart[i].y, heart[i].width, heart[i].height);
	}
	

	endPaint();
}


void keyEvent(int key, int e)
{
	if (e != KEY_DOWN) return;
	switch (key)
	{
	case VK_UP:
		jerry.y = jerry.y - 11;
		break;
	case VK_DOWN:
		jerry.y = jerry.y + 11;
		break;
	case VK_LEFT:
		jerry.x = jerry.x - 11;
		break;
	case VK_RIGHT:
		jerry.x = jerry.x + 11;
		break;

	}
	for (int i = 0; i < num; ++i) 
	{
		rect r1, r2;
		r1.x = jerry.x;
		r1.y = jerry.y;
		r1.width =  80;
		r1.height = 70;
		
			r2.x = tom[i].x;
			r2.y = tom[i].y;
			r2.width = tom[i].width;
			r2.height = tom[i].height;
			int c = collision(r1, r2);
			if (c ==1) score--;

	}//判断于tom是否碰撞
	for (int i = 1; i <=num; ++i)
	{
		rect r1, r2;
		r1.x = jerry.x;
		r1.y = jerry.y;
		r1.width = 80;
		r1.height = 70;

		r2.x = heart[i].x;
		r2.y = heart[i].y;
		r2.width = heart[i].width;
		r2.height = heart[i].height;
		int c = collision(r1, r2);
		if (c == 1) { score = score + 5; heart[i].width = 0; heart[i].height = 0; heart[i].x = winWidth + 10000;  }
	}//判断是否与heart碰撞
	paint();
}
int collision(rect r1, rect r2)
{
	int c = 1;
if (r1.x<r2.x && r1.x + r1.width>r2.x) {
	if (r1.y > r2.y && r1.y < r2.y + r2.height) return c;
	if (r1.y<r2.y && r1.y + r1.height>r2.y)return c;
	else {
		if (r1.x > r2.x && r2.x + r2.width > r1.x) 
		{
			if (r1.y > r2.y && r1.y < r2.y + r2.height) return c;
			if (r1.y<  r2.y && r1.y + r1.height > r2.y)return c;

		}
		c = 0; return c;



	}

}

}

至此,游戏编写完成,但存在碰撞检测偶尔不敏感,jerry可以移动出可视化窗口等问题。

 

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

用C++实现简单的小游戏 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 算法——判断有向图是否有回路

    思路 一 借助AOV的拓扑排序算法来对整个有向图进行排序 拓扑排序算法 1 统计所有节点的入度 2 把所有入度为0的节点入栈 3 在栈不为空的条件下把栈顶元素一个一个的弹出 并把与此节点相连的节点 即此节点指向的节点 的入度减一 再判断入度
  • Chromium命令行开关列表2

    Chromium命令行开关列表 Google Chrome浏览器可以使用很多命令行 一些更改功能的行为 其他用于调试或试验 该页面列出了可用的开关 包括其条件和说明 上一次自动更新发生在2020 08 12 Condition Explan
  • C51实现流水灯

    文章目录 一 实验要求 二 实验代码和原理图 1 代码 2 原理图 总结 一 实验要求 1 先八盏灯从左至右依次点亮 同一时刻仅有一盏灯处于被点亮状态 每盏灯亮0 5s 然后八盏灯从右至左依次点亮 同一时刻仅有一盏灯处于被点亮状态 每盏灯亮
  • hdu 1074 Doing Homework

    Problem acm hdu edu cn showproblem php pid 1074 题意 n 份作业 分别给出名字 完成所需时间 cost 最迟上交时间 deadline 作业每迟交一天扣一分 问最少的扣分数 Analysis
  • 关于.sln和.suo文件

    sln 和 suo都是是解决方案文件 sln Visual Studio Solution 它通过为环境提供对项目 项目项和解决方案项在磁盘上位置的引用 可将它们组织到解决方案中 包含了较为通用的信息 包括解决方案所包含项目的列表 解决方案
  • TCL foreach的用法

    总结放于前 foreach var list body是foreach的的常见用法 foreach为关键字 var为形参 list为数据容器 数组等 body为函数块 程序每次在程序执行时从list中取到值并赋给形参var 函数块利用var
  • sql外连接内连接

    内连接 两表的交集 符合要求的数据列出来 外连接 左外连接就是查询 join左边表中的所有数据 并且把join右边表中对应的数据查询出来 主表的数据去跟从表一一比较 有就全部列出来 没有就也要列出一条 主表数据全要 他的从表数据变成Null
  • springboot集成Redis

    springboot集成Redis 1 windows平台安装Redis 2 引入依赖 3 修改配置文件 4 启动类添加注解 5 指定缓存哪个方法 6 配置Redis的超时时间 小BUG 测试 对于项目中一些访问量较大的接口 配置上Redi
  • python连接mysql数据库报错pymysql.err.OperationalError

    一 报错信息 pymysql err OperationalError 1045 Access denied for user root localhost using password YES Traceback most recent
  • docker基础:docker stats监控容器资源消耗

    docker stats docker stats 命令用来显示容器使用的系统资源 默认情况下 stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl c 下面是输出的主要内容 CONTAINER 以短格式显示容器的 ID
  • 基于反事实因果推断的度小满额度模型

    本文约4400字 建议阅读9分钟 本文从三个角度与你分享基于反事实因果推断的度小满额度模型 1 因果推断的研究范式 1 相关性与因果性 2 三大基本假设 2 因果推断的框架演进 1 从随机数据到观测数据 2 反事实表示学习 3 反事实额度模
  • 四川百幕晟科技有限公司:抖音没有视频怎么开店铺?

    抖音是中国最受欢迎的短视频平台之一 吸引了数亿用户 很多电商卖家希望利用抖音平台开展业务 但他们可能没有视频资源 幸运的是 抖音还提供了非视频商店功能 允许卖家开设自己的商店并在抖音上推广产品 本文将详细介绍在抖音上开店的步骤 并探讨如何在
  • 破解windows明文密码

    之前看了法国人写的一个软件 mimikatz 可以直接获取windows下的明文密码 简直是丧心病狂 作者已经开源 大家可以去谷歌一下 用SVN下载了源码 是vs2010的工程 然后按照下面命令开始看代码 privilege debug i
  • SQLAlchemy映射已有数据表

    方法一 手动创建数据表模型类进行映射 映射的表必须要有主键 配置数据库连接参数 class Config SQLALCHEMY DATABASE URI mysql pymysql root 123456 localhost 3306 te
  • mysql5.7 免安装版的配置过程

    1 去官网下载mysql 5 7 2 解压压缩包 首先给压缩包重命名一下 修改为你自己想要的 将解压目录下默认文件 my default ini 拷贝一份 改名 my ini 3 修改一下my ini 文件里的内容 client port
  • 基于卷积神经网络结合注意力机制长短记忆网络CNN-LSTM-Attention实现风电功率多输入单输出回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Kafka安装及测试

    系统环境 Linux Ubuntu 16 04 jdk 7u75 linux x64 相关知识 Kafka是由LinkedIn开发的一个分布式的消息系统 使用Scala编写 它因可以水平扩展和高吞吐率而被广泛使用 目前越来越多的开源分布式处
  • WPF编程,通过Path类型制作沿路径运动的动画另一种方法。

    上一篇文章给了一个这方面的例子 那个文章里是通过后台按钮事件进行动画的开始 停止 继续等 这里给出的是通过前台XAML来实现 1 前台 定义路径 定义运动的主体 这里是一圆
  • IEEE 754 round-to-nearest-even

    IEEE 754 二进制的向偶舍入 舍入的值保证最靠近原浮点数值 如果舍入为中间值 即舍还是入距离相等 那么按其最末尾一位是奇数 则入 如果为偶数 则舍 下面例子说明 xxx yyyyy10000 x为实数任意值 y为任意值 最末尾y为需要
  • 用C++实现简单的小游戏

    采用面向对象的编程思想 在头文件中引入acllic图形库 实现c 控制图片以及生成可视化窗口 所需工具 acllib图形库下载地址 acl图形库下载地址 win32位项目的创建 通过visual studio创建win32项目 三张图片 t