linux C语言ncurses实现贪吃蛇代码

/* ■ ■ ■ ■ ■ ■ ■ ■ ■
 * 退格: 263
 * Ctr+C: 3
 * 回车: 10
 * 上: 259
 * 下: 258
 * 左: 260
 * 右: 261
 * 拉动窗口: 410
 * ■ ■ ■ ■ ■ ■ ■ ■ ■
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
#include <unistd.h>
#include <time.h>

/*snake coordinate including x,y*/
typedef struct snake_coordinate{
	int x;
	int y;
}SNAKE;

/*snake body coordinate struct, to load the snake*/
typedef struct snake_load{
	SNAKE coordinate;
	struct snake_load *next;
}SNAKE_LOAD;

/*snake features including snake_head, and it's length*/
typedef struct snake_features{
	SNAKE_LOAD *head;
	int length;
}SNAKE_CREAT;

typedef struct snake_food{
	int x;
	int y;
}FOOD;

SNAKE_CREAT snake_wx;
FOOD snake_food;
int key = 259;

/*to print the game map*/
void map()

{
	for(int i = 0; i < 22; i++)
	{
		for(int j = 0; j < 50; j=j+2)
		{
			mvprintw(i, j, "*");
		}
	}
	for(int i = 1; i < 21; i++)
	{
		for(int j = 2; j < 48; j=j+2)
		{
			mvprintw(i, j, " ");
		}
	}
}


void Print_snake()

{	
	SNAKE_LOAD *snake_head = snake_wx.head;
	for(int i = 0; i < snake_wx.length; i++)
	{
		//printw("x: %d, y: %d\n", snake_head->coordinate.x, snake_head->coordinate.y);
		mvprintw(snake_head->coordinate.x, snake_head->coordinate.y, "*");
		snake_head = snake_head->next;
	}
}


void Creat_snake(int length)

{
	int located_x = 12;
	int located_y = 30;
	SNAKE snake;
	snake_wx.length = length;
	SNAKE_LOAD *snake_head_body = (SNAKE_LOAD*)malloc(sizeof(SNAKE_LOAD));
	snake_wx.head = snake_head_body;
	for(int i = 0; i < snake_wx.length; i++)
	{
		snake.x = located_x;
		snake.y = located_y;
		located_x++;
		SNAKE_LOAD *snake_body = (SNAKE_LOAD*)malloc(sizeof(SNAKE_LOAD));
		snake_head_body->coordinate = snake;
		snake_head_body->next = snake_body;
		snake_head_body = snake_body;
	}
	Print_snake();
}


void Creat_food()

{
	int flag = 1;
	SNAKE_LOAD *snake_head = snake_wx.head;
	srand((unsigned int)time(NULL));
	snake_food.x = rand() % 19;
	snake_food.y = rand() % 23;
	snake_food.y = snake_food.y * 2;
	while(1)
	{
		if(snake_food.x < 1 || snake_food.y < 2)
		{
			if(snake_food.x <= 1)
			{
				snake_food.x = snake_food.x + 2;
			}
			if(snake_food.y <= 2)
			{
				snake_food.y = snake_food.y * 2;
				if(snake_food.y == 0)
				{
					snake_food.y = snake_food.y + 2;
				}
			}
		}
		snake_head = snake_wx.head;
		for(int i = 0; i < snake_wx.length; i++)
		{
			if(snake_food.x == snake_head->coordinate.x && snake_food.y == snake_head->coordinate.y)
			{
				flag = 0;
				break;
			}
			snake_head = snake_head->next;
		}
		if(flag == 1)
		{
			break;
		}
		else
		{
			if(key == 260 || key == 261)
			{
				if(snake_food.x < 19 && snake_food.x > 5)
				{
					snake_food.x = snake_food.x - 2;
				}
				if(snake_food.x < 5)
				{
					snake_food.x = snake_food.x + 4;
				}
			}
			if(key == 259 || key == 258)
			{
				if(snake_food.y/2 < 23 && snake_food.y/2 > 5)
				{
					snake_food.y = (snake_food.y/2 - 4) * 2;
				}
				if(snake_food.y/2 < 5)
				{
					snake_food.y = (snake_food.y/2 + 4) * 2;
				}
			}
			flag = 1;
		}
	}
	mvprintw(snake_food.x, snake_food.y, "O");
}

void Eat_food()
{
	SNAKE_LOAD *snake_head = snake_wx.head;
	while(1)
	{
		if(snake_head->next == NULL)
		{
			SNAKE_LOAD *snake_body = (SNAKE_LOAD*)malloc(sizeof(SNAKE_LOAD));
			snake_head->next = snake_body;
			break;
		}
		snake_head = snake_head->next;
	}
	snake_wx.length = snake_wx.length + 1;
}


void snake_move()

{
	SNAKE_LOAD *snake_head = snake_wx.head;
	for(int i = 0; i < snake_wx.length; i++)
	{
		if(i + 1 == snake_wx.length){
			mvprintw(snake_head->coordinate.x, snake_head->coordinate.y, " ");
		}
		snake_head = snake_head->next;
	}
	snake_head = snake_wx.head;
	int x,y;
	int x_clone,y_clone;
	x = snake_head->coordinate.x;
	y = snake_head->coordinate.y;
	for(int i = 0; i < snake_wx.length; i++)
	{
		
		x_clone = (snake_head->next)->coordinate.x;
		y_clone = (snake_head->next)->coordinate.y;
		(snake_head->next)->coordinate.x = x;
		(snake_head->next)->coordinate.y = y;
		x = x_clone;
		y = y_clone;
		snake_head = snake_head->next;
	}
}

void up()

{
	snake_move();
	SNAKE_LOAD *snake_head = snake_wx.head;
	snake_head->coordinate.x = snake_head->coordinate.x - 1;
	Print_snake();
}

void down()

{
	snake_move();
	SNAKE_LOAD *snake_head = snake_wx.head;
	snake_head->coordinate.x = snake_head->coordinate.x + 1;
	Print_snake();
}

void left()

{
	snake_move();
	SNAKE_LOAD *snake_head = snake_wx.head;
	snake_head->coordinate.y = snake_head->coordinate.y - 2;
	Print_snake();
}

void right()

{	
	snake_move();
	SNAKE_LOAD *snake_head = snake_wx.head;
	snake_head->coordinate.y = snake_head->coordinate.y + 2;
	Print_snake();
}

/* --- Main --- */
int main()

{
	int last_key = key;
	initscr();
	raw();
	noecho();
	curs_set(0);
	keypad(stdscr, 1);
	nodelay(stdscr, 1);
	map();
	Creat_snake(4);
	Creat_food();
	while((key = getch())){
		if(key > 0)  /*keydown*/
		{
			if(key == 258 && last_key == 259){
				key = 259;
			}
			if(key == 259 && last_key == 258){
				key = 258;
			}
			if(key == 260 && last_key == 261){
				key = 261;
			}
			if(key == 261 && last_key == 260){
				key = 260;
			}
			last_key = key;
		}
		else	   /*Don't keydown*/
		{
			key = last_key;
		}
		switch(key){
			case 258: //printw("down\n");
				  down();
				  break;
			case 259: //printw("up\n");
				  up();
				  break;
			case 260: //printw("left\n");
				  left();
				  break;
			case 261: //printw("right\n");
				  right();
				  break;
		}
		if(key == 3){
			break;
		}
		if(snake_wx.head->coordinate.x == 0 || snake_wx.head->coordinate.y == 0 || snake_wx.head->coordinate.x == 21 || snake_wx.head->coordinate.y == 48){
			break;
		}
		if(snake_wx.head->coordinate.x == snake_food.x && snake_wx.head->coordinate.y == snake_food.y){
			Creat_food();
			Eat_food();
		}
		refresh();
		usleep(120000);
	}
	endwin();
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值