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图形库贪吃蛇小游戏(中)的主要内容,如果未能解决你的问题,请参考以下文章