贪吃蛇

复制代码
#include<curses.h>
#include<stdlib.h>

#define UP 1
#define DOWN -1
#define LEFT 2
#define RIGHT -2

struct Snake 
{
    int hang;
    int lie;
    struct Snake *next;
};

struct Snake *head = NULL;
struct Snake *tail = NULL;
int key;
int dir;

struct Snake food;

void initFood()
{
    int x = rand()%20;
    int y = rand()%20;

    food.hang = x;
    food.lie = y;
}



void initNcurse()
{
    initscr();
    keypad(stdscr,1);
}

int hasSnakeNode(int i,int j)
{
    struct Snake *p;
    p = head;
    
    while(p != NULL){
        if(p->hang == i && p->lie == j){
            return 1;        
        }    
        p = p->next;    
    }
    
    return 0;
}

int hasFood(int i,int j)
{
    if(food.hang == i && food.lie == j){
            return 1;        
    }
    return 0; 
}

void gamePic()
{
    int hang;
    int lie;
    move(0,0);
    for(hang=0;hang<20;hang++){
        if(hang == 0){
            for(lie=0;lie<20;lie++){
                printw("--");
            }
            printw("\n");
        }
        if(hang>=0 && hang<=19){
            for(lie=0;lie<=20;lie++){
                if(lie == 0 || lie == 20){
                    printw("|");
                }else if(hasSnakeNode(hang,lie)){
                    printw("[]");                
                }else if(hasFood(hang,lie)){
                    printw("##");                
                }
                else{
                    printw("  ");
                }
            }    
            printw("\n");    
        }
        if(hang == 19){
            for(lie=0;lie<20;lie++){
                printw("--");
            }
            printw("\n");    
        }
    }
    printw("by Lynchteacher");
}

void addNode()
{
    struct Snake *new = (struct Sanke *)malloc(sizeof(struct Snake));
    
    new->next = NULL;
    
    switch(dir){
        case UP:
            new->hang = tail->hang-1;
            new->lie = tail->lie;
            break;
        case DOWN:
            new->hang = tail->hang+1;
            new->lie = tail->lie;
            break;
        case LEFT:
            new->hang = tail->hang;
            new->lie = tail->lie-1;
            break;
        case RIGHT:
            new->hang = tail->hang;
            new->lie = tail->lie+1;
            break;
    }
    
    tail->next = new;
    tail = new;
}

void initSnake()
{
    struct Snake *p;

    dir = RIGHT;    
    
    while(head != NULL){
        p = head;
        head = head->next; 
        free(p);    
    }

    initFood();    
    head = (struct Snake *)malloc(sizeof(struct Snake));
    head->hang = 1;
    head->lie = 1;
    head->next = NULL;

    tail = head;
    
    addNode();
}

void deleNode()
{
    struct Snake *p;
    p = head;
    head = head->next;
    free(p);
}

int ifSnakeDie()
{
    struct Snake *p;
    p = head;
    
    if(tail->hang < 0 || tail->lie == 0 || tail->hang == 20 || tail->lie ==20){
        return 1;    
    }
    
    while(p->next != NULL){
        if(p->hang == tail->hang &&p->lie == tail->lie){
            return 1;
        }
        p = p->next;            
    }
    return 0;
}


void moveSnake()
{
    addNode();
    if(hasFood(tail->hang,tail->lie)){
        initFood();    
    }else{
        deleNode();
    }

    if(ifSnakeDie()){
        initSnake();
    }
}

void refreshJieMian()
{
    while(1){
        moveSnake();
        gamePic();
        refresh();
        usleep(200000);
    }    
}

void turn(int direction)
{
    if(abs(dir) != abs(direction)){
        dir = direction;    
    }
}

void changeDir()
{
    int key;
    while(1){
        key = getch();
        switch(key){
            case KEY_DOWN:
                turn(DOWN);
                break;    
            case KEY_UP:
                turn(UP);
                 break;
            case KEY_LEFT:
                turn(LEFT);
                break;
            case KEY_RIGHT:
                turn(RIGHT);
                break;
        }
    }
}

int main()
{
    pthread_t t1;
    pthread_t t2;
    
    initNcurse();
    
    initSnake();
    
    gamePic();
    
    pthread_create(&t1,NULL,refreshJieMian,NULL);
    pthread_create(&t2,NULL,changeDir,NULL);
    
    while(1);
    
    getch();
    endwin();
    return 0;
}
复制代码

 

posted @   林奇老师  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示