基于C++的学校病毒传播仿真

这次做着个项目是因为学校编程课的作业也就是学以致用大赛,从4月10号左右开始4月27号完成从完全不知道如何下手,到从同学那了得知了要用到easyx去学窗口界面。然后用Easyx的库去画出了几个图形,感觉还挺有趣。同时之前关注的童晶老师的关于用C语言去实现一些游戏也去看了一下他的视频,大概知道如何用之前的黑框框去写一个看似完全与图形毫无关联的简单游戏。然后就大概看了一下Easyx库的介绍,我大概就入门了,哈哈哈!

然后接着就是画一些图形,随着画的图形增加发现直接画好像很乱,就去大概学了一下C++的基本类,构造,继承这些概念(就是动手敲一敲书里的例程)。然后就写出两个类来,建筑类、人类,一开始,以为看一下书就能写的比较流畅的类,一写就发现自己好像很多都不懂,然后就停下一个星期,专门去看那本书。之后就写的流畅些。之后人在一个建筑物里随机移动就仿真出来了,但是,我发现人在建筑物中的移动好像有点困难,后来就想到用好多个像建筑物一样的框弄成路径对象,这样人物移动就变成了人在路径(很多个看不见的框框)上移动,但是我发现,路径是比较窄的,总之这个功能最终没能实现。后来,跟别的同学交流发现他们直接忽略掉路径。然后我也没再 考虑这个问题。

之后进展就加快了许多,先是实现人员一天在几个建筑物中生活,只用到了一个简单的静态计数变量。接下来就是人员在同一时刻去不同的建筑物,就写了一个分流函数,这也没什么。随着代码量的增加,我发现把所有东西放在一个文件里面,看起来很麻烦,然后我就照着之前学单片机对文件的管理,加上这是C++要对类进行管理。然后就去学习,类声明,类实现分别放在.h和.cpp文件中。

接下来就是把题目中的任务一个个做下来,每次完成一点点,自己还挺有成就感。首先是几种健康状态的改变,那这个比较简单就是单纯类中加个成员,当然状态还可以用枚举。其次就是感染距离感染率,这些要用两重循环因为每个人跟所有人要进行距离和感染率上的判断。感染率还跟带口罩有关,就在人类中增加是否戴口罩位这些任务都比较容易完成。当然感染率这块还用到一个随机数判断的小算法。

再然后就到核酸检测和隔离这块的任务了,这个还是有点难度的,隔离的人要去校医院,在校医院隔离10天后还会转好,重新回到校园当中。这个由于之前写的人员分流函数适用性比较差,我油不想看之前的代码,就又写了个新的专门用于遇到要隔离时校内人员的分流。隔离又要用到核酸检测,检测的第二天才能发现阳性,这样人类里又增加了检测时的天数。但是这样每一天的不健康者都会被拉去医院,这不符合现实情况,现实是只有早上核酸时是不健康的人第二天才会被拉去隔离,于是我又在人类中设置了一个核酸时不健康位记录早上做核酸时不健康的人。这样核酸检测和隔离的问题大概就解决了。

在我目前任务来说最后一步就是这个人机交互部分了,分为两部分一部分是只有显示,另一部分是需要通过界面可以调整的参数。这里就需要用到Easyx里的inputbox函数,这部分我还是找了一段时间的。网上对这部分描述不是很多,不过我觉得挺好玩的这个东西,一开始复制帮助文档里的例程发现它对中文字体用的是unicode,然后我用accii发现这种对这个函数不太适用,然后我又把前面的一些字符进行修改,要用到宽字符wchar_t,宽字符转数字wtio_函数,数字类型转宽字符类型我又找到了swpritf函数,还有对宽字符数组进行操作时要用到wcs+原先的cpy、cmp等等的操作函数。

if (peekmessage(&msg, EM_MOUSE))
{
	if (msg.lbutton == true && msg.x >= bottom_x && msg.y >= bottom_y &&
			msg.x <= bottom_x + bottom_length && msg.y <= bottom_y + bottom_width)
	{
		InputBox(bottom_inputname, 10, bottom_outputname, 0, 0, 0, 0, false);
		// 将用户输入转换为数字
		bottom_input = _wtoi(bottom_inputname);
	}
		
}

**************************************************************************************************************

鉴于之前写的实在是没眼看,我又想写一次,两天写的时间,我完成了初步的绘画,和无隔离下的转移。今天虽然是第二次写,但有些东西还是收获挺大的。主要这次想改进的是,不要去写那么多函数,尽量用类来进行封装,还有针对之前变量命名很乱,这次就对命名进行规范化。

文章链接:http://t.csdn.cn/2UWX8

今天写的时候这个vector引用我把他放到一个管理类里,发现vector的名字和数组名是有区别的数组名是一个指针,vector名是单纯一个名不带长度

文章链接:http://t.csdn.cn/M9uEK​​​​​​

还有写这个枚举的时候了解到强枚举类,还要说一下这个强枚举类里的成员不会转为int类型,所以如果要进行用到时要用强制类型转换。

文章链接:http://t.csdn.cn/asKUa

获取时间的话还参考:http://t.csdn.cn/mOphe

**************************************************************************************************************

终于在5月7号,提交的前一天,找出了4个BUG,完成了最后一次更改。

说一下找出的这几个问题,第一个是TXT文件读取时要一行行读,这个我在这方面还没有深入研究。所以我当时就想着能用就行,我开的那个程序对文本文件是需要一行行读的,这样我一开始写文件数据跟文字放在一行,就导致读不出来。

第二个问题就是数组越界的问题,因为一开始在读出文件时,直接改变了总人数,使原来的人数没有被记录下来就导致了无法更改容器容量。同时在核酸检测函数中有一个静态的容器一开始对他容量没有更改最后在他那里也导致了溢出。

后两个问题都是在用的时候发现的,就是初始化的时候有些项没有进行最终运行时就与想象中有出入。

**************************************************************************************************************

最后说一下过程中遇到的一些bug问题,当遇到下面错误列表报出的错误,一般就根据错误列表进行相应修改就行,一般大一点程序,有一个错时,它会给你报一大堆,但其实不用害怕,错误可能只有一两个,其他都是连带的。这种一般是语法错。还有一种我一开始遇到也挺害怕的错误就是运行过程中给你报的错误,直接就弹出一个全英文窗口让你中止,调试或其它的。你中止掉他,但回到编译器,错误列表中可能没有任何错误。我写这个程序时遇到几次,后来就发现规律了,每次几乎都是数组的溢出,所以就找一下一般是循环找数组元素时有没有超过这个数据范围!

这是我写这个项目一些心得,仅供参考!(还没写完,内容持续更新......)

我这篇文章在这个比赛后应该都不会有什么人看了,我把我的源码上传啦!(过几天再说)

百度网盘链接:https://pan.baidu.com/s/14bY6gF1jeMb7YR-5VBRwtw?pwd=1111 
提取码:1111

你可能感兴趣的:(编程语言,c++)