/* ■ ■ ■ ■ ■ ■ ■ ■ ■
* 退格: 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;
}
linux C语言ncurses实现贪吃蛇代码
最新推荐文章于 2024-05-11 17:24:42 发布