300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 勇者走迷宫小游戏2.0版(记一次课程设计经历)

勇者走迷宫小游戏2.0版(记一次课程设计经历)

时间:2023-08-11 15:28:08

相关推荐

勇者走迷宫小游戏2.0版(记一次课程设计经历)

本次游戏的代码借鉴了网上不少的代码,比如光标移动,光标隐藏等

之前的迷宫点这里

之前游戏非常简陋,而《勇者走迷宫》在2.0版本有了很大的改变。

一 玩法

大致还是保留了先拿到钥匙才能走出迷宫的玩法思路,但因为军师的想法,又新加了怪物的机制,增加了可玩性,同时关卡数也从原来的一关变为三关,使游戏内容更加饱满

二 画面

之前的地图主要用键盘上直接能够取得的特殊符号打印,不太美观,这次的迷宫完全使用搜狗输入法的特殊符号打印,看起来更舒服一点;同时之前的颜色变换感觉有点花里胡哨(小帅),现在使用了system(“color B”)的青色,看起来比较简约。这次的三张地图也完全由军师操刀,orz

三 操作

在先前的《勇者走迷宫1.0》中,使用的是循环打印的方式,效率很低,因为每一次走动只需改变人的位置,整个地图基本上不需要变化,所以这次采用了光标定位的方法,每次只将需要变化的坐标改变,这样就不会使地图看起来一闪一闪了

四 在修改中遇到的难题

解决打印问题

要想将游戏变为2.0,最主要的就是将循环打印效率低的问题解决,所以从学长那里了解到了光标定位,后来又从军师那里得到了函数代码,之后这个函数在整个程序中被多次调用。

解决特殊符号问题

这是我主要负责的部分。其间遇到了许多棘手的问题,首先想到如果要用比较特殊的符号的话,必须应该是UTF-8格式所支持的,但是又该从哪里获得这些特殊符号呢?如果使用搜狗输入法的话应该很容易就能找到。

很快的我就找到了■◎★卍等特殊符号,而我在将其放入二维数组中打印后发现,打印出的地图每一行的长度并不一致。后来经过我的一番试验,发现原来这些特殊符号每一个就占了两个字节。所以为了保持长度一致,每一个空格必须也占两格,同时在每一次进行光标移动时,如果是左右方向的移动,那么一次移动也必须让光标移动两格。

在解决了打印问题之后,以为之后的问题也迎刃而解了,但在实际操作时,又遇到了问题。

因为一个特殊字符占了两个字节,哪又应该怎样判断是否碰到墙体呢?

既然无法直接判断特殊符号,那就直接将特殊符号的编码值找出来,所以我将所需要用到的特殊符号的编码值一个个打印了出来。而且我发现除了卍符号之外,其他符号的第一个编码都是-95,这使后续函数的执行也更加方便了

解决怪物随机移动问题

这个环节主要由军师负责,但是我也看了下代码,核心的思路就是使用time头文件的函数,先生成随机数,以此产生怪物的坐标,之后再用随机数来控制怪物的随机移动,同时怪物不能生成在非法区域(其他的特殊符号所在的区域以及迷宫外)。

其间他也遇到了一些难题,比如如何让怪物随时间自动移动。(后来他用了_kbhit()函数解决了)

解决关卡切换问题

这个问题被军师秒了用if语句加system(“CLS”),再将新的界面直接打印就好了~

其他

后面还有一些琐碎的问题,比如如何给程序加入音乐,(虽然网上有很多办法,但这个问题还是花费了我一个下午),还有codeblocks有时会打印出乱码(现在还有时会发生)

五 总结

上次我虽然说会将第一版迷宫做一些优化,但是后来去学DP了,所以这次2.0版本拖了比较久,但同时我也学到了许多我之前从来没有用过的函数,比<windows.h>及<time.h>中的函数。同时这次的游戏也不是最终版,之后也许会加入bgm等(3.0版本),而且在第三关也有一些(很多)BUG

下面我附上游戏源代码:

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<windows.h>#pragma comment(lib,"Winmm.lib")#include<time.h>using namespace std;int cot,flag1,flag2,flag3;//cot是计步器 flag1,2,3指示是否拿到钥匙int x,y,i,p,q,z,book,a3,a4,a5,a6;int a1,a2;char ch;char c[100][100]= {"■■■■■■■■■■","■◎ ■■","■ ■ ■ ■ ★■","■■ ■ ■ 勇者啊,记得拿到钥匙之后才能打开牢房逃离","■ ■■■ ■ ■■ ■表示墙 ◎表示你 ★表示钥匙 卍表示出口","■ ■■ ■ 卍","■ ■ ■ ■","■ ■ ■■■■ ■","■■","■■■■■■■■■■",};char b[200][200]= {"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■","■ ■ ■ ■■■■■■■ ■ ■","■ ■■ ■■■■ ■■ ■ ■■ ■■■■","■ ■■ ■ ■ ■ ■■ ■ ■","■ ■■■■ ◎ ■■■■■■■ ■■","■ ■ ■ ■ ■ ■■■ 卍","■■ ■■ ■ ■■■■■■■■■ ■","■ ■■■■ ■■ ■■■■ ■■ ■","■ ■★ ■■■■■ ■ ■■■ ■ ■","■■ ■■■ ■■ ■■ ■■","■■■■ ■ ■■■■■ ■ ■ ■ ■■■","■ ■■■ ■■ ■ ■■■■■","■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■",};char a[200][300]={"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■","■ ■ ■■■■ ■■■■ ■","■ ■ ■■■■■ ■■■ ■■■ ■ ■ ■■ ■■■■■ ■■■■■■■ ■","■ ■ ■■ ■ ■ ■■■ ■■■■■ ■■ ■■","■ ■■■■■ ■ ■ ■■■■ ■ ■■ ■ ■■■■ ■■■■■ ■■■","■ ■■■■■ ■■ ■■ ■ ■ ■ ■■■■■ ■■ ■■■","■ ■ ■ ■■ ■■■■■■ ■ ■ ■■■■■■ ■■■■■■ ■ ■■■","■ ■■■ ■◎ ■ ■■■ ■ ■■ ■■ ■■■■","■■ ■■■■■ ■■■ ■■■■■■■■■■■■■■■■ ■ ■ ■■■■ 卍","■ ■■■■■ ■■■■ ■ ■■ ■■■■■ ■■ ■■■■■■","■ ■ ★■ ■ ■■■■■■■ ■■■ ■ ■■■■■■■■ ■■■■■■ ■","■■■■ ■ ■■■■ ■ ■■■■■■ ■ ■■■■ ■ ■ ■","■ ■■ ■ ■■ ■■■■■■ ■■■■ ■ ■■■■■■■ ■","■■ ■ ■ ■ ■ ■■■ ■ ■ ■ ■■■■■■■ ■ ■","■■■■■■■■■■■ ■ ■■■■ ■■■■■ ■ ■ ■","■■■ ■■■ ■■■■■■■■■■ ■ ■■ ■■■■■ ■■","■ ■■■ ■ ■ ■■ ■ ■ ■■■■■ ■■ ■ ■ ■","■■■ ■■■■■ ■ ■ ■■■ ■■ ■■■■■","■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■",};void status()//状态函数{void gotoxy(int x,int y);if(c[x][y+1]==-17&&c[x][y]==-95&&z==1){flag1=1;//flag1变为1 拿到钥匙gotoxy(11,5);printf("勇者,恭喜你!得到了遗失在迷宫中的钥匙!");}else if(b[x][y+1]==-17&&b[x][y]==-95&&z==2){flag2=1;//flag1变为1 拿到钥匙gotoxy(14,5);printf("勇者,恭喜你!得到了遗失在迷宫中的钥匙!");}else if(a[x][y+1]==-17&&a[x][y]==-95&&z==3){flag3=1;//flag1变为1 拿到钥匙gotoxy(20,5);printf("勇者,恭喜你!得到了遗失在迷宫中的钥匙!");}}void gotoxy(int x,int y)//辅助函数:光标移动{COORD coord;//光标结构体coord.X=y;//设置坐标coord.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);//同步到控制台/设置控制台光标位置}void HideCursor() //隐藏光标,防止干扰视线{CONSOLE_CURSOR_INFO cursor;cursor.bVisible = FALSE;cursor.dwSize = sizeof(cursor);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(handle, &cursor);}int getpd(char js){if(z==1){if (js=='w'&&((c[x-1][y]!=-95&&c[x-1][y]!=-10)||(c[x-1][y+1]==-17)||(c[x-1][y+1]==-14))){if(c[x-1][y]==-123&&!flag1)//判断走到出口时是否拿到钥匙goto out1;gotoxy(x,y);printf(" ");x--;gotoxy(x,y);printf("◎");cot++;gotoxy(10,10);printf("%d",cot);status();}if (js=='s'&&((c[x+1][y]!=-95&&c[x+1][y]!=-10)||(c[x+1][y+1]==-17)||(c[x+1][y+1]==-14))){if(c[x+1][y]==-123&&!flag1)goto out1;gotoxy(x,y);printf(" ");x++;gotoxy(x,y);printf("◎");cot++;gotoxy(10,10);printf("%d",cot);status();}if (js=='d'&&((c[x][y+2]!=-95&&c[x][y+2]!=-10)||(c[x][y+3]==-17)||(c[x][y+3]==-14))){if(c[x][y+2]==-123&&!flag1)goto out1;gotoxy(x,y);printf(" ");y+=2;gotoxy(x,y);printf("◎");cot++;gotoxy(10,10);printf("%d",cot);status();}if (js=='a'&&((c[x][y-2]!=-95&&c[x][y-2]!=-10)||(c[x][y-1]==-17)||(c[x][y-1]==-14))){if(c[x][y-1]==-123&&!flag1)goto out1;gotoxy(x,y);printf(" ");y-=2;gotoxy(x,y);printf("◎");cot++;gotoxy(10,10);printf("%d",cot);status();}out1:{}}if(z==2){if (js=='w'&&((b[x-1][y]!=-95&&b[x-1][y]!=-10)||(b[x-1][y+1]==-17)||(b[x-1][y+1]==-14))){if(b[x-1][y]==-123&&!flag2)//判断走到出口时是否拿到钥匙goto out2;gotoxy(x,y);printf(" ");x--;gotoxy(x,y);printf("◎");cot++;gotoxy(13,10);printf("%d",cot);status();}if (js=='s'&&((b[x+1][y]!=-95&&b[x+1][y]!=-10)||(b[x+1][y+1]==-17)||(b[x+1][y+1]==-14))){if(b[x+1][y]==-123&&!flag2)goto out2;gotoxy(x,y);printf(" ");x++;gotoxy(x,y);printf("◎");cot++;gotoxy(13,10);printf("%d",cot);status();}if (js=='d'&&((b[x][y+2]!=-95&&b[x][y+2]!=-10)||(b[x][y+3]==-17)||(b[x][y+3]==-14))){if(b[x][y+2]==-123&&!flag2)goto out2;gotoxy(x,y);printf(" ");y+=2;gotoxy(x,y);printf("◎");cot++;gotoxy(13,10);printf("%d",cot);status();}if (js=='a'&&((b[x][y-2]!=-95&&b[x][y-2]!=-10)||(b[x][y-1]==-17)||(b[x][y-1]==-14))){if(b[x][y-1]==-123&&!flag2)goto out2;gotoxy(x,y);printf(" ");y-=2;gotoxy(x,y);printf("◎");cot++;gotoxy(13,10);printf("%d",cot);status();}out2:{}}if(z==3){if (js=='w'&&((a[x-1][y]!=-95&&a[x-1][y]!=-10)||(a[x-1][y+1]==-17)||(a[x-1][y+1]==-14))){if(a[x-1][y]==-123&&!flag3)//判断走到出口时是否拿到钥匙goto out3 ;gotoxy(x,y);printf(" ");x--;gotoxy(x,y);printf("◎");cot++;gotoxy(19,10);printf("%d",cot);status();}if (js=='s'&&((a[x+1][y]!=-95&&a[x+1][y]!=-10)||(a[x+1][y+1]==-17)||(a[x+1][y+1]==-14))){if(a[x+1][y]==-123&&!flag3)goto out3;gotoxy(x,y);printf(" ");x++;gotoxy(x,y);printf("◎");cot++;gotoxy(19,10);printf("%d",cot);status();}if (js=='d'&&((a[x][y+2]!=-95&&a[x][y+2]!=-10)||(a[x][y+3]==-17)||(a[x][y+3]==-14))){if(a[x][y+2]==-123&&!flag3)goto out3;gotoxy(x,y);printf(" ");y+=2;gotoxy(x,y);printf("◎");cot++;gotoxy(19,10);printf("%d",cot);status();}if (js=='a'&&((a[x][y-2]!=-95&&a[x][y-2]!=-10)||(a[x][y-1]==-17)||(a[x][y-1]==-14))){if(a[x][y-1]==-123&&!flag3)goto out3;gotoxy(x,y);printf(" ");y-=2;gotoxy(x,y);printf("◎");cot++;gotoxy(19,10);printf("%d",cot);status();}out3:{}}}void time(int t,int r)//怪物随机移动函数{clock_t s,f;int a1;s=clock();f=clock();srand(time(0));if (z==2){while(1){HideCursor();if(b[x][y]==-123&&flag2)//如果走到出口,跳出break;if(!_kbhit()){f=clock();if (f-s>=200){a1=rand()%100+1;if (a1>=1&&a1<=25&&b[t][r+2]!=-95&&b[t][r+2]!=-123)//向四个方向随机移动且不能走到非法区域{gotoxy(t,r);printf(" ");r+=2;gotoxy(t,r);printf("◆");}if (a1>=26&&a1<=50&&b[t][r-2]!=-95&&b[t][r-2]!=-123){gotoxy(t,r);printf(" ");r-=2;gotoxy(t,r);printf("◆");}if (a1>=51&&a1<=75&&b[t+1][r]!=-95&&b[t+1][r]!=-123){gotoxy(t,r);printf(" ");t++;gotoxy(t,r);printf("◆");}if (a1>=76&&a1<=100&&b[t-1][r]!=-95&&b[t-1][r]!=-123){gotoxy(t,r);printf(" ");t--;gotoxy(t,r);printf("◆");}if(t==x&&y==r)//如果被怪抓住,将钥匙和起始点重新打印{gotoxy(t,r);printf(" ");gotoxy(4,14);printf("◎");gotoxy(8,8);printf("★");flag2=0;//钥匙掉落book=1;break;}s+=200;}}else{HideCursor();ch=getch();getpd(ch);status();}}}else if (z==3){while(1){HideCursor();if(a[x][y]==-123&&flag3)break;if (!_kbhit()){f=clock();if (f-s>=200){a1=rand()%100+1;int js1=rand()%100+1,js2=rand()%100+1;//三个怪的随机移动if (a1>=1&&a1<=25&&a[t][r+2]!=-95&&a[t][r+2]!=-123){gotoxy(t,r);printf(" ");r+=2;gotoxy(t,r);printf("◆");}if (a1>=26&&a1<=50&&a[t][r-2]!=-95&&a[t][r-2]!=-123){gotoxy(t,r);printf(" ");r-=2;gotoxy(t,r);printf("◆");}if (a1>=51&&a1<=75&&a[t+1][r]!=-95&&a[t+1][r]!=-123){gotoxy(t,r);printf(" ");t++;gotoxy(t,r);printf("◆");}if (a1>=76&&a1<=105&&a[t-1][r]!=-95&&a[t-1][r]!=-123){gotoxy(t,r);printf(" ");t--;gotoxy(t,r);printf("◆");}if (js1>=1&&js1<=25&&a[a3][a4+2]!=-95&&a[a3][a4+2]!=-123){gotoxy(a3,a4);printf(" ");a4+=2;gotoxy(a3,a4);printf("◆");}if (js1>=26&&js1<=50&&a[a3][a4-2]!=-95&&a[a3][a4-2]!=-123){gotoxy(a3,a4);printf(" ");a4-=2;gotoxy(a3,a4);printf("◆");}if (js1>=51&&js1<=75&&a[a3+1][a4]!=-95&&a[a3+1][a4]!=-123){gotoxy(a3,a4);printf(" ");a3++;gotoxy(a3,a4);printf("◆");}if (js1>=76&&js1<=105&&a[a3-1][a4]!=-95&&a[a3-1][a4]!=-123){gotoxy(a3,a4);printf(" ");a3--;gotoxy(a3,a4);printf("◆");}if (js2>=1&&js2<=25&&a[a5][a6+2]!=-95&&a[a5][a6+2]!=-123){gotoxy(a5,a6);printf(" ");a6+=2;gotoxy(a5,a6);printf("◆");}if (js2>=26&&js2<=50&&a[a5][a6-2]!=-95&&a[a5][a6-2]!=-123){gotoxy(a5,a6);printf(" ");a6-=2;gotoxy(a5,a6);printf("◆");}if (js2>=51&&js2<=75&&a[a5+1][a6]!=-95&&a[a5+1][a6]!=-123){gotoxy(a5,a6);printf(" ");a5++;gotoxy(a5,a6);printf("◆");}if (js2>=76&&js2<=105&&a[a5-1][a6]!=-95&&a[a5-1][a6]!=-123){gotoxy(a5,a6);printf(" ");a5--;gotoxy(a5,a6);printf("◆");}if((t==x&&y==r)||(x==a3&&y==a4)||(x==a5&&y==a6)){gotoxy(t,r);printf(" ");gotoxy(a3,a4);printf(" ");gotoxy(a5,a6);printf(" ");gotoxy(7,32);printf("◎");gotoxy(10,10);printf("★");book=1;flag3=0;//钥匙掉落break;}s+=200;}}else{HideCursor();ch=getch();getpd(ch);status();}}}}int main(){HideCursor();printf(" 亲爱的勇者,你总算醒了。 (按下enter键继续)");system("color B");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf(" 什么,你问现在什么个情况?");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf("你忘了么,你被怪物偷袭了,这之后他们把昏迷的你带到了这座迷宫并关了起来");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf("好在有我跟了进来并找到了牢房钥匙的位置,所以趁现在快离开这里吧");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf("但可惜的是你的武器被他们带走了,因此你只能想办法避开怪物,不被它们发现");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf(" 你问我是谁?这并不重要,你就把我当作一个乐于助人但未交课程设计作业的大学生吧");while(1){char ss;ss=getchar();if (ss=='\n')break;}printf(" 好了,话不多说,快开始吧");while(1){char ss;ss=getchar();if (ss=='\n')break;}system("CLS");//清屏for (z=1; z<=3; z++){if (z==1){// mciSendString("open bgm1.mp3 alias bgm1", NULL, 0, NULL);//打开音乐// mciSendString("play bgm1 repeat", NULL, 0, NULL);//循环播放x=1,y=1,p=5,q=9;for(i=0; i<10; i++){printf("%s",c[i]);printf("\n");}printf("当前步数: %d\n状态: \n",cot);system("color B");x=1,y=2;while(c[x][y]!=-123||!flag1)//只有在到达出口的坐标并且有钥匙的情况下退出循环{HideCursor();ch=getch();getpd(ch);}system("CLS");//清屏printf(" 恭喜你!勇者,你成功逃出了第一层迷宫\n");printf(" 请按下enter键以前往下一层\n");printf("(注意!下一层开始会出现你无法击败的强大怪物,请注意躲避)");while(1){char ss;ss=getchar();if (ss=='\n')break;}system("CLS");//清屏}if (z==2){cot=0;srand(time(0));x=4,y=14,p=5,q=57,book=0;for (i=0; i<=12; i++){printf("%s",b[i]);printf("\n");}printf("当前步数: %d\n状态: \n",cot);system("color B");while (1){a1=rand()%10+3;a2=rand()%47+3;if(!(a2%2))//一定要让光标列数在偶数位{if (b[a1][a2]!=-95)//在可走的道路上随机生成形状为“◆”的怪物{gotoxy(a1,a2);printf("◆");time(a1,a2);break;}}}if (book==1){system("CLS");//清屏z=1;printf(" 很遗憾,勇者,你被怪物抓住了\n");printf(" (请按下enter键重新挑战)\n");}else{system("CLS");//清屏printf("真不愧是天选之子,恭喜你!勇者,你可以前往最终试炼了\n");printf(" (请按下enter键以前往下一层)\n");}while(1){char ss;ss=getchar();if (ss=='\n')break;}system("CLS");//清屏}if (z==3){cot=0;x=7,y=32,p=8,q=118,book=0;for(i=0; i<=18; i++){printf("%s",a[i]);if(i!=18)printf("\n");}printf("当前步数: %d\n状态: \n",cot);while (1){a1=rand()%17+1;a2=rand()%117+1;a3=rand()%17+1;a4=rand()%117+1;a5=rand()%17+1;a6=rand()%117+1;if(!(a2%2)&&!(a4%2)&&!(a6%2)){if (a[a1][a2]!=-95&&a[a3][a4]!=-95&&a[a5][a6]!=-95){gotoxy(a1,a2);printf("◆");gotoxy(a3,a4);printf("◆");gotoxy(a5,a6);printf("◆");time(a1,a2);break;}}}if (book==1){system("CLS");//清屏z=2;printf(" 很遗憾,勇者,你被怪物抓住了\n");printf(" (请按下enter键重新挑战)\n");while(1){char ss;ss=getchar();if (ss=='\n')break;}system("CLS");//清屏}else{system("CLS");//清屏printf("太强了,恭喜你!勇者,你成功逃出了迷宫\n");printf("当然我也没有闲着,我替你找回了你的武器:\n");system("color 2");printf(" * \n");printf(" *** \n");printf(" *** \n");printf(" *** \n");printf(" *** 圣遗物:湖女剑\n");printf(" *** \n");printf("*******\n");printf(" *** \n");printf(" *** \n");system("color 6");printf("那么,请你在以后继续用它惩奸除恶,做最强的勇者吧");Sleep(10000);}}}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。