Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)

Posted 橙子果果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)相关的知识,希望对你有一定的参考价值。

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)

蛇身的设计

蛇身用 “[ ]” 代替

void addNode()

        struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake));
        new->hang = tail->hang;
        new->lie = tail->lie+1;
        new->next = NULL;
        tail->next = new;
        tail=new;

void initSnake()

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

        addNode();
        addNode();


蛇身的初始化和蛇身长度的添加。

在地图中打印蛇身

for(lie=0;lie<=20;lie++)
                        if(lie == 0 || lie == 20)
                                printw("|");
                        else if(hasSnakeNode(hang,lie))
                                printw("[]");
                                
                        else
                                printw("  ");
                        
                

判断蛇的位置

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;

蛇的移动是增加一个节点,删除一个节点。

void deleNode()

        struct Snake *p;
        p = head;
        head = head->next;
        free(p);

void moveSnake()

        addNode();
        deleNode();
        if (tail->hang == 0 || tail->hang == 20 || tail->lie == 0 || tail->lie == 20)
        
                initSnake();
        



多线程

蛇的移动、地图刷新和蛇方向的控制是两个独立的循环
在一个程序中无法同时运行两个线程。
所以这里引出了多线程的知识。

#include <stdio.h>
#include <pthread.h>

void * func1()

        while(1)
                printf("this is func1\\n");
                sleep(1);
        


void * func2()

        while(1)
                printf("this is func2\\n");
                sleep(1);
        

int main()

        pthread_t th1;
        pthread_t th2;

        pthread_create(&th1,NULL,func1,NULL);
        pthread_create(&th2,NULL,func2,NULL);
        while(1);
        return 0;


这里有两个线程 func1 和 func2 这两个线程不能同时运行,所以这里写到多线程
引入头文件和相关API,运行这两个线程。

所以这里在实现蛇的移动和地图的刷新也可以用相同的方法。

void* refreshJM()

         while(1)
                        moveSnake();
                        gamePic();
                        refresh();
                        usleep(100000);
                



void* changeDir()

        while(1)
                key = getch();
                switch(key)
                        case KEY_DOWN:
                                dir = DOWN;
                                break;
                        case KEY_UP:
                                dir = UP;
                                break;
                        case KEY_LEFT:
                                dir = LEFT;
                                break;
                        case KEY_RIGHT:
                                dir = RIGHT;
                                break;
        



int main()

        pthread_t th1;
        pthread_t th2;

        initNcurse();
        initSnake();

        gamePic();

        pthread_create(&th1,NULL,refreshJM,NULL);
        pthread_create(&th2,NULL,changeDir,NULL);
        while(1);
        getch();
        endwin();
        return 0;

这里就是既可以控制方向,又可以让蛇移动。

以上是关于Linux环境下,基于Ncurse图形库贪吃蛇小游戏(中)的主要内容,如果未能解决你的问题,请参考以下文章

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(上)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(上)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(下)

Linux环境下,基于Ncurse图形库贪吃蛇小游戏(下)

2021-10-18 Python 使用curses库贪吃蛇小游戏走过的坑

小项目特供 贪吃蛇游戏(基于C语言)