书名:C++图形化创意编程
ISBN:978-7-115-58445-8
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 张新华 葛阳 伍婉秋
责任编辑 赵祥妮
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
读者服务:
微信扫码关注【异步社区】微信公众号,回复“e58445”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
这是一本专为没有编程基础的读者编写的C++入门书,即使是小学生也可以轻松阅读本书。与多数C++入门书籍不同的是,本书基于作者改进的Dev-C++开发工具。该工具结合了游戏开发过程中经常使用的三维动画引擎(OpenGL)等技术,借鉴了绘图式编程语言(LOGO)的特点,使入门者只需通过极简单的几行代码,就能实现复杂而有趣的三维图形和动画的绘制。
全书包含十几个短小且趣味性强的程序,通过游戏化编程的方式,激发孩子们对计算机编程的兴趣,使他们能够轻松进入图形化C++的奇妙世界。
编委会主任:张新华 严开明
编委会委员:葛 阳 伍婉秋 谢春玫 梁靖韵 徐景全
刘路定 黎旭明 热则古丽
2017年7月8日,国务院印发《新一代人工智能发展规划》。规划指出,人工智能已成为国际竞争的新焦点,应逐步实施全民智能教育项目,在中小学阶段设置人工智能相关课程,逐步推广编程教育,鼓励社会力量参与寓教于乐的编程教学软件、游戏的开发和推广。建设人工智能学科,重视复合型人才培养,形成我国人工智能人才高地。
但在人们的普遍印象中,程序代码犹如天书,枯燥难懂,编程似乎只有极少数的孩子才能学会。所以,如何让更多孩子更轻松地学习编程,并享受编程的乐趣,一直是全世界编程教育工作者想要努力解决的问题。
20世纪60年代,麻省理工学院(MIT)的人工智能实验室开发了一款名为LOGO的编程语言。该语言结合儿童的心理认知特点,通过向前、后退、向左转、向右转、回家等儿童易于理解的语言和命令,控制屏幕上的“海龟”绘制出简单的二维图形。这种直观的编程方式能充分引起儿童的兴趣,调动儿童学习该语言的积极性,达到寓教于乐的目的。
2007年,一款由麻省理工学院设计开发的少儿编程工具——Scratch发布,并迅速风靡世界。该编程工具的特点是:使用者无须编写代码,只需要通过类似“堆叠”积木的方式即可完成程序的编写。孩子们通过这款工具,能快速掌握编程技巧,并在不断的“堆叠”中充分发挥自己的想象力和创造力。
对于C++的学习者来说,有没有一款类似Scratch简单易学、编程方式直观、趣味性强的开发工具呢?基于这样的想法,笔者从2016年开始,在Dev-C++ 5.x的基础上,结合OpenGL三维动画引擎等技术改进了Dev-C++智能开发平台。该平台入选了全国教育科学“十三五”规划教育部重点课题“中小学智能实验教学系统的构建与应用实践研究”子课题。
Dev-C++智能开发平台不仅可以实现LOGO语言的二维绘图功能,还可以轻松地实现三维图形的绘制、三维动画的制作及基于语音交流的弱人工智能,并能开发桌面小游戏……
教学反馈表明,Dev-C++智能开发平台能够极大地激发孩子学习计算机编程的兴趣,使孩子在新颖有趣、寓教于乐的编程过程中逐渐培养计算思维。
基于Dev-C++智能开发平台,我们精选了十几个趣味性强的程序汇编成本书。这些程序的代码简单且易于实现,大大降低了学习难度,非常适合C++入门培训和初学者自学。
由于水平有限,Dev-C++智能开发平台及本书难免存在疏漏之处,欢迎同仁或读者指正。如果在使用过程中发现任何问题,请发送电子邮件到hiapollo@sohu.com,希望读者对本书及软件提出宝贵意见以便进一步改进。
张新华
2022年4月
您还可以扫码右侧二维码, 关注【异步社区】微信公众号,回复“e58445”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。
从www.magicoj.com下载Dev-C++智能开发平台。
Dev-C++智能开发平台要求操作系统是Windows 7或以上的版本,推荐Windows 10(因为可以使用软件中的语音功能),计算机内存4GB或以上,硬盘可使用空间700MB或以上。
鼠标左键双击运行下载好的安装程序,如图A.1所示。
◎图A.1
单击“下一步”按钮,出现选择安装目录的界面,如图A.2所示,建议使用默认安装选项。
◎图A.2
安装完成后,运行Dev-C++智能开发平台,将进入初始设置界面。如果没有出现初始设置界面或者出现弹出错误提示对话框等情况,可在Dev-C++智能开发平台的“工具”菜单里选择“环境选项”,在“文件和路径”选项卡下单击“删除设置并退出”按钮,如图A.3所示。然后再重新运行Dev-C++智能开发平台,即可出现初始设置界面。
◎图A.3
设置好的界面如图A.4所示。
◎图A.4
Dev-C++智能开发平台添加了许多实用的功能,如代码数据库管理、Pascal语言转换C++语言、换肤及设计皮肤等,其中换肤功能如图A.5所示。
◎图A.5
微信扫码关注【异步社区】微信公众号,回复“e58445”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

本课我们将学习使用C++绘制一个图1.1所示的三维模型——茶壶。
◎图1.1
我们将学到的主要知识点如下。
(1)Dev-C++智能开发平台的使用方法。
(2)C++代码的基本框架。
(3)注释语句的使用。
(4)三维模型的绘制。

运行Dev-C++智能开发平台后,单击Dev-C++智能开发平台工具栏上的“笑脸”图标,如图1.2所示,创建一个三维动画工程。
◎图1.2
弹出“新项目”对话框,用鼠标指针选中绘图程序,单击“确定”按钮,如图1.3所示。
◎图1.3
如图1.4所示,在弹出的“另存为”对话框中选择合适的位置保存工程项目。一个三维动画项目中包含多个文件和文件夹,所以必须新建一个文件夹,将该工程项目中所有的文件和文件夹都保存在这个新建的文件夹中以便管理。
◎图1.4
在弹出的对话框中单击“打开”按钮,如图1.5所示。
◎图1.5
随后的设置均为默认选项,不做任何变动和修改,即可打开main.cpp,如图1.6所示。可以看到,该文件里已经自动写好了几行C++代码,这种.cpp格式的文件被称为C++源代码文件。
◎图1.6
#include "picture.h"表示包含一个名为picture.h的头文件(header file),有了这一句,就可以实现Dev-C++智能开发平台的扩展功能(如绘图等)。include的中文意思是“包含”。
int是英文integer的缩写,其中文意思是“整数”,表示程序如果正常结束,会给系统发送一条整数信息。
main()是函数的名称,函数是指能完成一定功能的程序块。函数的函数体用一对花括号括住,如第4行至第7行。C++代码中,必须有且只能有一个名为main()的函数,程序运行时由main()函数里的第一条语句开始执行,结束于main()函数里的最后一条语句。
第6行代码,即Win.Show();,用于显示绘图窗口。Show的中文意思是“显示”。该语句应该放在绘图语句的最后一行,如果删除了该行代码,程序运行时就不会显示绘图窗口了。
代码中的“//”表示C++语言里的注释语句。“//”之后的该行内容不参与编译和运行,所以注释语句的多少不影响程序运行的快慢。
如果要对一段代码进行注释,就要成对使用“/* */”,处于其中的所有字符均被注释,如图1.7所示。
◎图1.7
源代码文件其实就是文本文件,它是不可以直接运行的,必须要编译成.exe文件后方可运行。.exe文件是由0和1组成的二进制可执行文件(executable file),可以被计算机识别运行。在工具栏中单击“编译运行”按钮,如图1.8所示。
◎图1.8
如果编译运行成功,将弹出一个标准控制台窗口和一个绘图窗口,如图1.9所示。
◎图1.9
普通的Dev-C++软件运行时只有一个标准的控制台窗口,它是默认的数据输入输出窗口。Dev-C++智能开发平台增加了一个绘图窗口,可以在上面绘制图形和动画。

输入绘制茶壶命令,如图1.10第5行代码所示。Model的中文意思是“模型”,Teapot的中文意思是“茶壶”,“.”可以看作汉字“的”,因此,Model.Teapot可以理解为“模型库中的茶壶”。
茶壶显示的风格和大小由随后一对括号中的两个参数确定,其中第一个参数50表示茶壶尺寸,第二个参数0表示以网格风格绘制(1表示以实体风格绘制)。
◎图1.10
C++语言是字母大小写敏感的,要注意不能将字母的大小写写错。如图1.11所示,如果把Teapot写成了teapot,编译时程序会报错。此外,还要注意每行代码的结尾都要用分号“;”结束,否则编译时也会报错。
◎图1.11
输入的所有字符都应该是英文半角字符,只要把输入法设置为英文半角状态而不是中文状态即可。如图1.12所示,第5行代码的末尾是使用中文输入法输入的分号“;”,而不是英文半角状态下输入的分号“;”,所以编译时出现了错误提示。
◎图1.12
如果输入的代码无误,编译运行成功后,会显示出一只三维空间的茶壶。
如果按Alt+3键,视图将切换为3D显示模式,此时用鼠标单击绘图区域或者按“上”“下”“左”“右”方向键,可以改变物体的观察方向,如图1.13所示。
◎图1.13
绘图窗口中,所有快捷键的功能如表1.1所示。
表1.1 绘图窗口中的快捷键及其功能
| 按键 | 功能 | 按键 | 功能 | 
|---|---|---|---|
| Alt+1 | 正视图模式 | Alt+6 | 左视图模式 | 
| Alt+2 | 2D显示模式 | Alt+7 | 后视图模式 | 
| Alt+3 | 3D显示模式 | Alt+8 | 底视图模式 | 
| Alt+4 | 俯视图模式 | Alt+9 | 放大模式 | 
| Alt+5 | 右视图模式 | Alt+0 | 缩小模式 | 
| Alt+BackSpace | 代码提示及代码自动补全 | 
如图1.14所示,打开保存该工程的文件夹,可以看到文件夹中包含了一个子文件夹及多个文件。其中的“三维绘图程序.exe”就是刚才已编译好的可执行文件,它可以直接运行,无须Dev-C++智能开发平台的支持。
◎图1.14
不要单独打开main.cpp文件编写代码,因为main.cpp只是整个工程的一个文件。正确的方式是双击运行名为“三维绘图程序.dev”的工程文件,调用Dev-C++智能开发平台打开main.cpp文件后再进行代码的修改,否则会出现如图1.15所示的错误信息。
◎图1.15
如图1.16所示,加上命令Win.Run(x,y)可使绘制物体旋转,括号中的x和y是两个整数,分别表示水平旋转和垂直旋转的速度。例如Win.Run(10,0)和Win.Run(-10,0)分别表示从左向右旋转和从右向左旋转,Win.Run(0,10)和Win.Run(0,-10)表示自上而下的旋转和自下而上的旋转。
◎图1.16

为三维模型设置材质的函数为Model.Material(),例如Model.Material(2);可设置绘制的三维模型为黄铜材质,如图1.17所示。
◎图1.17
材质参数如表1.2所示。请编写代码,设置绘制的茶壶为自己喜欢的材质。
表1.2 材质参数
| 参数 | 材质 | 参数 | 材质 | 参数 | 材质 | 参数 | 材质 | 
|---|---|---|---|---|---|---|---|
| 0 | 标准色 | 5 | 铬 | 10 | 亮银 | 15 | 红宝石 | 
| 1 | 银 | 6 | 亮铜 | 11 | 祖母绿 | 16 | 绿松石 | 
| 2 | 黄铜 | 7 | 金 | 12 | 碧玉 | 17 | 黑塑料 | 
| 3 | 青铜 | 8 | 亮金 | 13 | 黑曜石 | 18 | 黑橡胶 | 
| 4 | 亮青铜 | 9 | 白蜡 | 14 | 珍珠 | 19 | 紫罗兰 | 

练习1 请通过查阅Dev-C++智能开发平台功能区的“绘图助手”或附录中的绘图函数库,尝试绘制各种立体图形,如绘制一个图1.18所示的五角星。
◎图1.18
微信扫码关注【异步社区】微信公众号,回复“e58445”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

本课我们将学习绘制类似图2.1所示的ASCII字符画。
我们将学到的主要知识点如下。
(1)ASCII码表的概念。
(2)输出语句cout的使用。
(3)换行符“\n”的使用。
(4)控制台颜色设置命令Cmd.BackColor("XY")的使用。
(5)转义字符的使用。
◎图2.1

接触一门新的编程语言,初学者学到的第一个程序通常是实现在屏幕上显示“hello,world”这一行字符串。“hello,world”的中文含义是“你好,世界”。最早是一本名为The C Programming Language的书使用它作为第一个演示程序,后来的程序员在学习编程时延续了这一习惯。
C++的输出使用cout和流插入运算符“<<”,以“流”(stream)的方式实现。因为数据的传输过程就像流水一样从一个地方流到另一个地方,所以C++将此过程称为“流”。图2.2演示了通过流进行输出的过程。
◎图2.2
我们将用cout语句输出由ASCII码表内的字符组成的字符画。ASCII码表是美国国家标准学会(American National Standards Institute,ANSI)制定的美国信息交换标准代码(American Standard Code for Information Interchange,ASCII),如表2.1所示,它统一规定了常用符号用哪些数字来表示。
英文字母、数字还有一些常用的符号(如*、#、@等)在计算机中是使用数字(二进制数)来表示的。具体用哪个数字表示哪个符号,虽然每个人都可以约定自己的一套编码规则,但如果要实现互相通信且不造成混乱,就必须使用相同的编码规则。
表2.1 ASCII码表
| ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | 
|---|---|---|---|---|---|---|---|
| 0 | NUL | 32 | (space) | 64 | @ | 96 | ‘ | 
| 1 | SOH | 33 | ! | 65 | A | 97 | a | 
| 2 | STX | 34 | ” | 66 | B | 98 | b | 
| 3 | ETX | 35 | # | 67 | C | 99 | c | 
| 4 | EOT | 36 | $ | 68 | D | 100 | d | 
| 5 | ENQ | 37 | % | 69 | E | 101 | e | 
| 6 | ACK | 38 | & | 70 | F | 102 | f | 
| 7 | BEL | 39 | ’ | 71 | G | 103 | g | 
| 8 | BS | 40 | ( | 72 | H | 104 | h | 
| 9 | HT | 41 | ) | 73 | I | 105 | i | 
| 10 | LF | 42 | * | 74 | J | 106 | j | 
| 11 | VT | 43 | + | 75 | K | 107 | k | 
| 12 | FF | 44 | , | 76 | L | 108 | l | 
| 13 | CR | 45 | - | 77 | M | 109 | m | 
| 14 | SO | 46 | . | 78 | N | 110 | n | 
| 15 | SI | 47 | / | 79 | O | 111 | o | 
| 16 | DLE | 48 | 0 | 80 | P | 112 | p | 
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q | 
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r | 
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s | 
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t | 
| 21 | NAK | 53 | 5 | 85 | U | 117 | u | 
| 22 | SYN | 54 | 6 | 86 | V | 118 | v | 
| 23 | ETB | 55 | 7 | 87 | W | 119 | w | 
| 24 | CAN | 56 | 8 | 88 | X | 120 | x | 
| 25 | EM | 57 | 9 | 89 | Y | 121 | y | 
| 26 | SUB | 58 | : | 90 | Z | 122 | z | 
| 27 | ESC | 59 | ; | 91 | [ | 123 | { | 
| 28 | FS | 60 | < | 92 | \ | 124 | | | 
| 29 | GS | 61 | = | 93 | ] | 125 | } | 
| 30 | RS | 62 | > | 94 | ^ | 126 | ~ | 
| 31 | US | 63 | ? | 95 | _ | 127 | DEL | 

C++在显示器上输出“hello,world”的实现代码如图2.3所示。
◎图2.3
第5行代码为输出语句,cout用于输出紧随流插入运算符“<<”后的双引号中的字符串。
如果在显示器上输出多行字符串是不是就需要多写几行这样的代码呢?我们尝试运行如下的代码。
1     #include "picture.h" //加入绘图头文件
2      
3     int main()
4     {
5       cout<<"东临碣石,以观沧海。";
6       cout<<"水何澹澹,山岛竦峙。";
7       cout<<"树木丛生,百草丰茂。";
8       cout<<"秋风萧瑟,洪波涌起。";
9       cout<<"日月之行,若出其中。";
10      cout<<"星汉灿烂,若出其里。";
11      cout<<"幸甚至哉,歌以咏志。";
12      Win.Show();//启动绘图窗口
13    }运行效果如图2.4所示。
◎图2.4
可以看到运行效果并不是想象中的逐行输出。还需要在代码中加入换行符“\n”,代码如下。
1     #include "picture.h" //加入绘图头文件
2      
3     int main()
4     {
5       cout<<"东临碣石,以观沧海。\n";
6       cout<<"水何澹澹,山岛竦峙。\n";
7       cout<<"树木丛生,百草丰茂。\n";
8       cout<<"秋风萧瑟,洪波涌起。\n";
9       cout<<"日月之行,若出其中。\n";
10      cout<<"星汉灿烂,若出其里。\n";
11      cout<<"幸甚至哉,歌以咏志。\n";
12      Win.Show();//启动绘图窗口
13    }Cmd.BackColor("XY")可以设置控制台窗口的背景色和前景色,其中X和Y为两个十六进制数,取值为0~F,分别代表背景色和前景色。0~F代表的颜色如表2.2所示。
表2.2 0~F代表的颜色
| 颜色 | 数值 | 颜色 | 数值 | 
|---|---|---|---|
| 黑色 | 0 | 灰色 | 8 | 
| 蓝色 | 1 | 淡蓝色 | 9 | 
| 绿色 | 2 | 淡绿色 | A | 
| 湖蓝色 | 3 | 蓝绿色 | B | 
| 红色 | 4 | 淡红色 | C | 
| 紫色 | 5 | 淡紫色 | D | 
| 黄色 | 6 | 淡黄色 | E | 
| 白色 | 7 | 亮白色 | F | 
例如,设置控制台窗口为蓝底绿字,并绘制两棵并排的树的代码如下。
1     #include "picture.h"       //加入绘图头文件 
2      
3     int main()
4     {
5       Cmd.BackColor("12");     //设置控制台背景色和前景色
6       cout<<"   *      *\n";
7       cout<<"  ***     ***\n";
8       cout<<" *****   *****\n";
9       cout<<" ******* *******\n";
10      cout<<"   *      *\n";
11      cout<<"   *      *\n";
12      Win.Show();//启动绘图窗口
13    }运行效果如图2.5所示。
◎图2.5
一些特殊字符无法直接以字符串的形式输出,例如图2.6所示的代码是无法通过编译的。
◎图2.6
仔细观察图2.7中的红色框,编译时编译器将框内的两个双引号当成了一对,就不知道该如何处理随后的双引号了。
◎图2.7
除双引号外,诸如反斜杠“\”、单引号“'”等字符也无法直接显示出来。为了正确显示这些特殊字符,可以在这些字符前加“\”,这种特殊字符的显示方法称为转义字符。之前我们用过的换行符“\n”就是转义字符。
使用了转义字符的正确代码如图2.8所示。
◎图2.8

如图2.9所示,http://patorjk.com/software/taag提供了根据英文字母生成各种风格的字符画的功能。请尝试输入任意英文字母,并通过网站生成自己喜欢的风格的字符画。将字符画复制到main.cpp源代码文件中,再使用cout输出语句将它输出到显示器上。
◎图2.9

练习 如图2.10所示,网络上有一些免费的在线生成字符画的网站,例如http://www.degraeve.com/img2txt.php提供了通过网络图片生成字符画的功能。
◎图2.10
请选择喜欢的网络图片,并通过上述类型的网站生成字符画。将生成的字符画复制到main.cpp源代码文件中,使用cout输出语句将它输出到显示器上。如果控制台窗口显示的字符画尺寸过大,可通过“Ctrl键+鼠标滚轮”的方式缩放尺寸。
微信扫码关注【异步社区】微信公众号,回复“e58445”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。