![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 58
cqu_shuai
实事求是,不自以为是
展开
-
C++入门——实现“火柴人跑酷”游戏
参考《C和C++游戏趣味编程》 童晶火柴人跑酷游戏的思路是,玩家通过键盘控制火柴人的奔跑和跳跃,躲避蝙蝠到达终点。游戏地图随机生成,随着关卡数增加,游戏难度越来越大定义Player类class Player{public: IMAGE im_show; // 当前时刻要显示的图像 float x_left, y_bottom; // 左下角位置 float vx, vy;原创 2021-10-23 14:30:53 · 12895 阅读 · 16 评论 -
C++入门——实现“祖玛”游戏
参考《C和C++游戏趣味编程》 童晶祖玛游戏游戏的思路是,各种颜色的小球沿着轨道移动,玩家必须阻止小球进入轨道终点的城堡。玩家移动鼠标控制炮台旋转,按下鼠标右键更换小球颜色,点击鼠标左键发射小球。发射的小球进入轨道,如果周围有连续3个相同颜色的小球即可消除顶点类游戏中小球会沿着固定的轨迹移动,而轨迹可由一些离散的顶点组成,定义顶点类:class Point{public: float x, y; Point() { } Point(float ix, float iy)原创 2021-10-22 17:45:20 · 4263 阅读 · 3 评论 -
C++入门——实现“坚持一百秒”游戏
参考《C和C++游戏趣味编程》 童晶坚持一百秒游戏游戏主要思路是玩家通过鼠标控制火箭躲避一架UFO和越来越多的反弹子弹背景显示利用事先准备的background.png图片,在画面中显示背景图片:#include <graphics.h>#include <conio.h>#define WIDTH 560#define HEIGHT 800int main(){ IMAGE im_bk; // 定义图像对象原创 2021-10-21 16:05:49 · 1091 阅读 · 2 评论 -
C++入门——绘制樱花树
参考《C和C++游戏趣味编程》樱花树通过鼠标交互设定樱花树的高度和分散程度,鼠标右键点击设置是否显示过程动画,鼠标左键点击开始绘制绘制过程抽象(1)绘制一个树干(2)绘制其左边的子树干,绘制其右边的子树干(3)当到第n代树干时停止生成子树干#include <graphics.h>#include <conio.h>#include <stdio.h>#include <math.h>#define PI 3.1415926#原创 2021-10-13 17:53:17 · 10236 阅读 · 9 评论 -
C++入门——实现十字消除游戏
参考《C和C++游戏趣味编程》 童晶十字消除游戏用户点击空白方块,沿其上、下、左、右方向寻找一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关红色方块的表示与绘制定义Block结构体,利用Block类型的二维数组存储画面中所有小方块的信息。在startup()中将所有方块设置为红色填充、白色线条,在show()中绘制出所有方块:#include <graphics.h>#include <conio.h>#i原创 2021-10-12 18:12:50 · 2175 阅读 · 0 评论 -
C++入门——实现推箱子游戏
参考《C和C++游戏趣味编程》 童晶推箱子游戏玩家通过键盘控制游戏角色将所有黄色箱子推到白色方块处用字符数组存储关卡数据游戏一共有6种元素:(1)空白区域:玩家可以穿过,箱子可以推上去;英文名称:empty;缩写:‘e’(2)墙:玩家不能经过,箱子不能推过去;英文名称:wall;缩写:‘w’(3)箱子:在前面没有障碍物的情况下,玩家可以推动;英文名称:box;缩写:‘b’(4)空白目标:需要玩家将箱子推上去;英文名称:target;缩写:‘t’(5)完成目标:一个箱子在目标上的叠加原创 2021-10-06 00:26:25 · 2146 阅读 · 1 评论 -
C++入门——实现十步万度游戏
参考《C和C++游戏趣味编程》 童晶十步万度游戏用鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的旋转度数累积。玩家点击10次,尝试得到尽量高的旋转度数绘制圆圈和指针定义一个结构体Round,用于保存圆圈的信息,成员变量有圆圈的圆心坐标、半径和角度。进一步,定义一个Round类型的二维数组,保存所有圆圈的信息#include <graphics.h>#include <conio.h>#include <math.原创 2021-10-05 15:25:36 · 788 阅读 · 2 评论 -
C++入门——实现贪吃蛇游戏
参考《C和C++游戏趣味编程》贪吃蛇游戏键盘控制小蛇上、下、左、右移动,迟到食物后长度加1;蛇头碰到自身或窗口边缘,游戏失败程序框架#include <graphics.h>#include <conio.h>#include <stdio.h>// 全局变量定义void startup() // 初始化函数{}void show() // 绘原创 2021-10-04 17:35:47 · 12939 阅读 · 11 评论 -
C++入门——实现见缝插圆游戏
参考《C和C++游戏趣味编程》见缝插圆随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式每次增加一个随机圆设定圆的个数circleNum=100,定义3个数组用于存储所有圆的圆心坐标、半径,然后每隔100毫秒,添加一个随机圆并绘制#include <graphics.h>#include <conio.h>#include <stdio.h>#include <time.h>int main(){ int widt原创 2021-10-02 11:49:47 · 1727 阅读 · 2 评论 -
C++入门——实现见缝插针游戏
参考《C和C++游戏趣味编程》 童晶见缝插针“见缝插针”游戏:按下空格键后发射一根针到圆盘上,所有针逆时针方向转动;如果新发射的针碰到已有的针,游戏结束绘制圆盘与针绘制一个圆表示圆盘、一条线段表示一根针,圆心坐标及线段起点坐标均为(width/2, height/2)#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ int width = 800; in原创 2021-10-01 00:28:19 · 2709 阅读 · 2 评论 -
C++入门——实现“旋转蛇”错觉
参考《C和C++游戏趣味编程》 童晶“旋转蛇”错觉绘制错觉图片,使静止的圆盘看起来有在转动的错觉绘制扇形函数solidpie(left, top, right, bottom, stangle, endangle)可以绘制无边框的填充扇形。其中(left, top)、(right, bottom)为扇形对应圆的外切矩形的左上角、右下角坐标,stangle、endangle为扇形的起始角、终止角(单位为弧度)#include <graphics.h>#include <co原创 2021-09-26 17:16:17 · 2377 阅读 · 4 评论 -
C++入门——别碰方块游戏
参考《C和C++趣味游戏编程》 童真“别碰方块”游戏实现一个小球跳跃躲避方块的游戏空格键控制小球起跳让小球初始在地面上,按下空格键后起跳,落地后小球静止#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ float width, height, gravity; // 游戏画面宽高、重力加速度 float ball_x, ball_y,原创 2021-09-19 22:58:47 · 884 阅读 · 5 评论 -
C++入门——仿真小球自由落体运动和抛物线运动
参考《C和C++游戏趣味编程》 童真仿真自由落体的小球实现小球受重力影响加速下落后,碰到地面反弹的效果代码如下:#include <graphics.h>#include <conio.h>#include <stdio.h>int main(){ float y = 100; // 小球的y坐标 float vy = 0; //原创 2021-09-19 11:03:29 · 4065 阅读 · 1 评论 -
C++入门——机房预约系统
参考链接https://www.bilibili.com/video/BV1et411b73Z?p=282机房预约系统机房预约系统需求系统简介学校现有几个规格不同的机房,由于使用时经常出现撞车现象,现开发一套机房预约系统,解决这一问题身份简介分别有三种身份使用该程序学生代表:申请使用机房教师:审核学生的预约申请管理员:给学生、教师创建账号机房简介机房共有三间:1号机房,最大容量20人2号机房,最大容量50人3号机房,最大容量100人申请简介申请的订单每周由管理原创 2021-09-18 23:13:15 · 1916 阅读 · 0 评论 -
C++入门——演讲比赛流程管理系统
参考链接https://www.bilibili.com/video/BV1et411b73Z?p=264演讲比赛流程管理系统演讲比赛程序需求比赛规则学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛每名选手都有对应的编号,如10001-10012比赛方式:分组比赛,每组6个人第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩当小组演讲完后,淘汰组内排名最后的三个选手,前三名原创 2021-09-17 23:56:11 · 255 阅读 · 0 评论 -
C++入门——STL常用算法
参考链接https://www.bilibili.com/video/BV1et411b73Z?p=243STL常用算法算法主要是由头文件<algorithm> <functional> <numeric>组成<algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数<functional&g原创 2021-08-26 17:50:38 · 177 阅读 · 0 评论 -
C++入门——编程技巧
编程技巧当while()的循环条件是赋值语句时在while()的循环条件里面定义一个变量并赋值为0,例如:while (int i = 0){ printf("%d\n", i); i--;}以上代码不执行任何动作,相当于执行了while(0)操作,循环结束,while循环体不执行。而在while的循环条件里定义一个变量并赋值为非0时,相当于执行了while(1),程序进入无限循环,例如:while (int i = 1){ printf("%d\n", i); i--;}不原创 2021-07-18 23:51:07 · 947 阅读 · 7 评论 -
C++入门——虚函数
虚函数虚函数是面向对象编程中函数的一种特定形态,是C++中用于实现多态的一种有效机制什么是虚函数指向基类的指针在操作它的多态对象时,会根据不同的类对象调用相应的对象函数,这个函数就是虚函数,虚函数用virtual修饰函数名。虚函数的作用是在程序的运行阶段动态地选择合适的成员函数,定义了虚函数后,可以在派生类中对虚函数重新定义。在派生类中重新定义的函数应与基类的虚函数具有相同的形参个数和形参类型(参数类型顺序也要一致),以实现统一的接口。如果在派生类中没有对虚函数重新定义,则它继承基类的虚函数使用虚函原创 2021-07-18 16:45:34 · 1062 阅读 · 1 评论 -
C++入门——面向对象
面向对象面向对象与面向过程,即对象面向对象把数据即对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据都只能被本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。抽象流程由用户在使用中决定面向过程是一个以事件为中心的开发方法,就是自顶向下顺序执行,逐步求精,其程序结构是按功能划分为若干个基本模块,这些模块形成一个树状结构,各模块之间的关系也比较简单,在功能上相互独立,每一模块内部都是由顺序、选择和循环三原创 2021-07-18 10:42:35 · 2244 阅读 · 0 评论 -
C++入门——编译与链接
编译编译和链接的区别在多道程序环境中,要想将源代码变成一个可执行的程序,通常分为3个步骤:编译、链接、载入编译:将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言。链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模型。链接主要解决模块间相互引用问题,分为地址和空间分配、符号解析和重定位几个步骤。在编译阶段生成目标文件时,会暂时搁置那些外部引用,而这些原创 2021-07-17 18:32:02 · 862 阅读 · 1 评论 -
C++入门——进一步认识字符串
进一步认识字符串实现memmove用C语言实现函数void * memmove(void *dst, const void *src, size_t n)。memmove函数的功能是复制src所指的内存内容前n个字节到dest所指的地址上这个函数的参数与返回值的类型都是void*,在实现的时候需要把void*转换成可操作的数据类型来处理主要特别考虑的是内存重叠问题,处理内存重叠的主要思路如下:当源内存的首地址大于目标内存的首地址时,从源内存的首地址开始复制当源内存的首地址小于目标内存的首地址时原创 2021-07-17 13:34:27 · 66 阅读 · 0 评论 -
C++入门——变量
变量全局变量与静态变量相同点总的来说,它们的相同点是都保留在静态存储区,生命期与程序生命期相同。不同点总的来说,它们的不同点是,全局变量具有全局作用域,静态变量具有文件作用域。静态局部变量具有局部作用域,只被初始化一次,自从第一次被初始化,直到程序运行结束都一直存在。它和全局变量的区别在于,全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见静态全局变量也具有全局作用域,它与全局变量的区别在于,如果程序包含多个文件,它作用于定义它的文件里,不能作用到其他文件里原创 2021-07-16 22:08:46 · 236 阅读 · 0 评论 -
C++入门——进一步认识数组
进一步认识数组a是数组,a和&a是什么对于数组int a[5] = {1, 2, 3, 4, 5};,a表示数组首元素的地址,而&a表示数组的首地址a有两层含义:a表示数组首元素的地址(类型为int*)a表示一个大小为5的int数组数组名本身在计算中会自动转化成第一个元素的地址,但sizeof测试的时候不做计算,不转化。由此可以看出,在计算*(a + 1)的时候,可以把a看成int*类型的指针,a + 1表示的是数组第二个元素的指针,由此*(a + 1)的值为2。但是原创 2021-07-16 16:59:57 · 229 阅读 · 0 评论 -
C++入门——进一步认识函数
进一步认识函数接受可变参数的函数C语言中支持函数调用的参数为变参形式。例如,printf(),它的函数原型是int printf(const char* format, ...),它除了有一个参数format固定以外,后面跟的参数的个数和类型都是可变的,可以有以下多种不同的调用方法printf("%d", i);printf("%s", s);printf("the number is %d, string is: %s", i, s);也可以根据实际需求编写变参函数,例如实现多参数求和:原创 2021-07-15 21:15:52 · 106 阅读 · 0 评论 -
C++入门——位操作
位操作一些有关位操作的知识常用的等式:-n = ~(n - 1) = ~n + 1获取整数n的二进制中最后一个1:n & (-n)或者n & ~(n - 1)去掉整数n的二进制中最后一个1:n & (n - 1)结构声明中的冒号和数字C语言的结构体可以实现位段(也称位域),它的定义形式是在一个定义的结构体成员后加上冒号,然后是该成员所占的位数。位段的结构体成员必须是int或unsigned int类型,不能是其他类型。位段在内存中的存储方式是由具体的编译器原创 2021-07-14 23:40:11 · 1182 阅读 · 5 评论 -
C++入门——struct与class
struct与classC语言中的struct与union的区别union中所有成员共用一块地址空间,即union只存放了一个被选中的成员,而struct所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。struct的内存空间大小等于所有成员的长度之和(需要考虑字节对齐),而union变量的长度等于其最长的成员的长度对于union的不同成员赋值,会对它的其他成员重写,原来成员的值就不存在了,而对struct的不同成员赋值是互不影响的C和C++中struct的区别原创 2021-07-14 09:46:39 · 179 阅读 · 0 评论 -
C++入门——预处理的二三事
预处理概念预处理也称为预编译,它为编译做预备工作用于处理#开头的指令。常见的预处理指令及其功能#:空指令,无任何效果#include:包含一个源代码文件,把源文件中的#include扩展为文件正文,即把包含的.h文件找到并扩展到#include所在处#define:定义宏#undef:取消已定义的宏#if:条件编译指令,如果给定条件为真,则编译下面代码#ifdef:条件编译指令,如果宏已经定义,则编译下面代码#ifndef:条件编译指令,如果宏没有定义,则编译原创 2021-07-14 00:57:59 · 200 阅读 · 0 评论 -
C++入门——进一步认识指针
进一步认识指针使用指针的好处可以动态分配内存,由于可以直接操作内存,所以运行效率更高能写出简洁、高效的代码为动态数据结构,尤其是树和链表,提供支持可以写出更加复杂、灵活的数据结构高效地按引用“复制”数值与结构,特别是作为函数参数的时候,可以按照引用传递函数参数,提高开发效率指针与引用程序设计中的引用其实就是别名的意思,它用于定义一个变量来共享另一个变量的内存空间,进而提高程序的开发效率。指针指向另一个内存空间的变量,可以通过它来索引另一个内存空间的内容,而指针本身也有自己的内存空间引用原创 2021-07-13 15:58:31 · 92 阅读 · 0 评论 -
C++入门——sizeof与字节对齐
sizeofstrlen("\0")与sizeof("\0")strlen("\0") = 0,sizeof("\0") = 2。strlenstrlen用来计算字符串的长度,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值sizeofsizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定strlen与sizeof的区别sizeof是运算符(sizeof既是关原创 2021-07-13 13:44:25 · 1328 阅读 · 1 评论 -
C++入门——缓冲区溢出
缓冲区溢出概念缓冲区是程序运行时机器内存中的一个连续块,它保存了给定类型的数据。缓冲区溢出是指当向缓冲区内填充数据位数超过了缓冲区自身的容量限制时,溢出的数据覆盖在合法数据(如数据、下一条指令的指针、函数返回地址等)上。最好的情况是程序不允许输入超过缓冲区长度的字符并检查数据长度。由于大多数程序都会假设数据长度总是与所分配的存储空间相当,进而存在缓冲区溢出安全隐患。原因人为的缓冲区溢出一般是由于攻击者写一个超过缓冲区长度的字符串植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长字符串,这是可能会出原创 2021-07-13 11:52:07 · 12150 阅读 · 5 评论 -
C++入门——栈空间的大小
栈空间的大小概念在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈顶的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2MB。而申请堆空间的大小一般小于2GB。栈与堆栈的速度快,但是空间小,栈的大小受限于计算机系统中有效的虚拟内存,不灵活。堆获得的空间比较灵活,也比较大,但是速度相对慢。VC中,堆是人为控制的,所以容易产生内存泄漏问题。栈是向低地址扩展的数据结构,是一块连续的内存区域。而堆空间却不是连续的,原因在于系统用链表来存储空间的内存地址。同原创 2021-07-13 10:39:38 · 7285 阅读 · 0 评论 -
C++入门——内存泄漏
内存泄漏概念内存泄漏(memory leak),是指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。一般常说的内存泄漏是指堆内存的泄漏。内存泄漏其实并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由可以获得程序源代码的程序员才可以分析出来应用程序一般使用malloc、calloc、realloc、new等函数从堆中分配到一块内存,使用完后,程序必须负责相原创 2021-07-13 10:24:57 · 344 阅读 · 0 评论 -
C++入门——回调函数
回调函数概念回调函数就是被调用者回头调用的函数,它是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,此时就可以称它为回调函数。回调函数不是由该函数的实现方直接调用的,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给被调用函数。而该被调用函数在需要的时候,利用传递的地址来调用这个回调函数。实现原创 2021-07-13 00:48:20 · 447 阅读 · 0 评论 -
C++入门——explicit的作用
explicit的作用在C++中,如下声明是合法的。class String{ String(const char* p);};Strings1 = "hello";此时,String s1 = "hello"会执行隐式转换,等价于String s1 = String("hello");。为了避免发生这种情况,C++引入了关键字explicit,它可以阻止隐式转换的发生。在C++语言中,有一个参数的构造函数(或者除了第一个参数外,其余参数都有默认值的多参数构造函数)一般具有两个功能原创 2021-07-13 00:18:06 · 189 阅读 · 0 评论 -
C++入门——extern和export
extern的作用extern在C++中共有两个作用解决C++与C语言编译的时候名字匹配的问题未来引用其他模块的代码在C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在其他模块中使用。例如,在某些情况下,为了防止忘记初始化全局变量,会在头文件中直接初始化变量。此时,如果多个.cpp文件都包含了该头文件,编译时会报链接错误,因为链接器发现变量重复定义。可以把.cpp文件中的包含头文件换成extern int 变量名;,如此,编译时编译器就知原创 2021-07-12 21:41:43 · 2377 阅读 · 0 评论 -
C++入门——实现String类
注意事项注意内存泄漏问题左移符号的重载熟练使用const关键字#include <iostream>#include <string.h>using namespace std;class String{public: String(const char* str = NULL); //通用构造函数 String(const String &another); //拷贝构造函数原创 2021-07-12 21:08:30 · 122 阅读 · 0 评论 -
C++入门——exit()与return
exit()与returnreturn的功能返回函数调用,如果返回的是main()函数,则为退出程序exit()的功能在调用处强行退出程序,运行一次程序就结束。exit(0)程序结束时返回0给系统,正常退出;exit(1)程序结束时返回1给系统;exit(n)程序结束时返回n给系统二者区别return是语言级别的,它表示的是调用堆栈的返回;它仅仅从当前的函数中返回,只有return在主函数main的时候,才会结束当前进程。而exit()函数是系统调用级别的,它表示了一个进程的结束,因此exi原创 2021-07-12 20:41:36 · 1214 阅读 · 0 评论 -
C++入门——引用作为返回值
引用作为返回值将引用作为函数返回值类型的格式如下:类型标识符 &函数名(形参列表及类型说明){函数体}将引用作为返回值的优点在内存中不产生返回值的临时副本,从而大大提高了程序的安全性与效率注意事项不能返回局部变量的引用。局部变量由于存储在栈中,在函数返回后栈会被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态,会引起程序错误,甚至崩溃不能返回函数内部由new分配的内存的引用。这跟第一种情况类似。因为被函数返回的引用(new分配的内存的地址的值也是存储在栈中的原创 2021-07-12 20:12:14 · 1451 阅读 · 0 评论 -
C++入门——new/delete与malloc/free的区别
new/delete与malloc/free的区别在C++语言中,new/malloc可以用来在堆空间中申请空间,对应的delete/free可以用来释放在堆中的空间,new/delete和malloc/free只能配对使用。当它们被用到一般的数据类型的时候(如int、char等),有相同的效果。它们的主要区别:malloc/free是C/C++的标准库函数,new/delete是C++的运算符new/delete是在C++中引入的,当使用new创建对象的时候,在把空间申请好以后,还会调用类原创 2021-07-12 19:06:30 · 197 阅读 · 0 评论 -
C++入门——浮点数与零值比较
各类型变量与“零值”比较不同变量与零值比较方法不一样,但常常存在一些错误的用法。例如,把bool类型变量var与0的比较写成if(var == 0);把int型变量与零值比较写成if(!var);把指针变量var与零值的比较写成if(!var)。虽然上述写法能正确运行,但未能清晰表达程序的意思。正确的做法一般地,如果想使用if一个变量var是真还是假,可以直接使用if(var)、if(!var),表明其为“逻辑判断”如果用if判断一个数值型变量var(如short、int、long等),应该原创 2021-07-12 18:36:13 · 3904 阅读 · 1 评论