基于MFC的连连看

本文记录了连连看实验中遇到的诸多问题及解决办法,如图标格式转换、对话框创建、地图绘制等。还分享了编程能力的进步,包括能冷静分析调试、利用互联网资源学习。同时反思了不初始化变量、测试不全面等毛病。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到的问题:

1.修改主界面的图标时,我只是将其他格式的图片拓展名修改成了ico,但是运行时出现is not in 3.0 format错误,经过查阅得知:仅仅修改图片的拓展名是不够的,可以用格式工厂将图片转换成ico格式。也可以下载ico图标。

2.在创建基本模式对话框时,我发现不能添加Onpaint,OnInitDialog等函数,发现我的类继承的不是CDialog,于是修改成了CDialog

3.创建基本模式对话框时,刚开始DoModal函数一直出错,我发现CGameDlg类没有和基本模式对话框关联起来,于是在CGameDlg类中加入了语句enum { IDD = IDD_GAME_DIALOG },但是没有用,依旧报错。经过查阅,发现CGameDlg应该继承于CDialogEX类,但是我始终找不到CDialogEX类,经过观看学校教学网上的教学视频,发现我应该从添加类窗口进行添加CGameDlg类,但是我的添加类窗口打不开,会报错,于是我通过类向导添加的,但是类向导中没有CDialogEX类。经过上网查阅资料得知,这是vs2017的一个bug,缺乏simple文件夹,在网上找到文件夹资源之后,问题得以解决。

4.在创建基本模式对话框时,忘记添加最小化和最大化按钮,补救方法是在属性界面将Maxisize Box和Minisize Box值修改为true

5.基本模式对话框最小化之后,任务栏没有显示图标,经过上网查阅,得以解决,解决办法是在CGameDlg类的OnInitDialog函数中添加语句:

    ModifyStyleEx(0, WS_EX_APPWINDOW);
    ShowWindow(SW_SHOW);

6.在绘制游戏地图时,因为CGameLogic提供地图二维数组(指针形式),在CGameControl中无法直接调用这个二维数组,于是我将CGameControl的地图生成函数StartGame返回值类型修改为int**,在StartGame类中创建CGameLogic的类logic,返回logic的二维数组指针,在CGameDlg类的开始游戏按钮中创建CGameControl类的对象control,将control的地图数组传递给CGameDlg类的UpdateWindow函数,因为传递的都是指针,所以整个过程中都是在对同一个二维数组进行操作。

7.因为按钮太丑,我在想如何美化按钮,网上查阅得知,可以用CMFCButton类,但是CMFCButton类的setFaceColor函数不能将按钮颜色改变,百度了很久也没解决,最后有人说这个函数不起作用了。放弃改变按钮颜色。

8.编写道具功能时,发现没有选择图片时也能使用道具按钮,并且积分也会增加,我怀疑是onButtonUp函数里面,用完第一次选择的图片和第二次选择的图片这两个变量之后没有清除值,并且使用完道具后,道具数量不会减少,虽然数值在道具按钮函数里有减少,但是在caculate函数里有语句ProNum=grade/100,使得道具数发生错误;解决方法是在CGameDlg类中添加了SetProNum函数,参数是消除当前这对图片之前的分数,如果新的分数除以100的值大于原来分数除以100的值,则道具数加一,每次发生分数变动,都调用SetProNum函数,问题得以解决。没有选择元素调用道具依旧会加分bug的原因是,control的m_pSelFirst和m_pSelSec仍然保留上次选择的值,仍然可以通过CEasyGame类的ProLink函数的if语句判断条件,解决方法是消除图片后,将m_pSelSec的info设置为-1,问题得以解决。

9.消息框MessageBox函数可以添加参数YESNO,消息框中有是/否两个按钮,返回值表示哪个按钮被按下。

10.使用CStdioFile进行写文件时,在字符串后面加上\n并不能换行,加上\r\n才可以。

11.在排行榜中发现单选按钮不能单选,百度之后发现一组中的单选按钮,要将第一个按钮的Group属性设置为true,如果第二个也设置为true,表示第二个是第二组的第一个按钮。

12.发现列表控件不能清空,如果选择了休闲模式排行榜,再切换到关卡模式排行榜,列表不会发生变化,再切换回休闲模式排行榜,会发现列表是在原来的数据下面生成新的列表,经过查阅资料,在绘制列表内容之前,先调用DeleteAllItem函数清空列表,问题得以解决。

    连连看实验到现在基本就做完了,只剩下最后一个设置主题功能,本次实验还是比较顺利的,可能是因为实验比较有意思自己很感兴趣吧,利用课余时间做,进度比较快,同时也反思了一下,将自己和以前做实验的状态进行了对比。

    大一的时候自己不会用编译器的一些debug功能,也不会分析问题出在哪,就是出了bug,开始心里难受,不知道为什么会出bug,这样的bug大概率是由于什么原因造成的,就是不会分析程序吧,也不会自己百度,查找相关的知识实现自己需要的功能。现在的状态就是,出了bug,可以很平静的面对,心里会想,这样的bug估计是某某原因造成的,或者是大概知道是在程序哪个地方出错的,比如,如果程序编译时没有报错,但是运行时突然弹出报错提示框,这种情况多半是数组越界或者指针问题,如果有数组操作,就去观察数组下标处理是否正确,这种情况下基本都能很快解决问题。另外一个就是,大概知道是哪里出了错,在相关的函数里打上断点,一步一步运行程序,观察变量值是否正确,如果不正确,就去观察是在哪一步开始变得不正确的,这种方法能定位到一大部分的bug。最后一个就是,某一功能出现bug,但是不知道在哪一块出了错,有多层函数调用,这种情况下就可以尝试着将别的函数注释掉,挨个观察函数,最终缩小观察范围,直至查找到bug所在。相比以前,编程能力进步了很多,积累的经验也给自己带来了很大的帮助,遇到bug时,心态变好了,也能静下心来利用自己所掌握的方法去调试了,效率比以前高了很多,比如说,在实现排行榜功能时,字符串格式转换、截取目标字符串等等,bug都十分细小,而且非常多,只有耐心的静下心来调试,一步一步运行,分析变量,最终才能解决bug。在查找某一bug的过程中,往往还会发现别的bug,对于我来说,这真是一个痛苦但又有意思的过程,最终当自己的bug都解决完毕,功能达到自己想要的效果之后,想想自己把千疮百孔的程序修改正确,真的成就感爆炸。真的感觉自己进步很大,当然都大二了再不进步估计以后就吃不上饭了......

   另外,相比以前,我还知道了利用互联网资源来学习,辅助自己实现程序,并不是说上网查找代码然后复制粘贴,而是,根据自己要写出来的功能,分析自己需要用到的技术,然后百度相关的技术,掌握用法,应用到自己的程序里,来辅助自己实现功能。例如:在连连看里,实现排行榜功能时,列表的相关操作我并没有学过,利用互联网,通过查阅如何插入列表项,设置列名行名等等,逐步实现;以及在帮助功能里,自己查阅资料实现滚动条的用法等等。虽然用到的技术很简单,但是相对于以前不知道利用互联网资源来说,自己还是有些进步的。

   最后,自己的毛病就是不喜欢对变量进行初始化,在使用前也不知道进行初始化,导致变量未初始化的值参与运算,最终使程序出错,真的初始化非常重要!这个初始化不单单指定义变量时初始化,更多的指重复利用重复赋值的变量在进行新的赋值之前,如果有必要清空上一次记录的值,一定要清空。还有一个就是在测试自己的程序时,测试不全面,只测试部分功能就认为没有bug了,然而可能还有bug没有测试出来,在进行迭代开发时,也许是以前没有测试出来的bug,但是却误认为当时的功能没有问题,应该是新添加的功能出现问题,这种误以为会让自己半天找不到bug......说到底还是不愿意面对自己程序有bug吧,测试时比较抵制自己程序出现bug,这种心理以后要改正......现在也更深刻地体会到:写程序一小时,改bug五小时(微笑.jpg)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值