首先引入curses和pthread库用于实现键盘读取与多线程
#include <curses.h>
#include <stdlib.h>
#include <pthread.h>
#define Hang 20
#define Lie 20
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
首先创建一个地图
void printmap(){
int hang;
int lie;
move(0,0);
for(hang=0;hang<=Hang;hang++){
if(hang==0){
for(lie=0;lie<Lie;lie++){
printw("--");
}
printw("\n");
}
if(hang>0&&hang<20)
{
for(lie=0;lie<=Lie;lie++){
if(lie==0||lie==Lie)
printw("|");
else if(have_snakebody(hang,lie))
{
printw("[]");
}
else if(have_snakefood(hang,lie))
{
printw("##");
}
else
printw(" ");
}
printw("\n");
}
if(hang==20)
{
for(lie=0;lie<Lie;lie++){
printw("--");
}
printw("\n");
printw("make by zsw");
printw("%d",dir);
}
}
}
接着创建蛇身及食物的结构体并初始化头结点和尾结点
struct Snake
{
int hang;
int lie;
struct Snake *next;
};
struct Snake food;
struct Snake *head=NULL;
struct Snake *tail=NULL;
void initfood()
{
int x=rand()%20;
int y=rand()%20;
food.hang=x;
food.lie=y;
}
采用尾插法来增加一个结点使蛇变长
void addnode()
{
struct Snake *new = (struct Snake *)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 deletnode()
{
struct Snake *p;
p=head;
head=head->next;
free(p);
}
初始化一只蛇
void snakebodyinit(){
struct Snake *p;
dir=4;
initfood();
while(head!=NULL)
{
p=head;
head=head->next;
free(p);
}
head=(struct Snake*)malloc(sizeof(struct Snake));
head->hang=2;
head->lie=2;
head->next=NULL;
tail=head;
addnode();
addnode();
addnode();
}
扫描蛇身与食物位置在printmap中显示
int have_snakebody(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 have_snakefood(int i,int j)
{
if(food.hang == i && food.lie == j){
return 1;
}
return 0;
}
撞墙检测
void moveSnake()
{
struct Snake *new;
addnode();
if(have_snakefood(tail->hang,tail->lie))
{initfood();
food.hang=food.hang+1;}
else
deletnode();
if(tail->hang==20||tail->lie==20||tail->hang==0||tail->lie==0)
{
snakebodyinit();
}
}
游戏基本元素初始化与按键扫描
void snake_int(){
initscr();
keypad(stdscr,1);
}
void* get_dir()
{
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;
}
}
}
刷新控制蛇的速度
void *refreshinterface()
{ while(1)
{
moveSnake();
printmap();
refresh();
usleep(100000);
}
}
在主函数使用pthrea_t开辟多线程空间实现多线程同时扫描按键刷新屏幕
int main(){
int control;
pthread_t th1,th2;
snake_int();
snakebodyinit();
printmap();
pthread_create(&th1, NULL, refreshinterface, NULL);
pthread_create(&th2, NULL, get_dir, NULL);
while(1);
getch();
endwin();
return 0;
}
项目已开源需要源码请留言