手把手教你写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;


}

猜你喜欢

转载自blog.csdn.net/qq_41603898/article/details/80932765