(图书介绍:童晶:《C和C++游戏趣味编程》新书预告)

本章我们将绘制一些漂亮的随机图案,如图所示,随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式。

首先利用数组实现多个圆的生成和绘制,并使得圆和圆之间不相交;然后学习函数的概念,并应用函数改进代码,添加了新圆半径最大化的功能;最后利用函数封装了多种绘制模式,并通过键盘按键进行互动。

6 见缝插圆

讲解视频:

最终代码:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <math.h>// 求解两个点之间的距离
float Dist2Points(float x1,float y1,float x2,float y2)
{float result;result    = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));return result;
}// 判断两个圆是否相交
int isTwoCirclesIntersect(float x1,float y1,float r1,float x2,float y2,float r2)
{if (Dist2Points(x1,y1,x2,y2)<r1+r2)return 1;return 0;
}// 填充黄色圆绘制
void DrawCircles1(float x,float y,float r)
{setlinecolor(RGB(0,0,0));setfillcolor(RGB(255,255,0));fillcircle(x,y,r);
}// 填充随机颜色圆绘制
void DrawCircles2(float x,float y,float r)
{float h = rand()%360;COLORREF  color = HSVtoRGB(h,0.6,0.8);setlinecolor(RGB(255,255,255));setfillcolor(color);fillcircle(x,y,r);
}// 填充随机颜色同心圆绘制
void DrawCircles3(float x,float y,float r)
{while (r>0){float h = rand()%360;COLORREF  color = HSVtoRGB(h,0.6,0.8);setlinecolor(RGB(255,255,255));setfillcolor(color);fillcircle(x,y,r);r=r-5;}
}// 随机颜色同心圆线条绘制
void DrawCircles4(float x,float y,float r)
{while (r>0){float h = rand()%360;COLORREF  color = HSVtoRGB(h,0.9,0.8);setlinecolor(color);circle(x,y,r);r=r-5;}
}int main() // 主函数
{int width = 600; // 窗口宽度int height = 600; // 窗口高度initgraph(width,height); // 新开一个窗口setbkcolor(RGB(255,255,255)); // 背景颜色为白色cleardevice(); // 以背景颜色清空背景srand(time(0));  // 随机种子函数int xArray[1000]; // 数组存储所有圆心的x坐标int yArray[1000]; // 数组存储所有圆心的y坐标 int rArray[1000]; // 数组存储所有圆的半径 int rmin = 8; // 圆的最小半径int rmax = 50; // 圆的最大半径int circleNum = 0; // 生成的圆的个数float x,y,r; // 新增圆的圆心坐标、半径int isNewCircleOK; // 用于判断新生成的圆是否可以了int i,j;int drawMode = 3; // 用于设定4种不同的绘制模式,开始设为3while (circleNum<1000) // 当圆的个数小于100时,循环运行{isNewCircleOK = 0; // 假设开始不OKwhile (isNewCircleOK==0) // 当新生成的圆不Ok时,重复生成新圆进行比较{if (kbhit()) // 当按键时{char input = _getch(); // 获得用户按键if (input==' ') // 空格键{circleNum = 0; // 圆的个数为0,相当于画面清除所有已有的圆圈cleardevice(); // 清屏drawMode = drawMode+1; // 进行下一种绘图模式if (drawMode>4) // 如果大于4,重新回到第1种绘图模式drawMode = 1;}}x = rand() % width; // 新圆的圆心x坐标y = rand() % height; // 新圆的圆心y坐标r = rmin; // 新圆的半径开始设为最小半径for (i=0;i<circleNum;i++)   // 对已有圆遍历if (isTwoCirclesIntersect(xArray[i],yArray[i],rArray[i],x,y,r))break; // 如果已有圆和新圆相交,跳出循环,此时i<circleNumif (i==circleNum) // 如果上面for语句都不跳出,说明i等于circleNumisNewCircleOK = 1; //  这个新生成的圆和已有圆都不相交}isNewCircleOK = 0; // 继续设为不OK,下面要让这个新圆的半径最大while (isNewCircleOK==0 && r<rmax) // 当不ok,并且新圆的半径小于最大半径时{r++; // 让半径+1for (j=0;j<circleNum;j++) // 对所有旧圆遍历{if (isTwoCirclesIntersect(xArray[j],yArray[j],rArray[j],x,y,r)){isNewCircleOK = 1; // 一旦和一个旧圆相交,这时新圆Okbreak; // 因为新圆半径已经达到最大的情况,这时跳出循环}}}xArray[circleNum] = x; // 把新圆的圆心坐标添加到数组中yArray[circleNum] = y; //rArray[circleNum] = r; // 把新圆的半径添加到数组中circleNum++; // 圆的个数+1// 根据不同绘图模式进行绘制       if (drawMode==1)DrawCircles1(x,y,r);if (drawMode==2)DrawCircles2(x,y,r);if (drawMode==3)DrawCircles3(x,y,r);if (drawMode==4)DrawCircles4(x,y,r);Sleep(10); // 暂停若干毫秒}_getch();  // 等待按键输入closegraph();  // 关闭窗口return 0;
}

这一章主要学习了函数的概念、进一步了解了while语句的使用方法,实现了见缝插圆随机图案的绘制。有了函数之后,我们可以把程序分成多个简单模块分别实现,更加容易开发出功能复杂的代码。读者也可以尝试把前几章案例中的部分功能用函数封装,进一步理解模块化编程的开发思路。

第6章 见缝插圆(《C和C++游戏趣味编程》配套教学视频)相关推荐

  1. c++ 清空数组_第6章 见缝插圆(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将绘制一些漂亮的随机图案,如图所示,随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式. 首先利用数组实现多 ...

  2. 第12章 坚持一百秒(《C和C++游戏趣味编程》教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将编写坚持一百秒游戏,玩家通过鼠标控制火箭躲避一架UFO和越来越多的反弹子弹,效果如图所示. 首先学习图片的导入和显示,并利 ...

  3. 第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将绘制非常神奇的错觉图片,静止的圆盘看起来却有在转动的错觉. 首先学习绘制扇形函数和RGB颜色模型,绘制了一个基本单元:然后 ...

  4. 第7章 贪吃蛇(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将编写贪吃蛇游戏,效果如图所示.键盘控制小蛇上下左右移动,吃到食物后长度加一:蛇头碰到自身或窗口边缘,游戏失败. 首先利用全 ...

  5. 第9章 推箱子(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将编写推箱子游戏,玩家键盘控制游戏角色将所有黄色箱子推到白色方块处,效果如图所示. 首先学习字符串与字符数组的概念,并应用字 ...

  6. 第8章 十步万度(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将编写十步万度游戏,效果如图所示.鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的 ...

  7. python循环绘制六角星_《Python游戏趣味编程》 第3章 美丽的圆圈画

    知乎视频​www.zhihu.com 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了​zhuanlan.zhihu.com 本章我们将利用Python绘制美丽的圆圈画, ...

  8. c++ 随机字符串_第3章 别碰白块(《C和C++游戏趣味编程》配套教学视频)

    (图书介绍:童晶:<C和C++游戏趣味编程>新书预告) 本章我们将实现一个小球跳跃躲避方块的游戏. 首先学习字符的知识,按空格键控制小球起跳:然后学习矩形的绘制,利用逻辑运算符实现小球和方 ...

  9. 《C和C++游戏趣味编程》 第8章 十步万度

    没想到前几天新书预告中(童晶:<C和C++游戏趣味编程>新书预告),有这么多朋友对实现十步万度游戏感兴趣,下面提前开源最终代码. 这个案例使用VS 2010 + EasyX开发,感兴趣的朋 ...

最新文章

  1. FPGA的LVDS电平以及LVDS25电平能在HR Bank上使用吗?
  2. python正则表达式操作指南_Python正则表达式操作指南
  3. SpringBoot 数据验证错误处理
  4. 免费SSL证书(支持1.0、1.1、1.2)
  5. 阿里研究院副院长:数字化是否可以买来?
  6. 信息学奥赛一本通 1067:整数的个数 | OpenJudge NOI 1.5 11
  7. TiDB 在 Ping++ 金融聚合支付业务中的实践
  8. java支付宝第三方支付详解
  9. ubuntu下使用visual studio code来编译和调试C++
  10. 字符数字转换 atoi 与 strtol
  11. ILSPY反编译工具下载代替收费的Reflector工具
  12. swf是什么文件以及与fla格式的区别
  13. 查找入职员工时间排名倒数第三的员工所有信息
  14. c++ primer plus 第十四章 C++中的代码重用
  15. cmos电路多余输入端能否悬空_CMOS电路不使用的输入端不能悬空
  16. ABAP 语法备忘 刘欣
  17. 跟我一起学PyTorch-07:嵌入与表征学习
  18. 个性化测试学生评测软件,学生综合素质测评软件定制开发方案
  19. 【内推】阿里集团2015年实习生招聘
  20. objection 基础知识

热门文章

  1. 非对称加密算法RSA
  2. 排序算法第四篇——冒泡排序
  3. 敏捷开发免费管理工具——火星人预览之六:我的空间,我的通知
  4. 【Android】选项卡使用
  5. SEO策略几个常见现象
  6. 提高搜索引擎结果页面排名的各种技术
  7. spring boot 使用 websocket tomcat刚启动就关闭到问题
  8. fbx模型加载的材质球路径
  9. UIWebView 真机iOS 8.x系统上报错
  10. 跨域-(jsonp cors)