c++游戏制作指南(二):制作一个炫酷的启动界面(c++绘图)
🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
🍟欢迎来到静渊隐者的csdn博文,本文是c++游戏制作指南的一部🍟
🍕更多文章请点击下方链接🍕
🍨 c++游戏制作指南🍨
🍜专栏介绍:在这一专栏中,我将循循善诱,带领你,在冷峻的控制台上,种满缤纷,一同走入c++控制台游戏的殿堂。
🥨适宜人群:学习C++语言三个月及以上的爱好者,熟记基础语法(选择、循环两大结构),掌握基础算法(高精度、排序、模拟、贪心、搜索、动规等),知晓基础数据结构(数组、字符串、链表、栈、队列、树、图)。
🌭学习目的:能够自主编写出有趣的c++控制台游戏,并掌握自学的方法。
🥞喜欢的朋友可以关注一下,下次更新不迷路
🥙前言
做游戏,先要玩游戏。
我们先观察一下游戏。
打开游戏,扑面而来的往往是——
启动界面。
那么,就让我们来制作一个炫酷的启动界面吧。
在这启动界面,主要涉及的是绘图。
众所周知,c++可以利用图形库:easyX
easyX是什么?
EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。
比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。
许多人学编程都是从 C 语言入门的,而现状是:
- 有些学校以 Turbo C 为环境学习 C 语言,只是 Turbo C 实在太老了,复制粘贴都很不方便。
- 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题,想画条直线或一个圆都很难,例如需要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。
- 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。
所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。
当然,可以用。
但安装起来有点麻烦。
曾有人说过这样的话:
真正的强者,不需要廉价的帮助
——鲁迅(我没说过这句话)
所以,这里提供 仅仅
#include<bits/stdc++.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
这几个头文件就可以编译成功的炫酷开场代码。
开场动画
1.色块升降
先给出两段代码。
int drawbar(int h = 40, int l = 120) { for (int i = 0; i < h; i++) { cursor_to_the_position(i, 0); set_output_font_color(i, 0); for (int to_judge_if_lose = 0; to_judge_if_lose < l; to_judge_if_lose++) { printf(" "); } }
}
int drawbar1(int h = 40, int l = 120)
{ srand(time(NULL)); int s = rand()%4343536+1,missionaries_num;srand(s);for(int i=0; i<h; i++) {missionaries_num=rand()%15+1;cursor_to_the_position(i,0);set_output_font_color(missionaries_num,0);for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++) printf(" ");}
}
用人话说,就是几条线从天而降,运行一下可知。但第二条,色块更大。
科学的讲,就是这样。
第一段代码是一个函数的定义,名为
drawbar
,它接受两个参数h
和l
,默认为40和120。该函数的作用是在控制台中绘制一行,行高由参数h
控制,行长由参数l
控制。在函数的内部,使用一个嵌套的for
循环来控制行的长度,循环变量to_judge_if_lose
从0开始,每次增加1,直到达到l
的值。在循环的每次迭代中,使用printf
函数输出一个空格字符,从而在行中绘制出一定长度的空白部分。第二段代码是一个修改过的版本,名为
drawbar1
,它与前一个函数类似,但是添加了一些额外的功能。首先,在代码的开始处添加了使用srand
函数设置随机数种子,以便后续的随机数生成。此处使用了time
函数作为种子,以确保每次运行程序时生成的随机数序列不同。然后,在循环内部,新增了一个变量missionaries_num
,用于存储每次迭代生成的随机数。该变量的类型为整型,且范围在[1, 4343536]之间。在调用set_output_font_color
函数时,将missionaries_num
作为第一个参数,以便根据每次迭代生成的随机数来设置输出字体的颜色。总体而言,这两段代码都是用于在控制台中绘制一行,其中第二段代码添加了随机数生成器来设置输出字体的颜色,以增加变化的多样性。
同样,你也可以设计出向上下左右的。
就这样了。
2.花朵绽放
直接贴代码。
int drawrad(int h=40, int l=120, int z=0) { int x = h / 2, y = l / 2; double e, d; double m[17]; double w = 8.0; for (int i = 0; i <= 16; i++) { m[i] = PI * (double)(i - w) / (2 * w); } for (int i = 0; i < h; i++) { for (int to_judge_if_lose = 0; to_judge_if_lose < l; to_judge_if_lose++) { e = (double)(i - x) / (double)(to_judge_if_lose - y) * 2; d = atan(e); for (int k = 0; k < 16; k++) { if (d > m[k] && d < m[k + 1]) { set_output_font_color(k + z, 0); } } cursor_to_the_position(i, to_judge_if_lose); cout << " "; } }
}
功能解释如下:
这段代码实现了一个函数
drawrad
,该函数用于绘制一个半径为h
的圆在长度为l
的坐标轴上。以下是代码的功能解释:
- 定义了函数
drawrad
,它接受三个参数:h
、l
和z
,其中h
表示圆的半径高度,l
表示坐标轴的长度,z
表示输出字体的颜色偏移量。- 初始化变量
x
和y
为h
和l
的一半,用于计算圆心坐标。- 声明了变量
e
和d
,用于计算绘制圆时的相关值。- 声明了一个大小为 17 的双精度浮点数数组
m
,用于存储圆在坐标系上的角度值。- 初始化变量
w
为 8.0,用于计算圆在坐标系上的角度。- 使用循环遍历数组
m
,计算每个角度对应的值。- 使用两层嵌套的循环,遍历坐标轴的每个位置,并计算该位置对应的圆的极坐标参数
e
和d
。- 使用嵌套的循环,遍历每个位置,根据圆在坐标系上的角度判断输出字体的颜色,并设置输出字体的颜色。
- 将光标移动到当前位置,输出一个空格。
- 返回绘制的结果。
总体而言,这段代码的功能是在指定长度和半径的坐标轴上绘制一个圆,并根据圆在坐标系上的角度确定输出字体的颜色。
3.马赛克
int drawbar2(int h=40, int l=120) { srand(time(NULL)); int s = rand() % 4343536 + 1; srand(s); for (int i = 0; i < h; i++) { cursor_to_the_position(i, 0); for (int to_judge_if_lose = 0; to_judge_if_lose < l; to_judge_if_lose++) { int missionaries_num = rand() % 15 + 1; set_output_font_color(missionaries_num, 0); printf(" "); } }
}
自己运行一下,试试看。
显示LOGO
首先,LOGO要居中,因此先确定控制器长宽,再利用换行和空格到达。
然后,将标志转化成可输出的,并输出。
下面给大家看看我的工作室(一个人)的标志如何输出(仅展示中心代码):
std::cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; std::cout << " HH HH LL " << std::endl; std::cout << " HHHHHHH LL " << std::endl; std::cout << " HH HH LL " << std::endl; std::cout << " HH HH LLLLL" << std::endl; std::cout << "\n\n\n "; Sleep(200); string woshinibaba = "火龙游艺"; for (int i = 0; i < woshinibaba.size(); i++) { printf("%c", woshinibaba[i]); Sleep(300); }
效果图如下:
结语
上面只是提供了一些参考,闹着玩的。
具体还要结合更多资料开展学习。
相关文章:

c++游戏制作指南(二):制作一个炫酷的启动界面(c++绘图)
🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 🍟欢迎来到静渊隐者的csdn博文,本文是c游戏制作指南的一部🍟 🍕更多文章请点击下方链接🍕 🍨 c游戏制作指南dz…...

spring.config.location 手动指定配置文件文件
–spring.config.locationD:\javaproject\bangsun\ds-admin\ds-oper-mgr\src\main\resources\application.yml...
【uniapp 使用ECharts】
Uniapp可以使用ECharts进行数据可视化,需要按照以下步骤进行操作: 1. 安装ECharts插件 可以使用npm安装echarts插件,命令如下: npm install echarts --save2. 引入ECharts插件 在需要使用ECharts的页面中引入ECharts插件&…...

数据结构--线性表2-2
目录 一、线性表例题: 二、分配动态内存: 1.动态创建一个空顺序表的算法: 2.动态顺序表的插入算法: 3.动态顺序表的删除 三、线性表的链式表示和实现 例题1:创建链表并插入26个字母 例题2:在链表中取…...

利用openTCS实现车辆调度系统(一)系统介绍
系统介绍 openTCS简介 官方的回答: openTCS(开放式运输控制系统的缩写)是一种免费的控制系统软件,用于协调自动导引车(AGV)和移动机器人车队,例如在生产工厂中。 通常应该可以控制任何具有通信…...

销存管理系统ssm进销存仓库销售java jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 销存管理系统ssm 系统有1权限:管理员 二…...

【Axure教程】移动端二级滑动选择器
今天教大家制作移动端二级滑动选择器的原型模板,该原型已全国一二级省市选择器为案例,因为该原型用中继器做的,所以制作完成之后使用也很方便,只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…...
PHP操作solr
1,php下载solr(索尔)扩展,phpinfo需要支持solr扩展. 2,安装 Solr。Solr 要求您的系统上有 Java。java –version,Java 的版本大于 1.6 3,下载solr,并安装 D:\solr。 开启solr命令:solr start 关闭solr命令:…...

leetcode 46. Permutations(排列)
返回数组nums中数字的所有可能的排列组合。 思路: 排列组合这种一般会想到DFS。 这个排列中每个数字只能用一次, 可用如下DFS流程 stack.push(num); dfs(nums, num); stack.pop();退出条件: 当stack的size和nums数组一样时,说…...

5、二叉树
二叉树遍历 递归序 public static void f(Node head) {if (head == null) {return;}f(head.left);f(head.right); }前中后遍历_递归 public static void preOrderRecur(Node head) {if (head == null) {return;}System.out.print(head.value + " ");preOrderRecur…...
Doris比MySQL快的原因
简介 在数据存储和数据分析领域,MySQL和Doris是比较流行的数据库管理系统的代表。 在如今的大数据时代,数据量和数据分析的速度是很重要的。 在数据分析和数据处理中,Doris比MySQL快,这个问题一直是许多人关心的问题。 Doris的数…...

Prometheus + Grafana安装
Prometheus是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…...

二十三种设计模式第二十一篇--解释器模式
解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义一种语言的语法结构和解释器,使得可以解释并执行特定的语法规则。该模式可以将复杂的语言表达式分解为更小的语法单元,并定义其解释过程。 解释器模式的…...

PHP8的数据类型转换-PHP8知识详解
什么是数据类型转换? 答:数据从一个类型转换成另外一个类型,就是数据类型转换。 在PHP8中,变量的类型就是由赋值决定的,也就是说,如果 string 赋值给 $var,然后 $var 的类型就是 string。之后…...
2023 电赛 E 题 K210 方案
第一章:K210 介绍 K210芯片是一款基于RISC-V架构的嵌入式人工智能芯片,具备低功耗、高性能的特点。它拥有强大的图像处理和机器学习能力,适用于边缘计算设备和物联网应用。为了方便开发者,K210芯片提供了丰富的外设接口ÿ…...
Python的正则表达式re模块的compile()方法有什么作用?
re模块是Python标准库中的正则表达式模块,它提供了对正则表达式的支持。re.compile()是re模块的一个方法,用于将正则表达式编译成可复用的正则对象。 正则表达式是用来匹配和处理文本模式的强大工具。当你需要在字符串中查找、替换或者提取符合特定模式…...

SQL 语句中 left join 后用 on 还是 where,区别大了!
目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显…...

uni-app 微信小程序自定义导航栏
一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏(就是手机电量显示栏)和小程序的导航栏组成,android手机一般为48px,ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…...

电缆故障检测仪技术参数
一、电缆故障测试仪的技术参数 1.采样方法:低压脉冲法、冲击闪络法、速度测量法 2.电缆长度:50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置:交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压:35kV及以下…...

固定资产管理软件
固定资产全生命周期管理软件采用先进的RFID技术,从采购、入库、借用、总结、清理到损坏等方面准确统计资产,突破过去手工统计的复杂性,节省资产资源,减少调查时间,确保资产管理工作的准确性和快速性。 固定资产管理软…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...