贪吃蛇作为初学语言的程序员来说是,个不错的练手项目,不过还是需要一定的基础的,而作为一个从没写过项目的小白来说,写这个贪吃蛇可谓难于上青天。
首先,是代码块与块之间的联系:
void game_begin(){
int i,j;
while(1){
Sleep(500);
direction();
snake_move();
show_map();
if(over) {
printf("game over\n");
break;
}
}
}
很多时候,是知道这个程序需要什么函数去实现功能的,比如生成食物,生成地图,蛇的移动及数据记录等等,然后当这么多函数都写出来的时候,我发现我没能有效的结合这么多函数,尝试了好多次才终于结合为一个整体。
其次,是蛇吃到食物后长度的变化问题:
(上图为了使程序更加直观,我调整了长宽)
我第一次尝试的时候,蛇吃到食物后记录的长度是会+1但要在下一次移动的时候才会显示,那么,怎么才能改进这步骤呢?
void check_snake(){
if(map[snake[0].y][snake[0].x] == wall) over = 1;
if(map[snake[0].y][snake[0].x] == food) {
snake_len += 1;
create_food();
}
}
void snake_move(){
int i , x ,y ;
for(i=snake_len;i>=1;--i){
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
switch(direct){
case 0:
snake[0].y +=1;
break;
case 1:
snake[0].y -=1;
break;
case 2:
snake[0].x -= 1;
break;
case 3:
snake[0].x += 1;
}
check_snake();
reset_map();
}
如第一个代码片能看到的,我是用snake_move->check_snake->sholew_map 调整了函数的顺序来使长度的变化能马上显示出来
,而为了去得到这个数据,我在一开始的数据储存的时候就额外的输出len+1个元素,如果吃到食物,第len+1个元素就输出X否则输出空格。
在编写过程中我还遇到如何更新蛇的数据,一开始我设想用循环从i=0到i=len-1,但发现不行,必须如下才能实现:
void snake_move(){
int i , x ,y ;
for(i=snake_len;i>=1;--i){
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
做完种种步骤,基本上蛇就能动了,因为我最初想法只是为了做个贪吃蛇,所以我是用了在玩家不输入的情况下蛇自动移动,所以还是挺好玩的。感觉做的不错,只用了144行,下次继续努力。