前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你写linux系统下贪吃蛇(一)

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

作者头像
用户2965768
发布2018-08-30 16:39:06
9580
发布2018-08-30 16:39:06
举报
文章被收录于专栏:wym

转载请注明出处

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

先下好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; }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档