貪喫蛇_lbz888

使用方法

複製代碼
存爲 .txt 文件
改爲 .cpp 文件
運行(編程界面有可能亂碼,但沒關係,沒改動之前,第一次運行會是正確的)
(第二次運行有可能亂碼)
T_T
別問我爲什麼
我也不知道

1.代碼1

(有點小bug)

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
void GoToXY(int x,int y)
{
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
#define MAXN 10

int level,speed;

int xxx=3;
int yyy=(81-MAXN*2)/2;
int map[100][100];//24*24
void GoToXY(int x, int y);
int x=MAXN/2,y=MAXN/2;
int lastx=x,lasty=y;
char input,lastinput;
int que[100000][2],l=1,r=0;
int if_bomb=0;
int if_eaten=0,foodx,foody;
int big_food=0,fff;
int ans=0;
void first_output()
{
    puts("                                     SNAKE                                     ");
    printf("\n                                    MADE BY\n\n");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■□■■■■□■■■□□□■■■■□□");
    puts("                  ■■■□■■■■□■□□■□□□□■■□□");
    puts("                  ■■■□■■■■□■■■□□□□■■□□□");
    puts("                  ■■■□■■■■□■□□■□□■■□□□□");
    puts("                  ■■■□□□□■□■■■□□□■■■■□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    Sleep(2000);
    system("cls");
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    printf("輸入地圖邊長:(推薦:10~20)\n");
    scanf("%d",&level);
    if(level>21)
    {
        level=21;
        printf("邊長過大,自動調整爲 21\n");
    }
    if(level<5)
    {
        level=5;
        printf("邊長過小,自動調整爲 5\n");
    }
    printf("\n輸入初始速度:(推薦:100~200)(單位:ms/格)(數值越小越快)(會隨蛇身長變長而減小)\n");
    scanf("%d",&speed);
    if(speed>300)
    {
        speed=300;
        printf("數值過小,自動調整爲 300 ms/格\n");
    }
    if(speed<10)
    {
        speed=10;
        printf("數值過小,自動調整爲 10 ms/格\n");
    }
    Sleep(1000);
    system("cls");
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    printf("\n");
    yyy=(81-level*2)/2;
    x=level/2,y=level/2;
    lastx=x,lasty=y;
    que[++r][0]=x;
    que[r][1]=y+1;
    map[x][y+1]=1;
    que[++r][0]=x;
    que[r][1]=y;
    map[x][y]=1;
    lastinput=75;
    input=75;
    for(int i=0;i<level;i++)
    {
        for(int j=1;j<=yyy;j++)printf(" ");
        for(int j=0;j<level;j++)
        {
            if(x==i&&y==j)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("<<");
            }
            else if(map[i][j]==1)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("■");
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("□");
            }
        }
        printf("\n");
    }
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
void read()
{
    int tempinput=input;
    while(kbhit())
    {
        input=-32;
        while(input==-32)
        {
            input=_getch();
        }
    }
    if(!(input==72||input=='w'||input=='W'||input==80||input=='s'||input=='S'||input==75||input=='a'||input=='A'||input==77||

input=='d'||input=='D'))
    {
        input=tempinput;
        return ;
    }
    if(input=='w'||input=='W')input=72;
    if(input=='s'||input=='S')input=80;
    if(input=='a'||input=='A')input=75;
    if(input=='d'||input=='D')input=77;
    if((lastinput==72&&input==80)||(lastinput==80&&input==72)||(lastinput==75&&input==77)||(lastinput==77&&input==75))
    {
        input=tempinput;
        return ;
    }
    lastinput=input;
}
void change()
{
    int if_moved=0;
    GoToXY(78,0);
    if(input==72||input=='w'||input=='W') // 上 
    {
        x--;
        x=(x+level)%level;
        printf("↑");
        if_moved=1;
    }
    if(input==80||input=='s'||input=='S') // 下 
    {
        x++;
        x=x%level;
        printf("↓");
        if_moved=1;
    }
    if(input==75||input=='a'||input=='A') // 左 
    {
        y--;
        y=(y+level)%level;
        printf("←");
        if_moved=1;
    }
    if(input==77||input=='d'||input=='D') // 右 
    {
        y++;
        y=y%level;
        printf("→");
        if_moved=1;
    }
    if(if_moved==1)
    {
        que[++r][0]=x;
        que[r][1]=y;
        //map[x][y]=1;
        if(map[foodx][foody]!=2)
        {
            if_eaten=1;
            ans+=10000/speed;
            if(fff==8) ans+=20000/speed;
        }
        else
        {
            map[que[l][0]][que[l][1]]=0;
            GoToXY(que[l][1]*2+yyy,que[l][0]+xxx);
            printf("□");
            l++;
        }
    }
    if(map[x][y]==1&&if_moved==1)
    {
        if_bomb=1;
    }
    map[x][y]=1;
}
void make_food()
{
    fff=rand()%10;
    if(fff==8)
    {
        big_food++; 
    }
    foodx=rand()%level;
    foody=rand()%level;
    while(map[foodx][foody]!=0)
    {
        foodx=rand()%level;
        foody=rand()%level;
    }
    map[foodx][foody]=2;
    GoToXY(foody*2+yyy,foodx+xxx);
    if(fff==8)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
        FOREGROUND_RED);
        printf("★");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    else
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
        FOREGROUND_RED|FOREGROUND_INTENSITY);
        printf("●");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    if_eaten=0;
}
void output()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

    GoToXY(lasty*2+yyy,lastx+xxx);
    printf("■");
    GoToXY(y*2+yyy,x+xxx);
    if(input==72||input=='w'||input=='W')
    {
        printf("△");
    }
    else if(input==80||input=='s'||input=='S')
    {
        printf("▽");
    }
    else if(input==75||input=='a'||input=='A')
    {
        printf("<<");
    }
    else if(input==77||input=='d'||input=='D')
    {
        printf(">>");
    }
    map[x][y]=1;
    lastx=x;
    lasty=y;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
double timmm;
void game_over()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    GoToXY(0,level/2+xxx-3);
    printf("    GAME OVER\n");
    printf("    速度:%d\n",speed);
    printf("    長度:%d\n",r-l);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_GREEN);
    printf("    成績:%d\n",ans);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    printf("    時間:%.2lf s\n",(double)clock()/CLOCKS_PER_SEC-timmm);
    GoToXY(5,1);
    printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
    Sleep(2000);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
int main()
{
    srand(time(NULL));
    first_output();
    make_food();
    int last_long=3;
    int mm=0;
    timmm=(double)clock()/CLOCKS_PER_SEC;
    while(1)
    {
        mm++;
        if(r-l==last_long+3)
        {
            if(speed>5)
            {
                speed-=5;
            }
            last_long=r-l;
        }
        GoToXY(5,1);
        printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
        Sleep(speed);
        read();
        change();
        map[x][y]=1;
        if(if_eaten||mm>(level*3)/2+1)
        {
            map[foodx][foody]=0;
            GoToXY(foody*2+yyy,foodx+xxx);
            printf("□");
            make_food();
            mm=0;
        }
        output();
        if(if_bomb==1)
        {
            GoToXY(0,level+xxx);
            game_over();
            break;
        }
    }
    GoToXY(0,level+xxx);
    system("pause");
    return 0;
}
/*
特殊字符:
□■→↓←↑  ◇▽ ○◎ ●
┗━│△▽ < > ???????????▲▼●◆★????☆◇○▽

Sleep(10);
puts("□□□");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_INTENSITY);

*/

2.加邊框版:

(改了一個bug,加了邊框)

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
void GoToXY(int x,int y)
{
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
#define MAXN 10

int level,speed;

int xxx=3;
int yyy=(81-MAXN*2)/2;
int map[100][100];//24*24
void GoToXY(int x, int y);
int x=MAXN/2,y=MAXN/2;
int lastx=x,lasty=y;
char input,lastinput;
int que[100000][2],l=1,r=0;
int if_bomb=0;
int if_eaten=0,foodx,foody;
int big_food=0,fff;
int ans=0;
void first_output()
{
    puts("                                     SNAKE                                     ");
    printf("\n                                    MADE BY\n\n");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■□■■■■□■■■□□□■■■■□□");
    puts("                  ■■■□■■■■□■□□■□□□□■■□□");
    puts("                  ■■■□■■■■□■■■□□□□■■□□□");
    puts("                  ■■■□■■■■□■□□■□□■■□□□□");
    puts("                  ■■■□□□□■□■■■□□□■■■■□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    Sleep(2000);
    system("cls");
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    printf("輸入地圖邊長:(推薦:10~20)\n");
    scanf("%d",&level);
    if(level>20)
    {
        level=20;
        printf("邊長過大,自動調整爲 20\n");
    }
    if(level<5)
    {
        level=5;
        printf("邊長過小,自動調整爲 5\n");
    }
    printf("\n輸入初始速度:(推薦:100~200)(單位:ms/格)(數值越小越快)(會隨蛇身長變長而減小)\n");
    scanf("%d",&speed);
    if(speed>1000)
    {
        speed=1000;
        printf("數值過小,自動調整爲 1000 ms/格\n");
    }
    if(speed<10)
    {
        speed=10;
        printf("數值過小,自動調整爲 10 ms/格\n");
    }
    Sleep(1000);
    system("cls");
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    printf("\n");
    yyy=(81-level*2)/2;
    x=level/2,y=level/2;
    lastx=x,lasty=y;
    que[++r][0]=x;
    que[r][1]=y+1;
    map[x][y+1]=1;
    que[++r][0]=x;
    que[r][1]=y;
    map[x][y]=1;
    lastinput=75;
    input=75;
    GoToXY(0,xxx-1);
    for(int j=1;j<=yyy-2;j++)printf(" ");
    printf("┏");
    for(int i=0;i<level;i++) printf("━");
    printf("┓");
    printf("\n");
    for(int i=0;i<level;i++)
    {
        for(int j=1;j<=yyy-2;j++)printf(" ");
        printf("┃");
        for(int j=0;j<level;j++)
        {
            if(x==i&&y==j)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("<<");
            }
            else if(map[i][j]==1)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("■");
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("□");
            }
        }
        printf("┃");
        printf("\n");
    }
    for(int j=1;j<=yyy-2;j++)printf(" ");
    printf("┗");
    for(int i=0;i<level;i++) printf("━");
    printf("┛");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
void read()
{
    int tempinput=input;
    while(kbhit())
    {
        input=-32;
        while(input==-32)
        {
            input=_getch();
        }
    }
    if(!(input==72||input=='w'||input=='W'||input==80||input=='s'||input=='S'||input==75||input=='a'||input=='A'||input==77||

input=='d'||input=='D'))
    {
        input=tempinput;
        return ;
    }
    if(input=='w'||input=='W')input=72;
    if(input=='s'||input=='S')input=80;
    if(input=='a'||input=='A')input=75;
    if(input=='d'||input=='D')input=77;
    if((lastinput==72&&input==80)||(lastinput==80&&input==72)||(lastinput==75&&input==77)||(lastinput==77&&input==75))
    {
        input=tempinput;
        return ;
    }
    lastinput=input;
}
void change()
{
    int if_moved=0;
    GoToXY(78,0);
    if(input==72||input=='w'||input=='W') // 上 
    {
        x--;
        x=(x+level)%level;
        printf("↑");
        if_moved=1;
    }
    if(input==80||input=='s'||input=='S') // 下 
    {
        x++;
        x=x%level;
        printf("↓");
        if_moved=1;
    }
    if(input==75||input=='a'||input=='A') // 左 
    {
        y--;
        y=(y+level)%level;
        printf("←");
        if_moved=1;
    }
    if(input==77||input=='d'||input=='D') // 右 
    {
        y++;
        y=y%level;
        printf("→");
        if_moved=1;
    }
    int lasst=map[x][y];
    if(if_moved==1)
    {
        que[++r][0]=x;
        que[r][1]=y;
        map[x][y]=1;
        if(map[foodx][foody]!=2)
        {
            if_eaten=1;
            ans+=10000/speed;
            if(fff==8) ans+=20000/speed;
        }
        else
        {
            map[que[l][0]][que[l][1]]=0;
            GoToXY(que[l][1]*2+yyy,que[l][0]+xxx);
            printf("□");
            l++;
        }
    }
    if(lasst==1&&if_moved==1&&(x!=que[l-1][0]||y!=que[l-1][1]))
    {
        if_bomb=1;
    }
    map[x][y]=1;
}
void make_food()
{
    fff=rand()%10;
    if(fff==8)
    {
        big_food++; 
    }
    foodx=rand()%level;
    foody=rand()%level;
    while(map[foodx][foody]!=0)
    {
        foodx=rand()%level;
        foody=rand()%level;
    }
    map[foodx][foody]=2;
    GoToXY(foody*2+yyy,foodx+xxx);
    if(fff==8)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
        FOREGROUND_RED);
        printf("★");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    else
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
        FOREGROUND_RED|FOREGROUND_INTENSITY);
        printf("●");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    if_eaten=0;
}
void output()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

    GoToXY(lasty*2+yyy,lastx+xxx);
    printf("■");
    GoToXY(y*2+yyy,x+xxx);
    if(input==72||input=='w'||input=='W')
    {
        printf("△");
    }
    else if(input==80||input=='s'||input=='S')
    {
        printf("▽");
    }
    else if(input==75||input=='a'||input=='A')
    {
        printf("<<");
    }
    else if(input==77||input=='d'||input=='D')
    {
        printf(">>");
    }
    map[x][y]=1;
    lastx=x;
    lasty=y;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
double timmm;
void game_over()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    GoToXY(0,level/2+xxx-3);
    printf("    GAME OVER\n");
    printf("    速度:%d\n",speed);
    printf("    長度:%d\n",r-l+1);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_GREEN);
    printf("    成績:%d\n",ans);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    printf("    時間:%.2lf s\n",(double)clock()/CLOCKS_PER_SEC-timmm);
    GoToXY(5,1);
    printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
    Sleep(2000);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
int main()
{
    srand(time(NULL));
    first_output();
    make_food();
    int last_long=3;
    int mm=0;
    timmm=(double)clock()/CLOCKS_PER_SEC;
    while(1)
    {
        mm++;
        if(r-l==last_long+3)
        {
            if(speed>5)
            {
                speed-=5;
            }
            last_long=r-l;
        }
        GoToXY(5,1);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        Sleep(speed);
        read();
        change();
        map[x][y]=1;
        if(if_eaten||mm>(level*3)/2+1)
        {
            map[foodx][foody]=0;
            GoToXY(foody*2+yyy,foodx+xxx);
            printf("□");
            make_food();
            mm=0;
        }
        output();
        if(if_bomb==1)
        {
            GoToXY(0,level+xxx);
            game_over();
            break;
        }
    }
    GoToXY(0,level+xxx+1);
    system("pause");
    return 0;
}

/*

特殊字符:
□■→↓←↑  ◇▽ ○◎ ●
┗━│△▽ < > ???????????▲▼●◆★????☆◇○▽
┏┳┓
┣╋┫
┗┻┛
━┃
Sleep(10);
puts("□□□");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
FOREGROUND_RED|FOREGROUND_INTENSITY|BACKGROUND_BLUE|BACKGROUND_INTENSITY);

*/

3.無背景版

(其實沒什麼改動……)

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
void GoToXY(int x,int y)
{
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
#define MAXN 10

int level,speed;

int xxx=3;
int yyy=(81-MAXN*2)/2;
int map[100][100];//24*24
void GoToXY(int x, int y);
int x=MAXN/2,y=MAXN/2;
int lastx=x,lasty=y;
char input,lastinput;
int que[100000][2],l=1,r=0;
int if_bomb=0;
int if_eaten=0,foodx,foody;
int big_food=0,fff;
int ans=0;
void first_output()
{
    puts("                                     SNAKE                                     ");
    printf("\n                                    MADE BY\n\n");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■□■■■■□■■■□□□■■■■□□");
    puts("                  ■■■□■■■■□■□□■□□□□■■□□");
    puts("                  ■■■□■■■■□■■■□□□□■■□□□");
    puts("                  ■■■□■■■■□■□□■□□■■□□□□");
    puts("                  ■■■□□□□■□■■■□□□■■■■□□");
    puts("                  ■■■■■■■■□□□□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    puts("                  ■■■■■■■■■■■□□□□□□□□□□");
    Sleep(2000);
    system("cls");
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    printf("輸入地圖邊長:(推薦:10~20)\n");
    scanf("%d",&level);
    if(level>20)
    {
        level=20;
        printf("邊長過大,自動調整爲 20\n");
    }
    if(level<5)
    {
        level=5;
        printf("邊長過小,自動調整爲 5\n");
    }
    printf("\n輸入初始速度:(推薦:100~200)(單位:ms/格)(數值越小越快)(會隨蛇身長變長而減小)\n");
    scanf("%d",&speed);
    if(speed>1000)
    {
        speed=1000;
        printf("數值過小,自動調整爲 1000 ms/格\n");
    }
    if(speed<10)
    {
        speed=10;
        printf("數值過小,自動調整爲 10 ms/格\n");
    }
    Sleep(1000);
    system("cls");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
    FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
    puts("-====================================snake==========================lbz888  │");
    puts("                                                                            ┗-");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
    FOREGROUND_RED|FOREGROUND_BLUE);
    printf("\n");
    yyy=(81-level*2)/2;
    x=level/2,y=level/2;
    lastx=x,lasty=y;
    que[++r][0]=x;
    que[r][1]=y+1;
    map[x][y+1]=1;
    que[++r][0]=x;
    que[r][1]=y;
    map[x][y]=1;
    lastinput=75;
    input=75;
    GoToXY(0,xxx-1);
    for(int j=1;j<=yyy-2;j++)printf(" ");
    printf("┏");
    for(int i=0;i<level;i++) printf("━");
    printf("┓");
    printf("\n");
    for(int i=0;i<level;i++)
    {
        for(int j=1;j<=yyy-2;j++)printf(" ");
        printf("┃");
        for(int j=0;j<level;j++)
        {
            if(x==i&&y==j)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("<<");
            }
            else if(map[i][j]==1)
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("■");
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                printf("  ");
            }
        }
        printf("┃");
        printf("\n");
    }
    for(int j=1;j<=yyy-2;j++)printf(" ");
    printf("┗");
    for(int i=0;i<level;i++) printf("━");
    printf("┛");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
void read()
{
    int tempinput=input;
    while(kbhit())
    {
        input=-32;
        while(input==-32)
        {
            input=_getch();
        }
    }
    if(!(input==72||input=='w'||input=='W'||input==80||input=='s'||input=='S'||input==75||input=='a'||input=='A'||input==77||

input=='d'||input=='D'))
    {
        input=tempinput;
        return ;
    }
    if(input=='w'||input=='W')input=72;
    if(input=='s'||input=='S')input=80;
    if(input=='a'||input=='A')input=75;
    if(input=='d'||input=='D')input=77;
    if((lastinput==72&&input==80)||(lastinput==80&&input==72)||(lastinput==75&&input==77)||(lastinput==77&&input==75))
    {
        input=tempinput;
        return ;
    }
    lastinput=input;
}
void change()
{
    int if_moved=0;
    GoToXY(78,0);
    if(input==72||input=='w'||input=='W') // 上 
    {
        x--;
        x=(x+level)%level;
        printf("↑");
        if_moved=1;
    }
    if(input==80||input=='s'||input=='S') // 下 
    {
        x++;
        x=x%level;
        printf("↓");
        if_moved=1;
    }
    if(input==75||input=='a'||input=='A') // 左 
    {
        y--;
        y=(y+level)%level;
        printf("←");
        if_moved=1;
    }
    if(input==77||input=='d'||input=='D') // 右 
    {
        y++;
        y=y%level;
        printf("→");
        if_moved=1;
    }
    int lasst=map[x][y];
    if(if_moved==1)
    {
        que[++r][0]=x;
        que[r][1]=y;
        map[x][y]=1;
        if(map[foodx][foody]!=2)
        {
            if_eaten=1;
            ans+=10000/speed;
            if(fff==8) ans+=20000/speed;
        }
        else
        {
            map[que[l][0]][que[l][1]]=0;
            GoToXY(que[l][1]*2+yyy,que[l][0]+xxx);
            printf("  ");
            l++;
        }
    }
    if(lasst==1&&if_moved==1&&(x!=que[l-1][0]||y!=que[l-1][1]))
    {
        if_bomb=1;
    }
    map[x][y]=1;
}
void make_food()
{
    fff=rand()%10;
    if(fff==8)
    {
        big_food++; 
    }
    foodx=rand()%level;
    foody=rand()%level;
    while(map[foodx][foody]!=0)
    {
        foodx=rand()%level;
        foody=rand()%level;
    }
    map[foodx][foody]=2;
    GoToXY(foody*2+yyy,foodx+xxx);
    if(fff==8)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
        FOREGROUND_RED);
        printf("★");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    else
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
        FOREGROUND_RED|FOREGROUND_INTENSITY);
        printf("●");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    }
    if_eaten=0;
}
void output()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);

    GoToXY(lasty*2+yyy,lastx+xxx);
    printf("■");
    GoToXY(y*2+yyy,x+xxx);
    if(input==72||input=='w'||input=='W')
    {
        printf("△");
    }
    else if(input==80||input=='s'||input=='S')
    {
        printf("▽");
    }
    else if(input==75||input=='a'||input=='A')
    {
        printf("<<");
    }
    else if(input==77||input=='d'||input=='D')
    {
        printf(">>");
    }
    map[x][y]=1;
    lastx=x;
    lasty=y;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
double timmm;
void game_over()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    GoToXY(0,level/2+xxx-3);
    printf("    GAME OVER\n");
    printf("    速度:%d\n",speed);
    printf("    長度:%d\n",r-l+1);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_GREEN);
    printf("    成績:%d\n",ans);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    printf("    時間:%.2lf s\n",(double)clock()/CLOCKS_PER_SEC-timmm);
    GoToXY(5,1);
    printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
    Sleep(2000);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
int main()
{
    srand(time(NULL));
    first_output();
    make_food();
    int last_long=3;
    int mm=0;
    timmm=(double)clock()/CLOCKS_PER_SEC;
    while(1)
    {
        mm++;
        if(r-l==last_long+3)
        {
            if(speed>5)
            {
                speed-=5;
            }
            last_long=r-l;
        }
        GoToXY(5,1);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("\t地圖邊長:%d\t速度:%d ms/格\t成績:%d",level,speed,ans); 
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        Sleep(speed);
        read();
        change();
        map[x][y]=1;
        if(if_eaten||mm>(level*3)/2+1)
        {
            map[foodx][foody]=0;
            GoToXY(foody*2+yyy,foodx+xxx);
            printf("  ");
            make_food();
            mm=0;
        }
        output();
        if(if_bomb==1)
        {
            GoToXY(0,level+xxx);
            game_over();
            break;
        }
    }
    GoToXY(0,level+xxx+1);
    system("pause");
    return 0;
}

/*

特殊字符:

▁▂▃▄▅▆▇

□■

→↓←↑  

◇▽ ○◎ ●△▽ < > ???????????▲▼●◆★????☆◇○▽
┏┳┓
┣╋┫
┗┻┛

━┃

Sleep(10);
puts("□□□");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|
FOREGROUND_RED|FOREGROUND_INTENSITY);

*/




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章