当前位置:  技术问答>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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 文本的贪吃蛇游戏 nSnake
  • 贪吃蛇游戏 JavaFX Snake
  • 贪吃蛇的问题
  • J2ME版的贪吃蛇游戏 Jnake
  • 分享linux下写的贪吃蛇代码
  • 贪吃蛇游戏C++命令行版实例代码
  • 50行代码实现贪吃蛇(具体思路及代码)
  • Python写的贪吃蛇游戏例子
  • 基于C语言实现的贪吃蛇游戏完整实例代码
  • mingw编译的windows命令行贪吃蛇示例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3