学生课程设计报告课程设计题目:数独字谜游戏专业名称:软件工程2013年6月21日一、课程设计内容数独字谜游戏:数独字谜游戏是在一个9x9的正方形内,给出一定的数字,让玩家在剩余的空格之内填写数字,最终使每一行,每一列,每一个3x3的小正方形都只有1-9,并且不重复,这样玩家就算通关的一款游戏。二、技术路线是基于vc++6.0环境下所开发的程序,加入了PlaySound()函数,设置了游戏的背景音乐。加入了cstdlib,ctime头文件,运用了以系统时间为种子的随机函数。接收用户键盘输入信息,实现进入游戏,输入坐标,输入数字等功能。运用的类型转换,将char型数组转换为int型数组。三、设计与实现1.游戏基本功能:游戏有难度选择,通关后继续游戏和退出游戏的界面。游戏在选择难度后,会在布满数字的9x9的正方形宫格内随机生成一些空白字符,根据选择难度的不同,生成的空白字符数目会不同,空白字符越多,难度越大。通过正方形宫格外的坐标,用键盘输入想输入数字的坐标和数字,随后会显示出输入数字后新宫格,再重复以上操作,直到每一行,每一列,每一个3x3的宫格内只有1-9这9个数字并且不重复,游戏就算通关。游戏通关后,可以选择继续游戏,并且挑战更大难度,也可以选择退出游戏,下次再战。2.函数定义和声明(1)头文件#includeiostream#includecstdlib//随机函数#includectime//系统时间#includepcc32.h//彩色文本#includemmsystem.h#pragmacomment(lib,pcc32_vc6.lib)#pragmacomment(lib,winmm.lib)usingnamespacestd;(2)函数声明boolyz(charb[9][10])//验证子函数,验证每一行,每一列,每一个3x3宫格都是1-9.3.主函数intmain()voidmain(){PlaySound((char*)kanong.wav,NULL,SND_ASYNC|SND_LOOP);chara[9][10]={{493761528},{582943167},{716528349},{139674852},{658219734},{247835691},{975382416},{821456973},{364197285}};intb[81],c[81],q=0,p=0;intk,x;do{setTextColor(14);cout*^0^*欢迎进入数独游戏*^0^*\n;setTextColor(10);cout请选择游戏的难易级别为?(3—高,2—中,1—低):endl;cink;switch(k){inti,j,m,n,gs;case1:srand((int)time(0));for(gs=0;gs30;gs++)//随机在已经布满的9x9宫格里,运用随机数,并且以系统时间为参数,随机产生空白字符,{//低难度的数独,每次产生的空白字符为22个左右,m=(int)(10*rand()/(RAND_MAX+1.0));n=(int)(10*rand()/(RAND_MAX+1.0));a[m][n]='';b[q]=m;//将随机产生的空白字符的坐标分别存在b,c两个数组中.c[p]=n;q++;p++;}b[30]=10,c[30]=10;do{setTextColor(15);cout123456789endl;setTextColor(3);cout__________________endl;cout‖----------------------------------‖endl;for(i=0;i3;i++){setTextColor(15);cout(i+1);for(j=0;j9;j++)//输出不同颜色的题目字符和空白字符.{if(j%3!=0){setTextColor(3);cout|;for(q=0,p=0;q31,p31;q++,p++)//将随机的空白字符单独表示出来,并且以另一种颜色输出表示.{if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30)//将剩下的题目字符用另一种颜色输出表示{setTextColor(12);couta[i][j];}}setTextColor(3);cout;}else{setTextColor(3);cout‖;for(q=0,p=0;q31,p31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30){setTextColor(12);couta[i][j];}}setTextColor(3);cout;}}setTextColor(3);cout‖endl;}setTextColor(3);cout‖==================================‖endl;cout‖==================================‖endl;for(i=3;i6;i++){setTextColor(15);cout(i+1);for(j=0;j9;j++){if(j%3!=0){setTextColor(3);cout|;for(q=0,p=0;q31,p31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30){setTextColor(12);couta[i][j];}}setTextColor(3);cout;}else{setTextColor(3);cout‖;for(q=0,p=0;q31,p31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30){setTextColor(12);couta[i][j];}}setTextColor(3);cout;}}setTextColor(3);cout‖endl;}setTextColor(3);cout‖==================================‖endl;cout‖==================================‖endl;for(i=6;i9;i++){setTextColor(15);cout(i+1);for(j=0;j9;j++){if(j%3!=0){setTextColor(3);cout|;for(q=0,p=0;q31,p31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30){setTextColor(12);couta[i][j];}}setTextColor(3);cout;}else{setTextColor(3);cout‖;for(q=0,p=0;q31,p31;q++,p++){if(i==b[q]&&j==c[p]){setTextColor(14);couta[i][j];break;}if(q==30&&p==30){setTextColor(12);couta[i][j];}}setTextColor(3);cout;}}setTextColor(3);cout‖endl;}setTextColor(3);cout‖----------------------------------‖endl;cout ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄endl;if(yz(a)==true)break;setTextColor(10);cout请输入要输入数字的坐标,以及要填入的数字(先行后列):endl;//输入每次要输入的数字.cinmn;for(q=0,p=0;q31,p31;q++,p++)//判断所输入坐标是否应填的字符,若是,则输入所要输入的数字,若不是,则报错误,并且重新输入.{if(m-1==b[q]&&n-1==c[p]){cina[m-1][n-1];break;}if(q==30&&p==30)cout输入有错,该位置为题目数字,请重新输入:\n;}cout**************************************************************************endl;}while(true);setTextColor(12);cout恭喜你过关!endl;break;case2://与case1类似。case3://同上。setTextColor(10);cout是否希望继续游戏:1-继续,2-退出!endl;cinx;}while(x==1);setTextColor(14);cout/*^0^*\谢谢使用,欢迎下次继续参与本游戏。endl祝您有个好心情!endl;}四、测试结果1.开始界面:图1-开始界面.jpg2.游戏界面:图2-游戏界面.jpg3.输入界面以及输入后的界面:图3-输入界面以及输入后的界面.jpg4.通关界面:图4-通关界面.jpg五、感想和体会刚开始有数独这个想法的时候,虽然觉得想法很简单,但是后来实际操作中才发现挺困难的。一共遇到了以下几个困难:1.如何在9x9的正方形内,将数字表现出来,并且也能表示为空白.2.如何随机生成空白字符.3.如何验证最终答案的正确性也就是每一行,每一列,每一个宫格内都为1-9.4.这个问题是在第一个问题解决的基础上遇到的,也就是用字符型的数组解决问题2.5.如何区分题目给的数字和自己填写的数字。6.如何输入只能输入空白字符,而不会因为输错坐标而改变题目所给的数字,导致题目的失效.这些问题都是相继出现的,在解决一个之后就会出现新的一个问题,虽然给我们的编程带来了一定的困难,更一度让我们觉得无计可施,但正是在这一个个问题的推动下,才有了我们今天比较完善的数独游戏,让我们明白了,困难,问题就是我们前进的动力。虽然现在的我们做的程序还很稚嫩,并且还有很多不完善的地方,但这是我们第一次认认真真,并且十分上心编写的第一个程序,每一个字符,每一个符号都是我们的心血,在最终完成的那一刻,我们的心情有着无比的自豪以及成就感。这一次的课程设计也让我们体会到程序设计中的快乐和痛苦,遇到问题无计可施的痛苦,绝处逢生的那一刻快乐,让我们体会到了程序设计的魅力所在。在今后的学习实践中,我们会更加努力,将设计作为一种快乐持续下去。