游戏——贪吃蛇

来源:互联网 发布:手机淘宝2015旧版本5.6 编辑:程序博客网 时间:2024/06/06 04:12

介绍

这个贪吃蛇写了好几天,终于打完了!下面介绍具体玩法,你们看一下吧,希望喜欢!

  1. 运行了编译出的可执行文件后会出现如下界面,这时输入两个数,中间空格隔开(你要换行也行),输完按回车:
  2. 之后游戏便开始了,出现如下界面,图中可看出几个基本操作,“|”符号左边是字母键盘区操作的规则,右边则是数字键盘区操作规则,个人推荐用数字键盘区(就是标准键盘右边那一坨),你们可能注意到“加速”和“减速”两个操作各有两个按键,左边的(q,e,4,6)代表粗调,速度改变得快一些,右边的(j,k,7,9)代表微调,速度改变得慢一些:
    这里写图片描述
  3. 游戏设置有“奖励蛋”,可能你们也看到下面有一行提示字,默认是每九个“普通蛋”之后就有一个“奖励蛋”,“奖励蛋”的体现是一个闪来闪去的五角星,它的分数根据你当前的速度而定,而且他的分还会随着时间的流逝而变少,不过应该不会低于“普通蛋”的默认分——10分。
    这里写图片描述
  4. 在游戏中,你可以按“8”(若是字母键盘区,则可以按“h”键)来开启作弊模式,此模式中,你可以作弊(废话),当你要撞上障碍物(包括你的身体和后面要讲的地图障碍物)是,蛇会停下来,等着你下一步的指令继续走(当然不能再往有障碍物的路走)。
    这里写图片描述
  5. 你们应该注意到,右边的说明中有一项“地图”,按了那个键就会进入地图编辑界面,不过游戏只是暂停,之后根据提示,你可以在上面放置或删除“地图障碍物”,增添游戏乐趣。
    这里写图片描述
    当然你可以做成这样
    这里写图片描述
  6. 最后,如果你诚实地没作弊,却咬到了自己,那么这一局就结束了,出现如下界面,过一会之后就回到了界面“1”。
    这里写图片描述

实现

  • 为了让屏幕不那么卡,我依旧是运用了只改动被改过的像素点的方法。
  • 我用了个二维数组把整个地图记录下来,再有一个二维数组记下当前这个点的方向(可以想象成一个链表一样的东西,这个点的dir[]值就代表蛇在这个地方的方向,要是这里没有蛇的身体那么当然就是空了,这样就把整条蛇给记录下来了)
  • 而且这样的好处是,只要你记下蛇头蛇尾的坐标,每过一个单位,你只需修改蛇头和蛇尾这两个像素点,而且可以由 dir[] 很快地知道应该怎么修改。
  • 其它具体操作也很简单了,就是细节比较繁琐,希望大家玩的开心~

附上源代码

#include <cstdio>#include <iostream>#include <ctime>#include <conio.h>#include <windows.h>       //停顿:Sleep(); #include <cstdlib>         //清屏:system("cls");#include <cstring>         //1:'◎' 2:'⊙' 3:'▲' 4:'◆' 5:'■'using namespace std;int a[100][100],dir[100][100];//string guo[5]={'▲','◆','■','▼','★'};int fx[4][2]={{0,-1},{1,0},{0,1},{-1,0}}; //ap来记录奖励块的分   int n,m,ff,f=1,t=55,T=55,ap=10,egg[2],danshu,headx,heady,endx,endy,point=0,apple=0,fangx,stopp=0,panduan=0;  //ff用来判断  panduan 0:中途退出;1:咬到自己;2:重置  int lastfx;int zuobi=0;int fff[110][110];string print[4][4]={{"═","╔"," ","╚"},{"╝","║","╚"," "},{" ","╗","═","╝"},{"╗"," ","╔","║"}};void color(int a)//颜色函数{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);}void gotoxy(int x,int y)//位置函数(行为x 列为y){COORD pos;pos.X=2*y;pos.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}void reset(){    system("cls");    color(7); printf("                   ★"); color(10); printf("贪吃蛇"); color(11); printf("★\n\n"); color(7);    printf("⊙打印若有错位请调整窗口大小或按r重输小点的数⊙\n\n  请输入场地大小(格式:行数 列数) 推荐(20 20) \n\n>>");    scanf("%d%d",&n,&m);    system("cls");    color(14);    for (int i=1; i<=m; i++){gotoxy(0,i);printf("※");gotoxy(n+1,i);printf("※");}    for (int i=1; i<=n; i++){gotoxy(i,0);printf("※");gotoxy(i,m+1);printf("※");}    color(10);    memset(fff,0,sizeof(fff));    gotoxy(0,0); printf("┍");    gotoxy(n+1,0); printf("┕");    gotoxy(0,m+1); printf("┑");    gotoxy(n+1,m+1); printf("┙");    color(7);    gotoxy(0,m+5); printf("方向:a/s/d/w | 1/2/3/5");    gotoxy(1,m+5); printf("暂停:p       |       0");    gotoxy(2,m+5); printf("减速:q/j     |     4/7");    gotoxy(3,m+5); printf("加速:e/k     |     6/9");     gotoxy(4,m+5); printf("重置:r       |       .");    gotoxy(5,m+5); printf("地图:g       |       +");    headx=endx=endy=1; heady=3;    f=1; ff=3;    memset(a,1,sizeof(a));    memset(dir,0,sizeof(dir));    a[1][1]=a[1][2]=a[1][3]=0;    gotoxy(1,1); printf("⊙");    gotoxy(1,2); printf("⊙");    gotoxy(1,3); printf("◎");    dir[1][1]=dir[1][2]=dir[1][3]=2;    apple=0; fangx=2; point=0; danshu=0; lastfx=2; stopp=0;    if (zuobi) {color(12); gotoxy(12,m+5); printf("作弊可耻!"); gotoxy(n+4,0); printf("做了弊还没路走那就救不了你了,乖乖重来吧......"); color(7);} }void haha(){    char ch=getch();    if ((ch=='a' | ch=='1') && dir[headx][heady]!=2){fangx=0; return;}    if ((ch=='s' | ch=='2') && dir[headx][heady]!=3){fangx=1; return;}     if ((ch=='d' | ch=='3') && dir[headx][heady]!=0){fangx=2; return;}    if ((ch=='w' | ch=='5') && dir[headx][heady]!=1){fangx=3; return;}    if (ch=='p' | ch=='0'){stopp=(stopp+1)%2; return;}    if (ch=='q' | ch=='4'){T+=10; if (T>=1005) T=1005; return;}    if (ch=='e' | ch=='6'){T-=10; if (T<=1) T=2; return;}     if (ch=='j' | ch=='7'){T+=1; if (T>=1005) T=1005; return;}    if (ch=='k' | ch=='9'){T-=1; if (T<=1) T=2; return;}    if (ch=='r' | ch=='.'){ff=2; f=0; panduan=0; return;}    if (ch=='h' | ch=='8'){        zuobi+=1; zuobi%=2;        if (zuobi) {color(12); gotoxy(12,m+5); printf("作弊可耻!"); gotoxy(n+4,0); printf("做了弊还没路走那就救不了你了,乖乖重来吧......"); color(7);}         else {printf("                "); gotoxy(m+4,0); printf("                                                   ");}    }    if (ch=='g' |ch=='+'){        gotoxy(n+50,0);        printf("现在切换到地图编辑模式\n\nq/4 为开始放置模式(光标移动过的痕迹会留下障碍物)\n\ne/6 为取消放置障碍物模式\n\nj/0 为橡皮模式(再按一次退出橡皮模式)\n\n按 h/+ 继续游戏\n\n");         printf("\n按任意键开始编辑地图");         color(13);         int x=1,y=1, dfx, moshi=0;        ch=getch(); gotoxy(0,0); gotoxy(1,1);        while (ch!='h' && ch!='+'){            if (ch=='a' | ch=='1') dfx=0;            else if (ch=='s' | ch=='2') dfx=1;            else if (ch=='d' | ch=='3') dfx=2;            else if (ch=='w' | ch=='5') dfx=3;            else dfx=5;            if (ch=='q' | ch=='4') moshi=1;            if (ch=='e' | ch=='6') moshi=0;            if (ch=='j' | ch=='0') if (moshi-2) moshi=2; else moshi=0;            if (dfx<=4){                if (x+fx[dfx][0]>0 && x+fx[dfx][0]<=n && y+fx[dfx][1]>0 && y+fx[dfx][1]<=m){x+=fx[dfx][0]; y+=fx[dfx][1];}                if (x>0 && x<=n && y>0 && y<=m){                    gotoxy(x,y);                    if (moshi==1 && a[x][y] && !fff[x][y]){a[x][y]=0; fff[x][y]=1; printf("□");}                    if (moshi==2 && fff[x][y]){a[x][y]=1; fff[x][y]=0; printf("  ");}                     gotoxy(x,y);                }            }            ch=getch();        }        color(7);    }}   void findegg(){    srand(time(NULL));    int aa=1;    while (!a[egg[0]][egg[1]]){egg[0]=(rand()%(n))+1; egg[1]=(rand()%m)+1;}    a[egg[0]][egg[1]]=0;    point+=ap;    gotoxy(egg[0],egg[1]); if (!apple){printf("★"); ap=8000/T; if (ap>=200) ap=200;}else {printf("●"); ap=10;}    apple++; apple=apple%10;      gotoxy(n+2,0); printf("距离下一个奖励蛋还有 "); color(11); cout <<9-(8+apple)%10; color(7); printf(" 个");     danshu++;    return;}int gg(){    if (ff==0) return(0);    if (ff==1) {gotoxy(n+2,1); Sleep(3000); gotoxy(n+26,1); gotoxy(n+10,0); printf("哦豁~ 你咬到自己了o( ̄▽ ̄)d\n\n\n你共吃蛋 %d 个\n\n\n你共得分 %d 分,恭喜!\n\n\n等一下就继续",danshu,point); while (kbhit()) char ch=getch(); Sleep(5000); if (kbhit) return(1);}    if (ff==2) return(1);}void dong(){    gotoxy(11,m+3); printf("当前的蛋有 %d 分            ",ap);    if (ap-3>10) ap-=3;    if (ap!=10){            gotoxy(egg[0],egg[1]);            color(ap%10);            printf("★");            color(7);    }    int x,y;    x=(headx+fx[fangx][0]-1+n)%(n)+1; y=(heady+fx[fangx][1]-1+m)%(m)+1;    dir[headx][heady]=fangx;     if(x==egg[0] && y==egg[1]){        gotoxy(headx,heady); cout <<print[lastfx][fangx];         dir[headx][heady]=fangx;        headx=x; heady=y; a[x][y]=0;        gotoxy(headx,heady); printf("◎");        findegg();    }    else if (a[x][y]){        gotoxy(headx,heady); cout <<print[lastfx][fangx];         headx=x; heady=y; a[x][y]=0;        gotoxy(headx,heady); printf("◎");        gotoxy(endx,endy); printf("  "); a[endx][endy]=1;         x=endx; y=endy;         endx+=fx[dir[x][y]][0]; endx=(endx-1+n)%(n)+1;        endy+=fx[dir[x][y]][1]; endy=(endy-1+m)%(m)+1;        dir[x][y]=-1;    }    else if(!zuobi){f=0; ff=1;}    dir[headx][heady]=fangx;    lastfx=fangx;    return;}int main(){    while (1){        srand(time(NULL));        reset();        egg[0]=(rand()%n-1)+2; egg[1]=(rand()%m)+1;         a[egg[0]][egg[1]]=0;        gotoxy(egg[0],egg[1]); if (apple){printf("★"); ap=100;}else printf("●");        while (f){            if (kbhit()) haha();            gotoxy(9,m+5); printf("吃蛋:%d 个",danshu);            gotoxy(8,m+5); printf("速度: %d   ",1005-T);            //while (stopp) {Sleep(10); if (kbhit()) haha();}            Sleep(1); t=(t-1+T)%T;              if (t==0 && !stopp) dong();            gotoxy(7,m+5); printf("得分:%d 分",point);            gotoxy(12,m+5);        }        if (!gg()) return 0;    }    return 0;}

几点说明

  • 源代码以及编译出的可执行文件的下载页面
    http://download.csdn.net/detail/jackypigpig/9725997
  • 我发现电脑们的配置不同,蛇初始的速度也会不同,所以要是你们发现每次打开游戏蛇的速度都不合心意的话,可以在原程序里调,第12行(是一行定义),找到“t”和“T”,T 的值代表T毫秒蛇走一步,而 t 只是相当于一个累加时间的变量,改不改都行,不过最好改成和T一样。
  • 注意每次咬到自己之后会重新输入屏幕大小,注意把之前输入的字符删掉,免得出现过大的错误。
  • 压缩包里面还有个文件“贪吃蛇_大屏版”,是没有说明的,不过操作是一样的,目的在于提供更大的空间让蛇蛇蠕动!(大屏版大小可调至更大,只要你将窗口调大就行了)
  • 要是有什么建议,欢迎提出!
2 0
原创粉丝点击