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;

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值