其实字符版本的贪吃蛇并不是很大的一个工作量,大概是在120行代码左右。而整个程序的设计也是充分体现着“自顶向下”的设计思路的。
主函数就是极其简单,毕竟最开始思考的时候就是想着什么条件下用户可以玩(蛇没有死掉),什么条件就结束。
int main() {
playGame();
printGameOver();
}
playgame过程就包括要把一些元素放上去了,其中也包含了整个游戏的大致过程,先打印出蛇、地图、墙等元素,考虑蛇的移动等,并判断游戏是否结束。
//游戏未结束则继续玩
void playGame() {
initSnake();
initFood();
productFood();
while (!gameover()) {
system("cls");
printMap();
snakeMove();
eatFood();
productFood();
}
}
//判断游戏是否结束
int gameover() {
if (snake.x[0] == 0 || snake.x[0] == MAP_LENGTH + 1
|| snake.y[0] == 0 || snake.y[0] == MAP_HIGHT + 1)
return 1;
int i;
for(i = 1; i < snake.length; ++ i) {
if( (snake.x[0] == snake.x[i]) && (snake.y[0] == snake.y[i]) )
return 1;
}
return 0;
}
这就基本是贪吃蛇的基本函数了,剩下的事情就是要把每个函数要达到的目的给实现出来。这里就以snakemove为例子:
//根据玩家输入进行移动
void snakeMove() {
int i;
for (i = snake.length; i > 0; -- i) {
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
char input = getInput();
if (input == 'W' || input == 'w') {
snake.y[0] -= 1;
}
if (input == 'S' || input == 's') {
snake.y[0] += 1;
}
if (input == 'A' || input == 'a') {
snake.x[0] -= 1;
}
if (input == 'D' || input == 'd') {
snake.x[0] += 1;
}
}
以上便是设计的大致思路了,其实每个问题都要把它分解成多个小问题来解决,要时刻体现出自顶向下的思想,这样的思路才是正确的。