Linux环境下C语言实现贪吃蛇游戏

Linux环境下C语言实现贪吃蛇游戏,第1张

概述Linux环境下C语言实现贪吃蛇游戏

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

[[email protected] snake]$ more snake.c#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <signal.h>#include <sys/time.h>#define NUM 60 struct direct                //用来表示方向的{    int cx;    int cy;};typedef struct node            //链表的结点{    int cx;    int cy;    struct node *back;    struct node *next;}node; voID initGame();            //初始化游戏int setTicker(int);            //设置计时器voID show();                //显示整个画面voID showinformation();        //显示游戏信息(前两行)voID showSnake();            //显示蛇的身体voID getorder();            //从键盘中获取命令voID over(int i);            //完成游戏结束后的提示信息 voID creatlink();                //(带头尾结点)双向链表以及它的 *** 作voID insertNode(int x,int y);  voID deleteNode();voID deletelink(); int ch;                                //输入的命令int hour,minute,second;            //时分秒int length,tTime,level;            //(蛇的)长度,计时器,(游戏)等级struct direct dir,food;            //蛇的前进方向,食物的位置node *head,*tail;                    //链表的头尾结点 int main(){    initscr();[[email protected] snake]$ more snake.c#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <signal.h>#include <sys/time.h>#define NUM 60 struct direct                //用来表示方向的{    int cx;    int cy;};typedef struct node            //链表的结点{    int cx;    int cy;    struct node *back;    struct node *next;}node; voID initGame();            //初始化游戏int setTicker(int);            //设置计时器voID show();                //显示整个画面voID showinformation();        //显示游戏信息(前两行)voID showSnake();            //显示蛇的身体voID getorder();            //从键盘中获取命令voID over(int i);            //完成游戏结束后的提示信息 voID creatlink();                //(带头尾结点)双向链表以及它的 *** 作voID insertNode(int x,*tail;                    //链表的头尾结点 int main(){    initscr();    initGame();    signal(SIgalRM,show);    getorder();    enDWin();    return 0;} voID initGame(){    cbreak();                    //把终端的CBREAK模式打开    noecho();                    //关闭回显    curs_set(0);                //把光标置为不可见    keypad(stdscr,true);        //使用用户终端的键盘上的小键盘    srand(time(0));                //设置随机数种子    //初始化各项数据    hour = minute = second = tTime = 0;    length = 1;    dir.cx = 1;    dir.cy = 0;    ch = 'A';    food.cx = rand() % ColS;    food.cy = rand() % (lines-2) + 2;    creatlink();    setTicker(20);} //设置计时器(这个函数是书本上的例子,有改动)int setTicker(int n_msecs){    struct itimerval new_timeset;    long    n_sec,n_usecs;     n_sec = n_msecs / 1000 ;    n_usecs = ( n_msecs % 1000 ) * 1000L ;    new_timeset.it_interval.tv_sec  = n_sec;           new_timeset.it_interval.tv_usec = n_usecs;         n_msecs = 1;    n_sec = n_msecs / 1000 ;    n_usecs = ( n_msecs % 1000 ) * 1000L ;    new_timeset.it_value.tv_sec     = n_sec  ;         new_timeset.it_value.tv_usec    = n_usecs ;        return setitimer(ITIMER_REAL,&new_timeset,NulL);} voID showinformation(){    tTime++;    if(tTime >= 1000000)                //        tTime = 0;    if(1 != tTime % 50)        return;    move(0,3);      //显示时间    printw("time: %d:%d:%d %c",hour,second);    second++;    if(second > NUM)    {        second = 0;        minute++;    }    if(minute > NUM)    {        minute = 0;        hour++;    }    //显示长度,等级    move(1,0);    int i;    for(i=0;i<ColS;i++)        addstr("-");    move(0,ColS/2-5);    printw("length: %d",length);    move(0,ColS-10);    level = length / 3 + 1;    printw("level: %d",level);} //蛇的表示是用一个带头尾结点的双向链表来表示的,//蛇的每一次前进,都是在链表的头部增加一个节点,在尾部删除一个节点//如果蛇吃了一个食物,那就不用删除节点了voID showSnake(){    if(1 != tTime % (30-level))        return;    //判断蛇的长度有没有改变    bool 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))    {        over(1);        return;    }    //如果蛇头砬到自己的身体,则游戏结束    if('*' == mvinch(head->next->cy+dir.cy,head->next->cx+dir.cx) )    {        over(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)        {            over(3);            return;        }        //重新设置食物的位置        food.cx = rand() % ColS;        food.cy = rand() % (lines-2) + 2;    }    if(!lenChange)    {        move(tail->back->cy,tail->back->cx);        printw(" ");        deleteNode();    }    move(head->next->cy,head->next->cx);    printw("*");} voID show(){    signal(SIgalRM,show);        //设置中断信号    showinformation();    showSnake();    refresh();                    //刷新真实屏幕} voID getorder(){    //建立一个死循环,来读取来自键盘的命令    while(1)    {        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;        }        setTicker(20);    }} voID over(int i){    //显示结束原因    move(0,0);    int j;    for(j=0;j<ColS;j++)        addstr(" ");    move(0,2);    if(1 == i)        addstr("Crash the wall. Game over");    else if(2 == i)        addstr("Crash itself. Game over");    else if(3 == i)        addstr("Mission Complete");    setTicker(0);                //关闭计时器    deletelink();                //释放链表的空间} //创建一个双向链表voID creatlink(){    node *temp = (node *)malloc( sizeof(node) );    head = (node *)malloc( sizeof(node) );    tail = (node *)malloc( sizeof(node) );    temp->cx = 5;    temp->cy = 10;    head->back = tail->next = NulL;    head->next = temp;    temp->next = tail;    tail->back = temp;    temp->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);} 

运行
[[email protected] snake]$[[email protected] snake]$ gcc snake.c -lcurses -o snake[[email protected] snake]$ ./snake

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的Linux环境下C语言实现贪吃蛇游戏全部内容,希望文章能够帮你解决Linux环境下C语言实现贪吃蛇游戏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1232073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存