核心模块流程图:
/*==============主函数====================*/
/*功能:主函数 */
/*传入参数:无 */
/*返回值:无 */
/*========================================*/
|

|
使用说明:
可在菜单与游戏区之间切换,在菜单区用上下选项,确认。在游戏区用上、下、左、右键移动光标选择一小区块,确认后,与此区域同样图标且相连(上、下、左、右)的所有小区域将被消除,
并得分数:
消除区域 X(消除区域-1)
1.若没有相连小区域,则此区域不被消除
2.若有区域消除,则其上方的小区域下落填补其位,若整列均被消除,则右方各列向左移动填补其位
3.游戏得分与结束游戏后所剩方块数无关,完全消除方块无奖励分
4.游戏时间与游戏得分无关,也不使游戏得分作废,只是在排名时如果得分相同用时短的排名更高
5.中途重新开始或退出游戏其本局得分无效
在游戏开始时或者在游戏中都可看见此帮助
总结:
第一次作课程设计,对作品不是很满意。但这却是我在完全独立的环境下制作的作品。其中饱含着我的热情和心血。
在这次的制作过程中,既有艰辛,又有欢乐。艰辛是在制作过程中所遇到的层层困难;而欢乐则来自于每次解决困难后的喜悦。
在非典长假之前,我便开始着手准备制作课设了。先是对所作课设的题目进行了深刻的分析,并看了FreeBSD下的SameGame游戏。所以到了非典长假刚开始,我已经对我所要做的课设有了一个大致的构思。
但到了真正要开始做的时候,又有一个个困难出现了,本来我想做VGA16色的模式,后来使用BMP贴图后就觉得颜色明显不够了。查了SVGA的相关资料(全是英文的),后来决定用SVGA256色640*480模式。
从一个难题一个难题的解决,到一个页面一个页面的设计制作,那种过程的确是一种考验,但更是一种享受。在这过程我发现了自己在知识掌握中很多的不足,像上面提到的几点。在众多困难中最为困扰我的是内存的问题,近堆的64K早就不够用了,远堆也渐渐不够了,本来想用EMS的,不过后来因为太麻烦放弃了,最后只好部分太大的和使用频率不大的每次都从文件里调,大大影响了速度。我在这个问题上思考了很长时间,但却始终没有找就更好的解决方案了。我还会继续探索下去,以使这个游戏更为完善。
在设计游戏的过程中,有很多想法是好的,新颖的,但不是因为考虑不周,就是算法不精,要么没有实现,要么就是实现后效果不够理想。现在想起来深感遗憾。今后要熟练掌握C或其他语言的算法精髓。
这是一个独立完成的作业,我也得到了不少同学和朋友的帮助,其间更是因为自己思维的偏差而走了不少弯路,而自己其他各方面知识的困乏更是限制了自己的发挥。也给了我不少中肯的建议,比如我在一开始设计游戏计时的时候用的事中断1ch,不少朋友到和我说这样做很不妥,一开始我没有听,后来在这上面吃了亏,才放弃中断改用while(1)+kbhit()来实现单用户的得多线程,要是早听他们的也不至于走了那么多的弯路。这次的制作过程,我觉得更像是一次生活的体验。使我感受到了很多以前所没有感受到的生活哲理。我热爱计算机这个行业。今后有可能从事软件开发的工作,就算从事喜欢的计算机安全等其他计算机方面的事也离不开良好的编程能力。这需要庞大的知识内涵作为后盾。但不是所以东西都是老师教的。老师教的只是一种学习的方法,更多的知识是靠自己的努力自学而得来的。所以,提高自学能力,丰富实践经验,做到学用结合则是拓宽知识面,提高个人素养所必须的。
以上就是我对完成这次作业的颇多感受。这仅仅是一个开始。在今后的编程学习中,我将不断完善自己。为实现自己的梦想而不懈努力!
部分重要部分的源代码:
/*==============主函数====================*/
/*功能:主函数 */
/*传入参数:无 */
/*返回值:无 */
/*========================================*/
void fnHigh(const int c_nYouMark,const long youtime)
{
time_t t;
int len,write=0;
FILE *fp,*bkp;
int i,j,k;
char puthigh[100];
char ch[2],chs[16]="";
struct tm *gt;
struct high p[12];
ch[1]='\0';
if ((gt=malloc(sizeof(struct tm)))==NULL)
exit(0);
time(&t);
if ((fp=fopen("dat\\high","r"))==NULL)
return;
for (i=0;i<=10;i++)
{
fread(&p[i],sizeof(struct high),1,fp);
}
fclose(fp);
Keyclear;
for (i=10;i>=0;i--)
{
if ((c_nYouMark>p[i].m_nMark&&c_nYouMarkp[i].m_nMark&&c_nYouMark==p[i-1].m_nMark)&&youtime>=p[i-1].m_lGameTime))
{
write=1;
for(j=11;j>i;j--)
{
p[j]=p[j-1];
}
if ((bkp=fopen("img\\input.bmp","rb"))==NULL)
{printf("NO!!!");exit(0);}
fnDisplayBmp(100,100,bkp);
fclose(bkp);
ch[0]=1;
while(ch[0]!=13)
{
while (1)
{
ch[0]=getch();
if (ch[0]!=13&&ch[0]!=8&&(ch[0]<33||ch[0]>126))
{if (ch[0]==0) getch();}
else break;
}
if (8==ch[0]&&chs[0]!='\0')
{
len=strlen(chs);
chs[len-1]='\0';
for (k=len;k<15;k++)
chs[k]=' ';
}
else if (13==ch[0]);
else if (14==strlen(chs));
else strcat(chs,ch);
fdybar(135,280,300,300,0,0);
textoutxy(135,280,chs,255,0);
}
sprintf(p[i].m_strName,chs);
p[i].m_nMark=c_nYouMark;
p[i].m_lGameTime=youtime;
break;
}
else if ((c_nYouMark>p[i].m_nMark&&c_nYouMark==p[i-1].m_nMark)&&youtime {
write=1;
for(j=11;j>i-1;j--)
{
p[j]=p[j-1];
}
if ((bkp=fopen("img\\input.bmp","rb"))==NULL)
{printf("NO!!!");exit(0);}
fnDisplayBmp(100,100,bkp);
fclose(bkp);
ch[0]=1;
while(ch[0]!=13)
{
while (1)
{
ch[0]=getch();
if (ch[0]!=13&&ch[0]!=8&&(ch[0]<33||ch[0]>126))
{if (ch[0]==0) getch();}
else break;
}
if (8==ch[0]&&chs[0]!='\0')
{
len=strlen(chs);
chs[len-1]='\0';
for (k=len;k<15;k++)
chs[k]=' ';
}
else if (13==ch[0]);
else if (14==strlen(chs));
else strcat(chs,ch);
fdybar(135,280,300,300,0,0);
textoutxy(135,280,chs,255,0);
}
sprintf(p[i-1].m_strName,chs);
p[i-1].m_nMark=c_nYouMark;
p[i-1].m_lGameTime=youtime;
break;
}
}
if (1==write)
{
if ((fp=fopen("dat\\high","w"))==NULL)
exit(0);
fwrite(&p[0],sizeof(struct high),1,fp);
for(i=1;i<=10;i++)
{
p[i].m_nNo=i;
fwrite(&p[i],sizeof(struct high),1,fp);
}
fclose(fp);
}
if ((bkp=fopen("img\\bk.bmp","rb"))==NULL)
{printf("NO!!!");exit(0);}
fnGet_Palette(bkp);
fnDisplayBmp(0,0,bkp);
fclose(bkp);
textoutxy(60,100,"NO. NAME MARK GAMETIME ",0,0);
for (i=1;i<=10;i++)
{
gt=gmtime(&p[i].m_lGameTime);
sprintf(puthigh,"%2d %16s %4d %02d:%02d ",p[i].m_nNo,p[i].m_strName,p[i].m_nMark,gt->tm_min,gt->tm_sec);
textoutxy(60,i*20+100,puthigh,0,COPY_PUT);
}
textoutxy(130,380,"键清空高手榜 键退出",66,COPY_PUT);
while(1)
{
k=bioskey(0);
if (k==KEY_F6)
{ if ((bkp=fopen("img\\bk.bmp","rb"))==NULL)
{printf("NO!!!");exit(0);}
fnGet_Palette(bkp);
fnDisplayBmp(0,0,bkp);
fclose(bkp);
textoutxy(130,380,"键清空高手榜 键退出",66,COPY_PUT);
p[11].m_nNo=0;
sprintf(p[11].m_strName,"NONAME");
p[11].m_nMark=0;
p[11].m_lGameTime=0;
if ((fp=fopen("dat\\high","w"))==NULL)
{printf("NO!!!");exit(0);}
p[0].m_nNo=0;
sprintf(p[0].m_strName,"Slayers_fdy");
p[0].m_nMark=30000;
p[0].m_lGameTime=0;
fwrite(&p[0],sizeof(struct high),1,fp);
textoutxy(60,100,"NO. NAME MARK GAMETIME ",0,0);
for(i=1;i<=10;i++)
{
p[i]=p[11];
p[i].m_nNo=i;
gt=gmtime(&p[i].m_lGameTime);
sprintf(puthigh,"%2d %16s %4d %02d:%02d ",p[i].m_nNo,p[i].m_strName,p[i].m_nMark,gt->tm_min,gt->tm_sec);
textoutxy(60,i*20+100,puthigh,0,0);
fwrite(&p[i],sizeof(struct high),1,fp);
}
fclose(fp);
}
if (k==KEY_ESC) {return;}
}
}