当前位置: 技术问答>linux和unix
我写的贪吃蛇,请大家多多支持(2)
来源: 互联网 发布时间:2016-10-07
本文导语: //mysnake2.0.c //编译命令:cc mysnake1.0.c -lcurses -lpthread -o mysnake1.0 //用方向键控制蛇的方向,q退出 #include #include #include #include #include #include #define NUM 60 struct direct //用来表示方向的 { ...
//mysnake2.0.c
//编译命令:cc mysnake1.0.c -lcurses -lpthread -o mysnake1.0
//用方向键控制蛇的方向,q退出
#include
#include
#include
#include
#include
#include
#define NUM 60
struct direct //用来表示方向的
{
int cx;
int cy;
};
typedef struct node //链表的结点
{
int cx;
int cy;
struct node *back;
struct node *next;
}node;
int ch; //输入的命令
bool over;
int hour, minute, second; //时分秒
int length, tTime, level; //(蛇的)长度,计时器,(游戏)等级
struct direct dir, food; //蛇的前进方向,食物的位置
node *head, *tail; //链表的头尾结点
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void initGame(); //初始化游戏
void *showTime();
void *showSnake();
void *getOrder(); //从键盘中获取命令
void gameOver(int i); //游戏结束
void creatLink(); //(带头尾结点)双向链表以及它的操作
void insertNode(int x, int y);
void deleteNode();
void deleteLink();
int main()
{
//三个线程:计时,显示蛇的身体,
pthread_t tTime, tSnake, tOrder;
initGame();
//创建各个线程
pthread_create(&tTime, NULL, showTime, NULL);
pthread_create(&tSnake, NULL, showSnake, NULL);
pthread_create(&tOrder, NULL, getOrder, NULL);
//等待各个线程退出,主程序才能退出(好像没什么意义)
pthread_join(tTime, NULL);
pthread_join(tSnake, NULL);
pthread_join(tOrder, NULL);
endwin();
return 0;
}
void initGame()
{
initscr();
cbreak(); //把终端的CBREAK模式打开
noecho(); //关闭回显
curs_set(0); //把光标置为不可见
keypad(stdscr, true); //使用用户终端的键盘上的小键盘
srand(time(0)); //设置随机数种子
over = false; //初始化各项数据
hour = minute = second = 0;
length = 2;
dir.cx = 1;
dir.cy = 0;
ch = 'A';
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2) + 2;
creatLink();
move(1, 0);
int i;
for(i=0;i NUM)
{
second = 0;
minute++;
}
if(minute > NUM)
{
minute = 0;
hour++;
}
refresh();
sleep(1);
}
return NULL;
}
void *showSnake()
{
int speed;
bool lenChange;
while(!over)
{
pthread_mutex_lock(&lock); //加互斥锁
//判断蛇的长度有没有改变
lenChange = false;
//显示食物
move(food.cy, food.cx);
printw("@");
//如果蛇碰到墙,则游戏结束
if((COLS-1==head->next->cx && 1==dir.cx)
|| (0==head->next->cx && -1==dir.cx)
|| (LINES-1==head->next->cy && 1==dir.cy)
|| (2==head->next->cy && -1==dir.cy))
{
gameOver(1);
return;
}
//如果蛇头砬到自己的身体,则游戏结束
if('*' == mvinch(head->next->cy+dir.cy, head->next->cx+dir.cx) )
{
gameOver(2);
return;
}
insertNode(head->next->cx+dir.cx, head->next->cy+dir.cy);
//蛇吃了一个“食物”
if(head->next->cx==food.cx && head->next->cy==food.cy)
{
lenChange = true;
length++;
//恭喜你,通关了
if(length >= 50)
{
gameOver(3);
return;
}
//重新设置食物的位置
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2) + 2;
}
if(!lenChange)
{
move(tail->back->cy, tail->back->cx);
printw(" ");
deleteNode();
}
else
{
move(0, COLS/2-5);
printw("length: %d", length);
move(0, COLS-10);
level = length / 3 + 1;
printw("level: %d", level);
}
move(head->next->cy, head->next->cx);
printw("*");
refresh();
pthread_mutex_unlock(&lock); //解锁
speed = 10000 * (50 - level);
usleep(speed);
}
return NULL;
}
void *getOrder()
{
//建立一个死循环,来读取来自键盘的命令
while(!over)
{
ch = getch();
if(KEY_LEFT == ch)
{
dir.cx = -1;
dir.cy = 0;
}
else if(KEY_UP == ch)
{
dir.cx = 0;
dir.cy = -1;
}
else if(KEY_RIGHT == ch)
{
dir.cx = 1;
dir.cy = 0;
}
else if(KEY_DOWN == ch)
{
dir.cx = 0;
dir.cy = 1;
}
else if('q' == ch)
{
endwin();
exit(1);
}
}
return NULL;
}
//创建一个双向链表
void creatLink()
{
node *temp1 = (node *)malloc( sizeof(node) );
node *temp2 = (node *)malloc( sizeof(node) );
head = (node *)malloc( sizeof(node) );
tail = (node *)malloc( sizeof(node) );
temp1->cx = 5;
temp1->cy = 10;
temp2->cx = 5;
temp2->cy = 11;
head->back = tail->next = NULL;
head->next = temp1;
temp1->next = temp2;
temp2->next = tail;
tail->back = temp2;
temp2->back = temp1;
temp1->back = head;
}
//在链表的头部(非头结点)插入一个结点
void insertNode(int x, int y)
{
node *temp = (node *)malloc( sizeof(node) );
temp->cx = x;
temp->cy = y;
temp->next = head->next;
head->next = temp;
temp->back = head;
temp->next->back = temp;
}
//删除链表的(非尾结点的)最后一个结点
void deleteNode()
{
node *temp = tail->back;
node *bTemp = temp->back;
bTemp->next = tail;
tail->back = bTemp;
temp->next = temp->back = NULL;
free(temp);
temp = NULL;
}
//删除整个链表
void deleteLink()
{
while(head->next != tail)
deleteNode();
head->next = tail->back = NULL;
free(head);
free(tail);
}
void gameOver(int i)
{
over = true;
//显示结束原因
move(0, 0);
int j;
for(j=0;j
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!