VC绘图游戏简易教程(修改bug版)

上传人:wu****ei 文档编号:132412811 上传时间:2022-08-08 格式:DOC 页数:51 大小:329.51KB
收藏 版权申诉 举报 下载
VC绘图游戏简易教程(修改bug版)_第1页
第1页 / 共51页
VC绘图游戏简易教程(修改bug版)_第2页
第2页 / 共51页
VC绘图游戏简易教程(修改bug版)_第3页
第3页 / 共51页
资源描述:

《VC绘图游戏简易教程(修改bug版)》由会员分享,可在线阅读,更多相关《VC绘图游戏简易教程(修改bug版)(51页珍藏版)》请在装配图网上搜索。

1、VC绘图/游戏简易教程-前言针对人群 职业不限,水平不限,男女不限。基本上,是从很基础的层次开始(但还是需要一点点基础)。 基础要求 希望读者已经简单学过C语言。我不会从定义变量开始讲。 要有英语基础,现阶段虽不是必须,但是学学英语总没错,以后有用。 学习目标 能做简单的图形小游戏。 讲解以简单实用为主,不要指望看了这几篇文章后就能过二级考试。 目标,除了能做小游戏外,更重要的,是锻炼编程思想,以备将来做更大的程序。 学习方式 以自学为主吧,有问题就在相关课程后面跟帖就行,一起讨论。 学习要求 欲速则不达,不要指望一口气都看完,请务必每次看完后都写几个相关的程序。勤动手才能学好编程,请务必重视

2、。 连载次数 不确定,想到哪写到哪吧,我会把每次的文章目录发到这里。 使用平台及搭建方法 请先正确安装 Visual C+ 6.0。 请到 首页下载最新版的 EasyX,并安装。可以参考这个视频:教程总目录:(里面包括VC下的graphics.h的配置方法)ps: 大家希望讲解哪些方面的内容,请到百度 easyx 吧发帖说明。只要我会的,我都会尝试写出来VC绘图/游戏简易教程-目录前言1:创建新项目2:简单绘图,学习单步执行3:熟悉更多的绘图语句4:结合流程控制语句来绘图5:数学知识在绘图中的运用6:实现简单动画7:捕获按键,实现动画的简单控制8:用函数简化相同图案的制作9:绘图中的位运算10

3、:用鼠标控制绘图/游戏程序11:随机函数12:数组13:getimage / putimage / loadimag / saveimage / IMAGE 的用法14:通过位运算实现颜色的分离与处理15:窗体句柄(Windows 编程入门)16:设备上下文句柄(Windows 编程入门2)VC绘图/游戏简易教程-1:创建新项目 本期目标学会在 VC 里面创建项目,并写简单的程序。VC 写程序要有项目的概念,一个项目可以有多个 .cpp 文件,多个项目构成一个工作区。先记住这两个英文单词吧: Workspace: 工作区 Project: 项目 现在开始创建一个新项目。 VC6 创建新项目请参

4、考这个视频: VC2008 创建新项目请参考这个视频: VC2010 与 VC2008 相似。 看明白后,自己动手建立项目试试,并输入以下代码:#include void main()printf(Hello World!);尤其是之前用 tc 的同学,请务必创建新项目试一试。成功执行后,会看到屏幕上有“Hello World!”几个字符。然后,再重新输入以下代码试试(无需理解代码含义):#include #include void main()initgraph(640, 480);line(200, 240, 440, 240);line(320, 120, 320, 360);getch

5、();closegraph();执行后应该可以看到屏幕正中央有一个十字。看到该十字后,本节课结束。VC绘图/游戏简易教程-2:简单绘图,学习单步执行 本期目标学会简单绘图,并学会简单调试。先看看上一课的代码,我加上了注释#include / 绘图库头文件,绘图语句需要#include / 控制台输入输出头文件,getch()语句需要void main()initgraph(640, 480);/ 初始化640x480的绘图屏幕line(200, 240, 440, 240);/ 画线(200,240) - (440,240)line(320, 120, 320, 360);/ 画线(320,1

6、20) - (320,360)getch();/ 按任意键closegraph();/ 关闭绘图屏幕解释一下:1. 创建的绘图屏幕640x480,表示横向有640个点,纵向有480个点。注意:左上角是原点(0,0),也就是说,y轴和数学的y轴是相反的。2. getch实现按任意键功能,按任意键后,程序继续执行。否则,程序会立刻执行closegraph以至于看不到绘制的内容。作业用线条画出更多的图形,要求不少于10条直线。学习单步执行完成作业后(务必完成),开始试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了):1. 将VC取消最大化,并缩小窗口,

7、能看到代码就行。2. 按一下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。3. 当箭头指向initgraph语句时,按F10,能看到窗口发生了变化。4. 将新的绘图窗口和VC并排放,相互不要有覆盖。这步很重要,否则绘图内容将会被VC窗口覆盖。5. F10执行getch后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。6. closegraph后,直接按F5执行全部剩余程序,结束。单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。更详细的调试资料,请打开:下载里面的VC6_how_to_debug.zip该文档写的调试的东西比较多,

8、看一下大概有个了解,以后都会用到(不过以后我就不再讲了)作业2仍然是写一个用直线绘制的图形,并熟悉调试过程。注:1. 许多学校都忽略了调试部分,如果你不曾用过调试,请务必熟练该过程。2. win-tc不带有任何调试功能,即便你不用vc,也请不要使用win-tc。调试是相当相当重要的。VC绘图/游戏简易教程-3:熟悉更多的绘图语句 学习目标学会更多的绘图语句常用的绘图语句line(x1, y1, x2, y2); / 画直线 (x1,y1)-(x2,y2),都是整形circle(x, y, r); / 画圆,圆心为(x,y),半径为rputpixel(x, y, c); / 画点(x,y),颜色

9、c还有很多,如画椭圆、圆弧、矩形、多边形,等等,请参考绘图帮助文件(第一课的绘图库的下载里面有)设置颜色setcolor(c); / 设置绘图颜色,如setcolor(RED)设置为红色等常用的颜色常量可以用:BLACK 黑 DARKGRAY 深灰 BLUE 蓝 LIGHTBLUE 亮蓝 GREEN 绿 LIGHTGREEN 亮绿 CYAN 青 LIGHTCYAN 亮青 RED 红 LIGHTRED 亮红 MAGENTA 紫 LIGHTMAGENTA 亮紫 BROWN 棕 YELLOW 黄 LIGHTGRAY 浅灰 WHITE 白配出更多的颜色颜色除了前面写的16种以外,还可以自由配色。格式:

10、RGB(r, g, b)r / g / b 分别表示红色、绿色、蓝色,范围都是0255。例如,RGB(255,0,0) 表示纯红色。红色和绿色配成黄色,因此 RGB(255,255,0) 表示黄色。嫌调色麻烦可以用画笔里面的调色试试,调好了以后直接将数值抄过来就行。例如,画两条红色浓度为200的直线,可以写:setcolor(RGB(200,0,0);line(100,100, 200,100);line(100,120, 200,120);用数字表示颜色除了用RGB(r,g,b)方式外,还可以用16进制表示颜色,格式:0xbbggrr例如,setcolor(0x0000ff) 和 setco

11、lor(RGB(255,0,0) 是等效的。延时语句这个很简单 Sleep(n) 就可以表示 n 毫秒的延时。例如延时3秒,可以用 Sleep(3000);作业1. 简单看一下绘图库的帮助文件,了解更多的绘图语句。2. 绘制更丰富的图形内容,不低于20行。3. 将延时语句适当的插入上个作业的代码中,看看执行效果。注:绘图语句不需要记住,用的时候翻翻手册就行.VC绘图/游戏简易教程-4:结合流程控制语句来绘图 学习目标熟练使用循环、判断语句熟悉for语句这步需要自学,看看自己手边的书,是怎样讲for语句的,简单看看就行。范例例如,画10条直线的代码:#include #include void

12、main() initgraph(640, 480); for(int y=100; y200; y+=10) line(100, y, 300, y); getch(); closegraph();换一下循环的范围和间隔,看看效果。还可以用来画渐变色,例如:#include #include void main() initgraph(640, 480); for(int y=0; y256; y+) setcolor(RGB(0,0,y); line(100, y, 300, y); getch(); closegraph();熟悉if语句这步需要自学,看看自己手边的书,是怎样讲if语句的

13、,简单看看就行。配合if语句,实现红色、蓝色交替画线:#include #include void main() initgraph(640, 480); for(int y=100; y200; y+=10) if ( y/10 % 2 = 1) / 判断奇数行偶数行 setcolor(RGB(255,0,0); else setcolor(RGB(0,0,255); line(100, y, 300, y); getch(); closegraph();作业1. 画围棋棋盘。2. 画中国象棋的棋盘3. 画国际象棋的棋盘,看手册找到颜色填充语句,实现过期象棋棋盘的区块填充。4. 自学whil

14、e语句。学到这里,已经可以画出很多东西了。把自己想象中的图案绘制一下吧。VC绘图/游戏简易教程-5:数学知识在绘图中的运用 学习目标理解数学的重要性1. 最简单的,来个全屏的渐变色吧,是上一课的扩展。就是需要将0255的颜色和0479的y轴对应起来c 表示颜色,范围0255y 表示y轴,范围0479于是:c / 255 = y / 479c = y / 479 * 255 = y * 255 / 479 (先算乘法再算除法可以提高精度)看代码:#include #include void main() initgraph(640, 480); int c; for(int y=0; y480;

15、 y+) c = y * 255 / 479; setcolor(RGB(0,0,c); line(0, y, 639, y); getch(); closegraph();试试效果吧。2. 画一个圆形的渐变色首先,我们要用到圆形的基本公式:x*x + y*y = r*r让弧度从02*3.14,然后需要根据弧度和半径算出(x,y),用pi表示圆周率用r表示半径用a表示弧度(小数)用c表示颜色于是:x=r*cos(a)y=r*sin(a)c=a*255/(2*pi)看看代码:#include #include #include void main() initgraph(640, 480);co

16、nst double PI=3.1415926; int c; double a; int x, y, r=200; for(a=0; aPI*2; a+=0.0001) x=(int)(r*cos(a) + 320 + 0.5); y=(int)(r*sin(a) + 240 + 0.5); c=(int)(a*255/(2*PI) + 0.5); setcolor(RGB(c,0,0); line(320, 240, x, y); getch(); closegraph();作业这次没什么作业,只是理解一下数学的重要性而已。如果读者还在念书,请重视数学。VC绘图/游戏简易教程-6:实现简单

17、动画所谓动画,其实是连续显示一系列图形而已。结合到程序上,我们需要以下几个步骤:1. 绘制图像2. 延时3. 擦掉图像循环以上即可实现动画。举一个例子,我们实现一条直线从上往下移动:#include #include void main() initgraph(640, 480); for(int y=0; y480; y+) / 绘制绿色直线 setcolor(GREEN); line(0, y, 639, y); / 延时 Sleep(10); / 绘制黑色直线(即擦掉之前画的绿线) setcolor(BLACK); line(0, y, 639, y); closegraph();再看一

18、个例子,实现一个圆从左往右跳动:#include #include void main() initgraph(640, 480); for(int x=100; x540; x+=20) / 绘制黄线、绿色填充的圆 setcolor(YELLOW); setfillstyle(GREEN); fillcircle(x, 100, 20); / 延时 Sleep(500); / 绘制黑线、黑色填充的圆 setcolor(BLACK); setfillstyle(BLACK); fillcircle(x, 100, 20); closegraph();也就是说,移动的间距小、延时短,动画就会越细

19、腻。但当画面较复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题)。作业绘制一个沿 45 度移动的球,碰到窗口边界后反弹。VC绘图/游戏简易教程-7:捕获按键,实现动画的简单控制最常用的一个捕获按键的函数:getch()前几课,都把这个函数当做“按任意键继续”来用,现在我们用变量保存这个按键:char c = getch();然后再做判断即可。不过程序执行到 getch() 是会阻塞的,直到用户有按键才能继续执行。可游戏中总不能因为等待按键而停止游戏执行吧?所以,要有一个函数,判断是否有用户按键:kbhit()这个函数返回当前是否有用户按键,如果有,再用 getch() 获取即可,这样是不会阻

20、塞的。即:char c;if (kbhit()c = getch();举一个简单的例子,如果有按键,就输出相关按键。否则,输出“.”。每隔 100 毫秒输出一次。按 ESC 退出。注:ESC 的 ASCII 码是 27。完整代码如下:#include #include #include void main()char c = 0;while(c != 27)if (kbhit()c = getch();elsec = .;printf(%c, c);Sleep(100);结合上一课的简单动画,就可以做出来靠按键移动的图形了吧,看以下代码,实现 a s 控制圆的左右移动:#include #in

21、clude void main()initgraph(640, 480);int x = 320;/ 画初始图形setcolor(YELLOW);circle(x, 240, 20);char c=0;while(c != 27)/ 获取按键c = getch();/ 先擦掉上次显示的旧图形setcolor(BLACK);circle(x, 240, 20);/ 根据输入,计算新的坐标switch(c)case a: x-=2; break;case s: x+=2; break;case 27: break;/ 绘制新的图形setcolor(YELLOW);circle(x, 240, 20

22、);/ 延时Sleep(10);closegraph();作业请继续完成这个程序,实现以下功能:1. 上下的控制; 2. 边界检测; 3. 结合 kbhit 实现惯性移动(即按一下方向键,圆就会一直向这个方向移动) 注:上下左右等按键的控制,会返回 2 个字符。由于该系列教程面向初学者,因此有兴趣的请查看 MSDN。VC绘图/游戏简易教程-8:用函数简化相同图案的制作实际中有许多类似的图案,如果一一单独绘制,太麻烦。于是,我们需要一个公用的绘制过程,就是函数。例如,我们需要画5个三角形,位于不同的位置。我们可以将绘制单个三角形的过程写成函数,函数内是一个独立的程序段,这个绘制过程很简单。然后,

23、在需要绘制的时候,调用这个函数即可。可以通过参数来解决细微差异(图案的坐标、颜色等),例如:#include #include / 在坐标 (x,y) 处,用颜色 c 绘制三角形void sanjiaoxing(int x, int y, int c) / 设置画线颜色 setcolor(c); / 画三角形的三条边 line(x, y, x+50, y); line(x, y, x, y+50); line(x+50, y, x, y+50);void main() initgraph(640, 480); / 初始化图形窗口 sanjiaoxing(100, 100, RED); sanj

24、iaoxing(120, 160, BLUE); sanjiaoxing(140, 220, GREEN); sanjiaoxing(160, 120, BLUE); sanjiaoxing(160, 160, GREEN); sanjiaoxing(220, 140, GREEN); getch(); / 按任意键继续 closegraph(); / 关闭图形窗口再结合循环等控制条件,就能绘制更复杂漂亮的图案了。试试运行下面程序,理解一下函数的用处:#include #include void sanjiaoxing(int x, int y, int color) / 设置画线颜色 set

25、color(color); / 画三角形的三条边 line(x, y, x+10, y); line(x, y, x, y+10); line(x+10, y, x, y+10);void main() initgraph(640, 480); / 初始化图形窗口 for(int x=0; x640; x+=10) for(int y=0; y480; y+= 10) sanjiaoxing(x, y, RGB(x*255/640, y*255/480, 0); getch(); / 按任意键继续 closegraph(); / 关闭图形窗口运行效果:本节作业:1. 绘制 Windows 自带

26、游戏“扫雷”的初始界面。VC绘图/游戏简易教程-9:绘图中的位运算位运算和绘图有什么关系?先举个例子来个感性认识:使用XOR运算可以实现擦除图形后不破坏背景,这在时钟程序中绘制表针是很有用的。稍后我们会给出这样的例子。一、位运算的运算法则位运算主要分4种:NOT、AND、OR、XOR位运算的运算对象是二进制数(十进制要转换为二进制,计算机会自动转换)。运算法则如下:1. NOT表示“取反”,将二进制位的1变0、0变1。C语言用符号 表示。如:二进制: 1101 = 0010用十进制表示就是:13 = 22. AND表示“并且”,只有两数的对应二进制位都为1,结果的二进制位才为1;否则,结果的二

27、进制位为0。C语言用符号 & 表示。如:二进制:1101 & 0110 = 0100用十进制表示就是:13 & 6 = 43. OR表示“或者”,两数的对应二进制位只要有一个是1,结果的二进制位就是1;否则,结果的二进制位为0。C语言用符号 | 表示。如:二进制:0101 | 0110 = 0111用十进制表示就是:5 | 6 = 74. XOR表示“异或”,两数的对应二进制位不同,结果的二进制位为1;相同,结果的二进制位为0。C语言用符号 表示。如:二进制:0101 1110 = 1011以上只是简单介绍一下,详细的还是请大家看课本上的讲解。二、位运算的应用位运算的应用很多,例如 AND 和

28、 OR 在获取和设置标志位时经常使用。更多的,以后大家会逐渐遇到,暂时先记下有这么回事。这里着重说一下 XOR 运算,它有一个重要的特性:(a b) b = a也就是说,a b 之后可能是某些其它数字,但是只要再 b 一下,就又成了 a。一些简单的加密就用的 XOR 的这个特性。至于绘图,假如 a 是背景图案,b 是将要绘制的图案,只要用 XOR 方式绘图,连续绘两次,那么背景是不变的。三、演示我们来一个简单的绘图 XOR 运算演示:#include #include void main() initgraph(640, 480); / 初始化 640 x 480 的绘图窗口 setlines

29、tyle(PS_SOLID, NULL, 10); / 设置线宽为 10,这样效果明显 rectangle(100,100,200,200); / 画一个矩形,当做背景图案 setwritemode(R2_XORPEN); / 设置 XOR 绘图模式 setcolor(RED); / 设置画线颜色 line(50,0, 200,300); / 画线 getch(); / 等待按任意键 line(50,0, 200,300); / 画线(XOR 方式重复画线会恢复背景图案) getch(); / 等待按任意键 closegraph(); / 关闭绘图窗口运行一下,看到第一次画线后,矩形与直线相交

30、的部分,颜色变成了青色,青色就是白色和红色 XOR 的值。当再次以红色画线时,青色部分消失了,还原为完整的白色矩形框。四、完整的范例来一个相对完整的范例吧,就是钟表程序,三个表针用的都是 XOR 方式绘制,请大家运行体会一下 XOR 的作用:#include #include #include void Draw(int hour, int minute, int second) double a_hour, a_min, a_sec; / 时、分、秒针的弧度值 int x_hour, y_hour, x_min, y_min, x_sec, y_sec; / 时、分、秒针的末端位置 / 计算

31、时、分、秒针的弧度值 a_sec = second * 2 * PI / 60; a_min = minute * 2 * PI / 60 + a_sec / 60; a_hour= hour * 2 * PI / 12 + a_min / 12; / 计算时、分、秒针的末端位置 x_sec = 320 + (int)(120 * sin(a_sec); y_sec = 240 - (int)(120 * cos(a_sec); x_min = 320 + (int)(100 * sin(a_min); y_min = 240 - (int)(100 * cos(a_min); x_hour=

32、 320 + (int)(70 * sin(a_hour); y_hour= 240 - (int)(70 * cos(a_hour); / 画时针 setlinestyle(PS_SOLID, NULL, 10); setcolor(WHITE); line(320, 240, x_hour, y_hour); / 画分针 setlinestyle(PS_SOLID, NULL, 6); setcolor(LIGHTGRAY); line(320, 240, x_min, y_min); / 画秒针 setlinestyle(PS_SOLID, NULL, 2); setcolor(RED)

33、; line(320, 240, x_sec, y_sec);void main() initgraph(640, 480); / 初始化 640 x 480 的绘图窗口 / 绘制一个简单的表盘 circle(320, 240, 2); circle(320, 240, 60); circle(320, 240, 160); outtextxy(296, 300, BestAns); / 设置 XOR 绘图模式 setwritemode(R2_XORPEN); / 设置 XOR 绘图模式 / 绘制表针 SYSTEMTIME ti; / 定义变量保存当前时间 while(!kbhit() / 按

34、任意键退出钟表程序 GetLocalTime(&ti); / 获取当前时间 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 画表针 Sleep(1000); / 延时 1 秒 Draw(ti.wHour, ti.wMinute, ti.wSecond); / 擦表针(擦表针和画表针的过程是一样的) closegraph(); / 关闭绘图窗口五、作业最后给出的绘制时钟的例子,很不完善,有不少问题。请完善该程序。例如样式上,表盘上没有刻度,没有数字,指针靠中心的一端应该长出来一点点,表盘太简单。还有就是尝试发现并改进功能实现上的问题。VC绘图/游戏简易教程-1

35、0:用鼠标控制绘图/游戏程序学习本节课前,需要熟练掌握第 7 节。详见:=本节课开始=捕获鼠标消息就像捕获按键消息一样简单。对于按键,通常我们会先检查是否有按键,然后定义一个变量保存按键,再然后根据该按键的值,执行相应的程序。对于鼠标,道理是一样的。先写个代码对比一下:获取按键: 获取鼠标:char c; MOUSEMSG m;if (kbhit() if (MouseHit() c = getch(); m = GetMouseMsg();很简单吧。由于鼠标消息的内容太多,不像按键那么简单,因此需要用一个结构体来保存。通过该结构体,我们可以获取鼠标的如下信息:struct MOUSEMSG

36、UINT uMsg; / 当前鼠标消息 bool mkCtrl; / Ctrl 键是否按下 bool mkShift; / Shift 键是否按下 bool mkLButton; / 鼠标左键是否按下 bool mkMButton; / 鼠标中键是否按下 bool mkRButton; / 鼠标右键是否按下 int x; / 当前鼠标 x 坐标 int y; / 当前鼠标 y 坐标 int wheel; / 鼠标滚轮滚动值;其中,“当前鼠标消息”可能是以下值:WM_MOUSEMOVE 鼠标移动消息WM_MOUSEWHEEL 鼠标滚轮拨动消息WM_LBUTTONDOWN 左键按下消息WM_LBU

37、TTONUP 左键弹起消息WM_LBUTTONDBLCLK 左键双击消息WM_MBUTTONDOWN 中键按下消息WM_MBUTTONUP 中键弹起消息WM_MBUTTONDBLCLK 中键双击消息WM_RBUTTONDOWN 右键按下消息WM_RBUTTONUP 右键弹起消息WM_RBUTTONDBLCLK 右键双击消息例如,判断获取的消息是否是鼠标左键按下,可以用:if (m.uMsg = WM_LBUTTONDOWN) .下面举一个综合的例子(我偷点懒,直接粘贴的绘图库帮助里面的鼠标范例),该程序会用红色的点标出鼠标移动的轨迹,按左键画一个小方块,按Ctrl+左键画一个大方块,按右键退出

38、:#include #include void main() / 初始化图形窗口 initgraph(640, 480); MOUSEMSG m; / 定义鼠标消息 while(true) / 获取一条鼠标消息 m = GetMouseMsg(); switch(m.uMsg) case WM_MOUSEMOVE: / 鼠标移动的时候画红色的小点 putpixel(m.x, m.y, RED); break; case WM_LBUTTONDOWN: / 如果点左键的同时按下了 Ctrl 键 if (m.mkCtrl) / 画一个大方块 rectangle(m.x-10, m.y-10, m.

39、x+10, m.y+10); else / 画一个小方块 rectangle(m.x-5, m.y-5, m.x+5, m.y+5); break; case WM_RBUTTONUP: return; / 按鼠标右键退出程序 / 关闭图形窗口 closegraph();本节作业1. 画一个填充的三角形,要用鼠标点选三角形的三个顶点。提示:可以用 fillpoly 函数画多边形。2. 写一个“格子涂色”的游戏,要求:屏幕上有16x8的格子,屏幕底部有类似画笔中的选色区(随便放上一些常用的颜色),鼠标点击选择区的颜色后,就作为当前颜色,然后再点屏幕上的格子,就可以用刚才的颜色填涂相应格子。VC绘

40、图/游戏简易教程-11:随机函数随机函数简介游戏中,许多情况都是随即发生的。还有一些图案程序,例如屏保,也是随即运动的。这就需要用随机函数。随机函数很简单,只有一个:rand()该函数返回 032767 之间的一个整数。(不需要记住 32767 这个数字,大概知道这个范围就行了)该函数在头文件 中,使用前记得引用。简单测试来写个程序测试一下:#include #include void main() int r; for(int i=0; i10; i+) r = rand(); printf(%dn, r); 执行后,可以看到输出了 10 个随机数字。指定范围的随机函数实际中,我们经常要产生

41、指定范围的随机函数,通常我们用求余数的办法。例如,产生 09 之间的随机数,只需要将任意产生的随机数除以 10 求余数即可。求余数的运算符号是 %,我们可以这样做: r = rand() % 10;修改前面的测试程序执行后可以看到,产生的数字都是小于 10 的。如果是 16 之间的怎样求呢? r = rand() % 6 + 1;无论产生什么样范围的随机函数,都是通过各种运算将随机数的范围 0, 32767 修改为自己需要的范围。随机种子做了多次试验,我们会发现一个问题:虽然产生的数字是随机的,但每次产生的数字序列都一样。为了解决这个问题,我们需要用“随机种子”。随机函数的产生原理简单来说,就

42、是:前一个随机函数的值,决定下一个随机函数的值。根据这个原理我们可以知道:只要第一个随机函数的值确定了,那么后面数字序列就是确定的。如果我们想的得到不同的数字序列,我们需要确定第一个随机函数的值,对于设置第一个随机函数的值,叫做设置“随机种子”。易知,随机种子设置一次即可。设置随机种子的函数如下:srand(种子);通常,我们用当前时间来做随机种子:srand( (unsigned)time( NULL ) );因为使用 time 函数,所以记得引用 。绘图中的应用来一个简单的程序,在屏幕上任意位置画任意颜色的点(按任意键退出):#include #include #include #incl

43、ude void main() srand( (unsigned)time( NULL ) ); initgraph(640, 480); int x, y, c; while(!kbhit() x = rand() % 640; y = rand() % 480; c = RGB(rand() % 256, rand() % 256, rand() % 256); putpixel(x, y, c); closegraph();作业1. 回顾一下第 6 课“实现简单动画”的作业:绘制一个沿 45 度移动的球,碰到窗口边界后反弹。将这个球改为任意方向运动,碰到边界后任意反弹。VC绘图/游戏简易

44、教程-12:数组课程要求:先复习下课本上对数组的讲解(随便一本教材都行)一维数组数组可以实现批量操作。比如,我们产生 10 个随机数,产生后先保存起来,然后输出最大的: int n10; int i; for (i=0; i=0; i-) printf(%dn, ni); / 找出最大的 int max = -1; for (i=0; i max) max = ni; printf(最大的数字是:%dn, max);看明白这个程序后,我们继续。下面,我们绘制一个从屏幕上边任意位置往下落的白色点:#include #include #include #include void main() sr

45、and( (unsigned)time(NULL) ); initgraph(640, 480); int x = rand() % 640; / 点的 x 坐标 int y = 0; / 点的 y 坐标 while(!kbhit() / 擦掉前一个点 putpixel(x, y, BLACK); / 计算新坐标 y+=3; if (y = 480) break; / 绘制新点 putpixel(x, y, WHITE); Sleep(10); closegraph();现在利用数组,来产生 100 个随机下落的点。并且每个点落到底部后,就回到顶部重新往下落:#include #include

46、 #include #include void main() srand( (unsigned)time(NULL) ); initgraph(640, 480); / 定义点的坐标数组 int x100; / 点的 x 坐标 int y100; / 点的 y 坐标 int i; / 初始化点的初始坐标 for (i=0; i100; i+) xi = rand() % 640; yi = rand() % 480; while(!kbhit() for(i=0; i= 480) yi = 0; / 绘制新点 putpixel(xi, yi, WHITE); Sleep(10); closeg

47、raph();二维数组理解了一维数组,再看二维数组甚至多维数组,就简单多了,看下面程序理解一下二维数组:程序要求:屏幕上有 16x8 的方格,按随机顺序在将 1128 的数字写到每个格子上。考虑:我们需要记录这些格子,哪些写过数字,哪些没写数字。我们用一个二维数组来记录:bool cell168;写过数字后,我们将相应数组的值设置为 true,看程序:#include #include #include #include #include void main() int x, y; char num4; srand( (unsigned)time(NULL) ); initgraph(640,

48、 480); / 画格子 for (x=0; x=480; x+=30) for (y=0; y=240; y+=30) line(x, 0, x, 240); line(0, y, 480, y); getch(); / 定义二维数组 bool cell168; / 初始化二维数组 for (x=0; x16; x+) for (y=0; y8; y+) cellxy = false; / 在每个格子上写数字 for (int i=1; i=128; i+) / 找到一个没有写数字的随机格子 do x = rand() % 16; y = rand() % 8; while(cellxy =

49、 true); / 标记该格子已用 cellxy = true; / 在格子上写数字 sprintf(num, %d, i); outtextxy(x * 30+5, y * 30+10, num); getch(); closegraph();以上几个范例,无论从实用上还是美观上都很差,我只是希望大家能举一反三,写出更多漂亮的程序。作业1. 回顾一下上一节课的作业,绘制一个任意反弹的球。这次,将程序修改成屏幕上有 10 个任意反弹的球。2. 如果反弹的不是球,而是点呢?再将某些点之间用线连起来,就可以做一个屏保“变幻线”的程序了。试试做一个。3. 写“涂格子(也叫点灯)”的游戏。详细规则可以

50、试玩网上的各种版本。以下作业,有时间就写。因为讲完这 12 节课,可以写出很多游戏了,所以可能会感觉作业一下子多了许多。4. 写个俄罗斯方块。5. 写贪吃蛇、扫雷。这两个稍微复杂一些,如果遇到问题,贴吧里贴出来,大家一起讨论。后面还会有更精彩的课程,敬请期待。VC绘图/游戏简易教程-13:getimage / putimage / loadimag / getimage / putimage / loadimage / saveimage 这一组命令和 IMAGE 对象可以实现图像处理的相关功能,下面逐个介绍。(有点类似 tc 中的 imagesize)加载图片实现加载图片主要分三步:1. 定义 IMAGE 对象2. 读取图片至 IMAGE 对象3. 显示 IMAGE

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!