专栏首页wym手把手教你写linux系统下贪吃蛇(一)

手把手教你写linux系统下贪吃蛇(一)

转载请注明出处

这一部分打出的贪吃蛇是不会动的,下一节继续补充讲完代码

先下好curses库(详情点击

第一部分写好以下几个函数

1)基本的curses函数写在一个函数中;

2)方向初始化函数;

3)蛇身初始化函数;

4)食物初始化函数;

5)检查是否有蛇身的函数;

6)打印游戏界面函数;

7)增加蛇身长度的函数;

8)主函数。

预备工作:

  全局变量

 node *head,*tail,*food;

 int dir;//表示方向时要用到

写好结构体,用链表实现贪吃蛇

typedef struct snakeBodynode { int x; int y;                    //x,y是坐标 struct snakeBodynode *next;

}node;

头文件以及声明

#include<curses.h> #include<stdlib.h> #include<time.h> #include<malloc.h> #define BOADSIZE 20//边界为20乘20 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4//上下左右

一)基本函数

     void initCurses() {     initscr();     noecho();     keypad(stdscr,TRUE);     timeout(1);     mvprintw(0,0,""); }//具体解释见上面链接

二)方向初始化函数;

void initdir() { dir=RIGHT;

}

假设一开始不向右;

三)蛇身初始化函数;

void InitSnake() { head=tail=(node *)malloc(sizeof(node)); head->x=1; head->y=1; AddNode(); AddNode(); AddNode();

}//初始化位置(1,1 ), 三个AddNode(),长度加三,初始化蛇身长度为4

四)食物初始化函数;

  void CreatFood() { food=(node *)malloc(sizeof(node)); srand(time(NULL)); food->x=rand()%BOADSIZE; food->y=rand()%BOADSIZE;

}

//随机出现食物

五)检查是否有蛇身的函数;

int HasSnakeBody(int x,int y) { node *tmp = head; while(tmp!=NULL){ if(tmp->x==x&&tmp->y==y){ return 1; } tmp = tmp->next; } return 0; }

//遍历链表,若此时打印的地方有蛇身,则返回一,为后面打印界面准备

六)打印游戏界面函数;

void SnakeBody() { int i,j; for(j=0;j<BOADSIZE;j++){ if(j==0){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else if(j==BOADSIZE-1){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else{ for(i=0;i<=BOADSIZE;i++){ if(i==0){ printw("|"); }else if(i==BOADSIZE){ printw("|"); }  else if(HasSnakeBody(i,j)==1){ printw("[]");//蛇身 }else if(food->x==i&&food->y==j){ printw("**");//此处为食物 }                                    else{ printw("  "); } } } printw("\n"); }     refresh();

}//打印界面

七)增加蛇身长度的函数

void AddNode() { node *newNode; node *bak; newNode=(node *)malloc(sizeof(node)); tail->next=newNode; bak=tail; tail=newNode; switch(dir){ case UP: tail->x=bak->x; tail->y=bak->y-1; break; case DOWN: tail->x=bak->x; tail->y=bak->y+1; break; case LEFT: tail->x=bak->x-1; tail->y=bak->y; break; case RIGHT: tail->x=bak->x+1; tail->y=bak->y; break; //注意原点(0,0)在左上角,所以这里上下左右要注意(x,y)如何变化 }

}

八)主函数

int main() { initCurses(); initdir(); CreatFood(); InitSnake(); SnakeBody(); while(1);//为了停留在这个界面         endwin(); return 0;

}

汇总:

#include<curses.h> #include<stdlib.h> #include<time.h> #include<malloc.h> #define BOADSIZE 20 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 typedef struct snakeBodynode { int x; int y; struct snakeBodynode *next; }node; node *head,*tail,*food; int dir; void initCurses() {     initscr();     noecho();     keypad(stdscr,TRUE);     timeout(1);     mvprintw(0,0,"");    // endwin(); } void initdir() { dir=RIGHT; } int HasSnakeBody(int x,int y) { //         printw("%d   ",y); node *tmp = head; while(tmp!=NULL){ if(tmp->x==x&&tmp->y==y){ return 1; } tmp = tmp->next; } return 0; } void AddNode() { node *newNode; node *bak; newNode=(node *)malloc(sizeof(node)); tail->next=newNode; bak=tail; tail=newNode; switch(dir){ case UP: tail->x=bak->x; tail->y=bak->y-1; break; case DOWN: tail->x=bak->x; tail->y=bak->y+1; break; case LEFT: tail->x=bak->x-1; tail->y=bak->y; break; case RIGHT: tail->x=bak->x+1; tail->y=bak->y; break; } } void InitSnake() { head=tail=(node *)malloc(sizeof(node)); head->x=1; head->y=1; AddNode(); AddNode(); AddNode(); } void CreatFood() { food=(node *)malloc(sizeof(node)); srand(time(NULL)); food->x=rand()%BOADSIZE; food->y=rand()%BOADSIZE; } void SnakeBody() { int i,j; for(j=0;j<BOADSIZE;j++){ if(j==0){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else if(j==BOADSIZE-1){ for(i=0;i<BOADSIZE;i++){ printw("--"); } } else{ for(i=0;i<=BOADSIZE;i++){ if(i==0){ printw("|"); }else if(i==BOADSIZE){ printw("|"); }                                else if(HasSnakeBody(i,j)==1){ printw("[]"); }else if(food->x==i&&food->y==j){ printw("**"); }                                    else{ printw("  "); } } } printw("\n"); }     refresh(); } int main() { initCurses(); initdir(); CreatFood(); // AddNode(); InitSnake(); SnakeBody(); while(1);         endwin(); return 0; }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • P3372 【模板】线段树 1 线段树模版+懒惰标记

    用户2965768
  • 广义欧拉降幂 fzu 1759

    用户2965768
  • HDU 6319 单调队列

     题目:http://acm.hdu.edu.cn/showproblem.php?pid=6319

    用户2965768
  • [Go] golang实时监控日志文件的包tail

    在linux中有一个tail命令,tail -f可以实时的监控文件新增加的内容,如果用代码实现这个逻辑,可以下载使用这个包 go get github.com/...

    陶士涵
  • H264码流分析导读

    H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer...

    deep_sadness
  • 静态逆向反汇编获取函数调用关系链

    本文提出一种通过逆向二进制文件的方式,通过反汇编的指令获取函数之间的调用关系。

    熊彪
  • 初窥dep

    霡霂
  • Python绘制柱状图显示中国式过马路方式

    Python小屋屋主
  • 2.js中对于函数参数不确定的解决--arguments

    1.arguments对象 在函数代码中,使用特殊对象 arguments,无需明确指出参数名,就能访问它们。 例如,在函数 sayHello() 中,第一个参...

    joshua317
  • python 中输出字符的颜色控制属性

    在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中。而一般的应用服务器,第三方库,甚至服务器的一些通告也...

    学到老

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动