首页 > 其他分享 >贪吃蛇

贪吃蛇

时间:2023-04-24 22:33:52浏览次数:30  
标签:lie head int hang tail 贪吃蛇 NULL

#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;
}

 

标签:lie,head,int,hang,tail,贪吃蛇,NULL
From: https://www.cnblogs.com/Lynchteacher/p/17351203.html

相关文章

  • 基于LINUX系统下多线程贪吃蛇小游戏
    基于Ncurse图形库的C语言小游戏。涉及到,C变量,流程控制,函数,指针,结构体等知识内容,动态链表的创建和插入,以及释放。数组的遍历,#include<stdlib.h>#include<curses.h>#defineROW20#defineCOL20#defineROW_Snake2#defineCOL_Snake2#defineUP1#defineDOWN......
  • 用chartGPT自动生成的贪吃蛇游戏
    importpygameimporttimeimportrandom#初始化Pygame库pygame.init()#定义游戏窗口大小WINDOW_WIDTH=500WINDOW_HEIGHT=500#定义游戏速度SPEED=15#创建游戏窗口screen=pygame.display.set_mode((WINDOW_WIDTH,WINDOW_HEIGHT))#设置游戏标题py......
  • c语言贪吃蛇(2)关于蛇的函数封装
    hassnakenode():检测循环体内部是否含有蛇身结点,若有,则返回1(对应main输出蛇结点),否则判断点后移吗,再判断,之后返回0(不输出蛇结点)  addnode():创造新蛇结点,用malloc申请空间,并插入到尾结点之后。(尾插法)initsnake():创建初始头尾结点,malloc申请空间,方便后续蛇结点的添加,初始赋......
  • c语言贪吃蛇(1)地图实现
    采用循环输出来实现按照行和列的顺序两次for循环输出。代码:结果: ......
  • Github 添加贪吃蛇动画
    前言我们都知道,对于Github来说,当你选择你的账户时,可以看到自己的提交记录。于是就有大神动脑筋了,这些commit记录都是一些豆,如果弄一条蛇来,不就可以搞个贪吃蛇了吗?有道理有道理,本文就来讲一下如何弄一条蛇出来。 创建步骤创建个人仓库个人仓库是一个特殊的仓库,名字就是你的......
  • 贪吃蛇
     importpygameimportrandom#初始化pygame.init()#游戏界面宽高和方块大小WINDOW_WIDTH=800WINDOW_HEIGHT=1080CELL_SIZE=20#颜色定义WHITE=(255,255,255)BLACK=(0,0,0)GREEN=(0,255,0)RED=(255,0,0)#创建游戏界面pygame.display......
  • 一个简单的rust项目贪吃蛇
    一个贪吃蛇游戏的rust实现,使用了piston_window和randcrate。游戏使用上下左右方向键进行操控,使用R重置游戏,使用P进行暂停/启动。项目结构·├──Cargo.lock├──Cargo.toml├──src/│  ├──main.rs│  ├──snake_game/│  │ ├─......
  • 使用Java开发贪吃蛇游戏一之静态界面
    一、设置窗口,包括但不限于窗口标题、可见、窗口可关闭,固定大小、设置大小 packagelearn_snake;/**@authorMK*@date2023年3月15日*/importjavax.swing.JFra......
  • 表格制作 贪吃蛇案例
    使用表格制作解释都在注释里 html文件:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>she</title><linkrel="stylesh......
  • ChatGPT: delphi写一个贪吃蛇
    unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl......