小时候拿着诺基亚玩贪吃蛇,觉得好好玩(尽管是像素游戏,只有黑白)
如今贪吃蛇版本非常多,颜色也非常鲜艳,但万变不离其宗的是蛇要吃食物才能变长,碰到墙(或者自己)就game over!(有些版本碰到自己不会死)
贪吃蛇
如今长大了,觉得贪吃蛇游戏就是小case,不值一提,但最近我对它另眼相看了……因为一个简单的字符贪吃蛇也写得特难受!!!
作业发布下来后的几天,我一直上网看相关代码,但却超出了我的知识范围……最后不得不向一位师兄借了一下代码“借鉴”,但最后还是写出了有巨大BUG的贪吃蛇,BUG如下:
①开始画面一切很正常,丝毫没有BUG的感觉,但是……
②输入s往下走的那一下,整个人是崩溃的,蛇身居然短了,而且食物出现在蛇永远吃不到的地方(左上角)!!!
最后不得不直接让这条蛇撞墙死了算了……
虽然不算完美,但是在其中还是学到了一些东西
源代码(有BUG!!!)
snake1.c代码
#include<stdio.h>
#include<stdlib.h>
#include"snake1.h"
void move(); //移动
void outputmap(); //输出地图
void gameover(); //游戏结束
void score(); //吃食物得分
void set(); //初始化地图
void score(); //吃食物得分
//主函数
int main(){
set();
outputmap();
gameover();
return 0;
}
snake1.h代码
#include<stdio.h>
#include<stdlib.h>
int headx,heady,max,dir,begin; //蛇头的坐标,方向,长度
char in; //读取字符
int map[12][12] = {0}; //地图
int i, j, foodx, foody; //食物
//对于地图,根据初始化来定义地图,如-1为边界,0为内部,max为蛇身,100为食物
void outputmap(){
for(i=0;i<=11;i++){
for(j=0;j<=11;j++){
if(map[i][j]==-1)
printf("*");
if(map[i][j]==0)
printf(" ");
if(map[i][j]!=0&&map[i][j]!=-1&&map[i][j]!=max&&map[i][j]!=100)
printf("X");
if(map[i][j]==max)
printf("H");
if(map[i][j]==100)
printf("$");
}
printf("\n");
}
return;
}
//吃食物函数 当蛇头碰到食物,身长加一,游戏继续
void score(){
if(map[headx][heady]!=100){
map[headx][heady]=max+1;
for(i=1;i<11;i++){
for(j=1;j<11;j++){
if(!(map[i][j]==0||map[i][j]==-1)){
map[i][j]--;
}
}
}
map[foodx][foody]=100;
}
else{
max++;
map[headx][heady]=max;
}
system("cls"); //清屏输出
outputmap();
return;
}
//移动函数,读取用户输入一个字符,S为向下一格,W为向上一格,A为向左一格,D为向右一格
//不断输入,用EOF来作为结束判断
void move(){
if(begin==0){
dir='d';
begin++;
}
if(scanf("%c",&in)!=EOF)
dir=in;
switch(dir){
case 'd':
heady++;
break;
case 'a':
heady--;
break;
case 'w':
headx--;
break;
case 's':
headx++;
break;
}
return;
}
//游戏结束,当蛇头碰到边界或自己身体,判断游戏结束,跳出循环输出GAME OVER
void gameover(){
while(1){
move();
if(map[headx][heady]!=0&&map[headx][heady]!=max&&map[headx][heady]!=100){
printf("Game Over!!!\n");
break;
}
else
score();
}
}
//初始化地图,将地图赋值化后输出,跟outputmap函数一起调用
void set(){
for (i=0;i<=11;i++) {
map[i][0]=-1;
map[i][11]=-1;
map[0][i]=-1;
map[11][i]=-1;
}
for (i=1;i<=5;i++) {
map[1][i]=i;
}
max=5;
headx=1;
heady=5;
begin=0;
}
总结
通过这次的学习,教会了我,千万不要小看那些简单的小游戏,看似简单,但其背后可能是几百行甚至上千行的代码量!!!可能是程序员不知道爆了多少肝才写出来的,所以我们要尊重每一个小游戏,要带着敬畏的心去玩……