-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsnake.h
157 lines (124 loc) · 2.98 KB
/
snake.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <ncurses.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
// height of the game window
#define GAME_WIN_HEIGHT 15
// width of the game window
#define GAME_WIN_WIDTH 60
// width of the log window
#define LOG_WIN_HEIGHT 7
// width of the log window
#define LOG_WIN_WIDTH 60
// descriptor, used for select function
#define STDIN 0
#define MAX_GRADE 50
#define GAME_TITLE " Snake Game "
#define GAME_GRADE " Grade: %d "
#define GAME_DIFF " Diff: %d "
#define LOG_TITLE " Log "
#define PLAY_AGAIN "Play Again?"
#define GAME_OVER "Game Over: Your Garde:%d"
#define GAME_WIN "Oh! You win! Your Garde:%d"
#define WELCOME "Snake Game V0.1 "
#define CHOOSEDIFF "choose difficulty(1 - 5):"
#define SHOWDIFF "difficulty:%d"
#define CONTINUE "press any key to continue the game"
#define INFO1 "\'*\': 1 score"
#define INFO2 "\'@\': 3 score"
#define INFO3 "\'%%\': 5 score"
// direction of every snake's node
enum DIRE
{
UP = 0,
DOWN = 1,
LEFT = 2,
RIGHT = 3,
};
static char foodTypeChar[] = {'*', '@', '%'};
static char SnakeShape[] = {'^', 'v', '<', '>'};
static int foodReward[] = {1, 3, 5};
typedef struct
{
int grade;
//难度系数 difficulty factor
int difficulty;
//是否存在食物
int exsitFood;
//游戏窗口
WINDOW *gameWin;
WINDOW *logWin;
} Game, *GamePtr;
//组成蛇的节点
typedef struct SnakeNode
{
int x;
int y;
enum DIRE dire;
struct SnakeNode *next;
} SnakeNode, *SnakeNodePtr;
//蛇
typedef struct
{
enum DIRE dire;
int length;
// head of the snake
SnakeNodePtr head;
} Snake, *SnakePtr;
typedef struct
{
int type;
int x, y;
int reward;
} Food, *FoodPtr;
/**
* @brief 初始化游戏, 重置分数、难度、游戏窗口、日志窗口
*
* @param game
* @return int 0: success, other: fail
*/
void gameInit(GamePtr game);
WINDOW *newWindown(int height, int width, int left, int top);
/**
* @brief 更新游戏状态
*
* @return int 0: go on, bigger: win, smaller: fail
*/
int gameRefresh(GamePtr game, SnakePtr snake);
void snakeInit(SnakePtr snake);
/**
* @brief 移动蛇
*
* @param snake
*/
void snakeMove(SnakePtr snake);
/**
* @brief 检查蛇的状态
*
* @param snake
* @param food
* @return int 0: go on. bigger: reward, smaller: fail
*/
int snakeCheck(SnakePtr snake, FoodPtr food);
void snakeGrow(SnakePtr snake);
void gameOver(GamePtr game, char *msg);
SnakeNodePtr snakeNodeInit(SnakeNodePtr *node, int x, int y, enum DIRE dire);
void snakeDraw(GamePtr game, SnakePtr snake);
void logAdd(GamePtr game, char *msg);
void lineClean(GamePtr game, int lineIndex);
void foodDraw(GamePtr game, FoodPtr food);
void foodInit(FoodPtr food, SnakePtr snake);
void gameDestroy(GamePtr game);
void snakeDestroy(SnakePtr snake);
void welcome(GamePtr game);
void clearGameWin(GamePtr game);
/**
* @brief Get the Random number
*
* @param min 最小值
* @param max 最大值
* @return int
*/
int getRandom(int min, int max);