字符游戏贪吃蛇
来源:互联网 发布:淘宝拍摄 编辑:程序博客网 时间:2024/05/18 03:24
小时候拿着诺基亚玩贪吃蛇,觉得好好玩(尽管是像素游戏,只有黑白)
如今贪吃蛇版本非常多,颜色也非常鲜艳,但万变不离其宗的是蛇要吃食物才能变长,碰到墙(或者自己)就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; }
总结
通过这次的学习,教会了我,千万不要小看那些简单的小游戏,看似简单,但其背后可能是几百行甚至上千行的代码量!!!可能是程序员不知道爆了多少肝才写出来的,所以我们要尊重每一个小游戏,要带着敬畏的心去玩……
阅读全文