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语言)