linux终端贪吃蛇代码,Linux终端贪吃蛇-,作品展示区,好资源齐分享,鱼C论坛 - Powered by Discuz!...

#include

#include

#include

#include

#include

#include

#define Q_line 22

#define width 78

#define height 22

int array[22][78][2]={0};

int head_x = 10;

int head_y = 10;

int rear_x = 10;

int rear_y = 10;

int fool_x;

int fool_y;

int way = 3;

pthread_t id;

//0 left 1 up 2 right 3down

int getchoice();//获取键盘输入

void strat_game();//开始游戏

void creat_fool();//产生一个食物节点

void go();//贪吃蛇的运行前进

void refresh_win();//刷新界面

void creat_fool();//

int check_fool();//检测当前方向的前一个节点是不是食物

void go_catch();//吃掉食物

void find_rear();//找到后一个尾节点

void all_check();//检测是不是墙壁或者吃到自身

void snake_die();//死亡方法

int main()

{

int choice;

int first =0,key;

initscr();

noecho();

cbreak();

keypad(stdscr,1);

mvprintw(5,5,"My Greedy Snake Game V1.0");

mvprintw(6,10,"Power by HeLe");

mvprintw(Q_line,5,"Press space to start");

refresh();

while((key = getchoice()) != 'q'){

switch(key){

case ' ':if(!first){strat_game();first=1;}

break;

case KEY_UP:if(way != 3){way = 1;array[head_x][head_y][1] = 1;}

break;

case KEY_DOWN:if(way != 1){way = 3;array[head_x][head_y][1] = 3;}

break;

case KEY_LEFT:if(way !=2){ way = 0;array[head_x][head_y][1] = 0;}

break;

case KEY_RIGHT:if(way != 0) {way = 2;array[head_x][head_y][1] = 2;}

break;

}

}

endwin();

exit(EXIT_SUCCESS);

}

void snake_die()

{

mvprintw(Q_line-1,5,"Snake has die,Press Q to quti");

refresh();

pthread_exit("Ok");

}

void all_check(int tway)        //check die

{

if(head_x > Q_line || head_x < 1 || head_y > 77 || head_y < 1)snake_die();

switch(tway){

case 0:if(array[head_x][head_y-1][0] == 1)snake_die();

break;

case 1:if(array[head_x-1][head_y][0] == 1)snake_die();

break;

case 2:if(array[head_x][head_y+1][0] == 1)snake_die();

break;

case 3:if(array[head_x+1][head_y][0] == 1) snake_die();

break;

}

}

void refresh_win()

{

int x,y;

clear();

for(x = 1; x <= height;x++ )

{

for(y = 1; y <= width; y++)

{

if(array[x][y][0] == 1)

{

mvprintw(x,y,"%s","*");

}

if(x == rear_x && y==rear_y){

mvprintw(x,y,"%s","$");

}

if(x==head_x && y == head_y){

mvprintw(x,y,"%s","@");

}

}

}

for(x = 0 ,y =0;y < 78;y++)

{

mvprintw(x,y,"-");

mvprintw(y,x,"|");

mvprintw(Q_line+1,y,"-");

mvprintw(y,width,"|");

}

move(height,width);

refresh();

usleep(200000);

go();

}

int getchoice(){

int key;

key = getch();

return key;

}

void creat_fool()

{

srand((unsigned)time(NULL));

fool_x = rand() %21+1;

fool_y = rand()%77+1;

while(array[fool_x][fool_y][0] == 1)

{

fool_x = rand()%22+1;

fool_y = rand()%78+1;

}

array[fool_x][fool_y][0] = 1;

}

void strat_game()

{

clear();

//box(stdscr,'|','-');

array[10][10][0] = 1;

array[10][10][1] = 3;

creat_fool();

if((pthread_create(&id,NULL,(void*)refresh_win,NULL)) !=0){

endwin();

exit(1);

}

}

int check_fool()

{

switch(way)

{

case 0:if(head_x == fool_x && (head_y-1) == fool_y)return 1;

else return 0;

break;

case 1:if((head_x-1) == fool_x && head_y == fool_y)return 1;

else return 0;

break;

case 2:if(head_x == fool_x && (head_y+1) == fool_y)return 1;

else return 0;

break;

case 3:if((head_x+1) == fool_x && head_y == fool_y)return 1;

else return 0;

break;

}

}

void go_catch(int tway)

{

array[fool_x][fool_y][0] = 1;

array[fool_x][fool_y][1] = tway;

head_x = fool_x;

head_y = fool_y;

creat_fool();

}

void find_rear()

{

array[rear_x][rear_y][0] = 0;

switch(array[rear_x][rear_y][1]){

case 0:rear_y--;

break;

case 1:rear_x--;

break;

case 2:rear_y++;

break;

case 3:rear_x++;

break;

}

}

void go()

{

switch(way)

{

case 0:if(check_fool()){

go_catch(0);

}

else {

all_check(0);

array[head_x][--head_y][0] = 1;

array[head_x][head_y][1] = 0;

array[rear_x][rear_y][0] = 0;

find_rear();

}

break;

case 1:if(check_fool()){

go_catch(1);

}

else {

all_check(1);

array[--head_x][head_y][0] = 1;

array[head_x][head_y][1] = 1;

array[rear_x][rear_y][0] = 0;

find_rear();

}

break;

case 2:if(check_fool()){

go_catch(2);

}

else {

all_check(2);

array[head_x][++head_y][0] = 1;

array[head_x][head_y][1] = 2;

array[rear_x][rear_y][0] = 0;

find_rear();

}

break;

case 3:if(check_fool()){

go_catch(3);

}

else {

all_check(3);

array[++head_x][head_y][0] = 1;

array[head_x][head_y][1] = 3;

array[rear_x][rear_y][0] = 0;

find_rear();

}

break;

}

refresh_win();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值