管理员


私信TA

用户名:dotcpp0671292

访问量:337

签 名:

admin

等  级
排  名 13979
经  验 900
参赛次数 0
文章发表 7
年  龄 0
在职情况 学生
学  校
专  业 信息技术

  自我简介:

20320623211600

TA的其他文章

#include<stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

#include <time.h>

#include <windows.h>

#define MAXWIDTH (30)

#define MAXHEIGHT MAXWIDTH

#define INITLEN (3)

struct{

    char *ch;

    int color;

    char type;

}

charBorder = {"□", 4, 1},

charBg = {"■", 2, 2},

charSnake = {"★", 0xe, 3},

charFood = {"●", 0xc, 4};

struct{

    char type;

    int index;

}globalMap[MAXWIDTH][MAXHEIGHT];

struct{

    int x;

    int y;

} snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ], scoresPostion;

int scores = 0;

int snakeMapLen = (MAXWIDTH-2)*(MAXHEIGHT-2);

int headerIndex, tailIndex;  //蛇头蛇尾对应的snakeMap中的索引(下标)

HANDLE hStdin; 

void setPosition(int x, int y){

    COORD coord;

    coord.X = 2*y;

    coord.Y = x;

    SetConsoleCursorPosition(hStdin, coord);

}

void setColor(int color){

    SetConsoleTextAttribute(hStdin, color);

}

void createFood(){

    int index, rang, x, y;

    //产生随机数,确定 snakeMap 数组的索引 

    srand((unsigned)time(NULL));

    if(tailIndex<headerIndex){

        rang = headerIndex-tailIndex-1;

        index = rand()%rang + tailIndex + 1;

    }else{

        rang = snakeMapLen - (tailIndex - headerIndex+1);

        index = rand()%rang;

        if(index>=headerIndex){

            index += (tailIndex-headerIndex+1);

        }

    }

    x = snakeMap[index].x;

    y = snakeMap[index].y;

    setPosition(x, y);

    setColor(charFood.color);

    printf("%s", charFood.ch);

    globalMap[x][y].type=charFood.type;

}

//死掉

void die(){

    int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;

    int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;

    setPosition(xCenter, yCenter-5);

    setColor(0xC);

    printf("You die! Game Over!");

    getch();

    exit(0);

}

void move(char direction){

    int newHeaderX, newHeaderY;

    int newHeaderPreIndex;

    int newHeaderPreX, newHeaderPreY; 

    int newHeaderPreType;

    int oldTailX, oldTailY;

    switch(direction){

        case 'w':

            newHeaderX = snakeMap[headerIndex].x-1;

            newHeaderY = snakeMap[headerIndex].y;

            break;

        case 's':

            newHeaderX = snakeMap[headerIndex].x+1;

            newHeaderY = snakeMap[headerIndex].y;

            break;

        case 'a':

            newHeaderX = snakeMap[headerIndex].x;

            newHeaderY = snakeMap[headerIndex].y-1;

            break;

        case 'd':

            newHeaderX = snakeMap[headerIndex].x;

            newHeaderY = snakeMap[headerIndex].y+1;

            break;

    }

    headerIndex = headerIndex==0 ? snakeMapLen-1 : headerIndex-1;

    newHeaderPreIndex = globalMap[newHeaderX][newHeaderY].index;

    newHeaderPreX = snakeMap[headerIndex].x;

    newHeaderPreY = snakeMap[headerIndex].y;

    snakeMap[headerIndex].x = newHeaderX;

    snakeMap[headerIndex].y = newHeaderY;

    globalMap[newHeaderX][newHeaderY].index = headerIndex;

    snakeMap[newHeaderPreIndex].x = newHeaderPreX;

    snakeMap[newHeaderPreIndex].y = newHeaderPreY;

    globalMap[newHeaderPreX][newHeaderPreY].index = newHeaderPreIndex;

    newHeaderPreType = globalMap[newHeaderX][newHeaderY].type;

    //设置新蛇头类型

    globalMap[newHeaderX][newHeaderY].type = charSnake.type;

    // 判断是否出界或撞到自己 

    if(newHeaderPreType==charBorder.type || newHeaderPreType==charSnake.type ){

        die();

    }

    //输出新蛇头

    setPosition(newHeaderX, newHeaderY);

    setColor(charSnake.color);

    printf("%s", charSnake.ch);

    //判断是否吃到食物

    if(newHeaderPreType==charFood.type){  //吃到食物

        createFood();

        //更改分数

        setPosition(scoresPostion.x, scoresPostion.y);

        printf("%d", ++scores);

    }else{

        //老蛇尾坐标

        oldTailX = snakeMap[tailIndex].x;

        oldTailY = snakeMap[tailIndex].y;

        //删除蛇尾

        setPosition(oldTailX, oldTailY);

        setColor(charBg.color);

        printf("%s", charBg.ch);

        globalMap[oldTailX][oldTailY].type = charBg.type;

        tailIndex = (tailIndex==0) ? snakeMapLen-1 : tailIndex-1;

    }

}

//下次移动的方向

char nextDirection(char ch, char directionOld){

    int sum = ch+directionOld;

    ch = tolower(ch);

    if( (ch=='w' || ch=='a' || ch=='s' || ch=='d') && sum!=197 && sum!=234 ){

        return ch;

    }else{

        return directionOld;

    }

}

//暂停

char pause(){

    return getch();

}

// 初始化

void init(){

    // 设置相关变量 

    int x, y, i, index;

    int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;

    int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;

    CONSOLE_CURSOR_INFO cci;  //控制台光标信息

    //判断相关设置是否合理

    if(MAXWIDTH<16){

        printf("'MAXWIDTH' is too small!");

        getch();

        exit(0);

    }

    //设置窗口大小 

    system("mode con: cols=96 lines=32");

    //隐藏光标

    hStdin = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleCursorInfo(hStdin, &cci);

    cci.bVisible = 0;

    SetConsoleCursorInfo(hStdin, &cci);

    //打印背景 

    for(x=0; x<MAXHEIGHT; x++){

        for(y=0; y<MAXWIDTH; y++){

            if(y==0 || y==MAXWIDTH-1 || x==0 || x==MAXHEIGHT-1){

                globalMap[x][y].type = charBorder.type;

                setColor(charBorder.color);

                printf("%s", charBorder.ch);

            }else{

                index = (x-1)*(MAXWIDTH-2)+(y-1);

                snakeMap[index].x= x;

                snakeMap[index].y= y;

                globalMap[x][y].type = charBg.type;

                globalMap[x][y].index = index;

                setColor(charBg.color);

                printf("%s", charBg.ch);

            }

        }

        printf("\n");

    }

    //初始化贪吃蛇

    globalMap[xCenter][yCenter-1].type = globalMap[xCenter][yCenter].type = globalMap[xCenter][yCenter+1].type = charSnake.type;

    headerIndex = (xCenter-1)*(MAXWIDTH-2)+(yCenter-1) - 1;

    tailIndex = headerIndex+2;

    setPosition(xCenter, yCenter-1);

    setColor(charSnake.color);

    for(y = yCenter-1; y<=yCenter+1; y++){

        printf("%s", charSnake.ch);

    }

    //生成食物

    createFood();

    //设置程序信息

    setPosition(xCenter-1, MAXWIDTH+2);

    printf("   Apples : 0");

    setPosition(xCenter, MAXWIDTH+2);

    printf("   Author : xiao p");

    setPosition(xCenter+1, MAXWIDTH+2);

    printf("Copyright : c.biancheng.net");

    scoresPostion.x = xCenter-1;

    scoresPostion.y = MAXWIDTH+8;

}

int main(){

    char charInput, direction = 'a';

    init();

    charInput = tolower(getch());

    direction = nextDirection(charInput, direction);

    while(1){

        if(kbhit()){

            charInput = tolower(getch());

            if(charInput == ' '){

                charInput = pause();

            }

            direction = nextDirection(charInput, direction);

        }

        move(direction);

        Sleep(500);

    }   

    getch();

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »