贪吃蛇游戏设计
C C 语言实训三:贪吃蛇游戏设计语言实训三:贪吃蛇游戏设计 1.游戏主画面及规则 2.描述蛇及食物的数据结构 蛇身体由多节构成,每节有不同的位置(坐标) ,蛇的节数由吃到食物多少决定。蛇 的信息可以由下面结构体描述: struct Snake{//struct Snake{//描述的信息描述的信息 int x[200];//int x[200];//每节的每节的 X X 坐标坐标 int y[200];//int y[200];//每节的每节的 Y Y 坐标坐标 int count;//int count;//蛇的节数蛇的节数 int direct;//int direct;//蛇移动方向蛇移动方向 int isliving; //int isliving; //蛇是否活着蛇是否活着, ,活着――活着――1 1,死――,死――0 0 int color;//int color;//蛇颜色蛇颜色 } snake;} snake; #define FNUM#define FNUM3; //3; //定义在画面上同时出现的食物数定义在画面上同时出现的食物数 struct Food{//struct Food{//描述食物的信息描述食物的信息 int x;//Xint x;//X 坐标坐标 int y;//Yint y;//Y 坐标坐标 int type;//int type;//食物的类型食物的类型 int score;//int score;//吃到此类食物的得分吃到此类食物的得分 } food;} food;// //如在画面上要同时出现多个食物,则用如在画面上要同时出现多个食物,则用 food[FNUM];food[FNUM]; 3. 画游戏空间的边界(围墙) #define WALL_TOP#define WALL_TOP 50 //50 //围墙各边界的坐标(单位:象素)围墙各边界的坐标(单位:象素) #define W#define WALL_BOTTOMALL_BOTTOM550550 #define W#define WALL_LEFTALL_LEFT5050 #define W#define WALL_RIGHTALL_RIGHT600600 void DrawWall(void) //void DrawWall(void) //画围墙画围墙 { { setcolor(11);setcolor(11); setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型设置线型*/ */ for(i= WALL_LEFT-10;iWALL_RIGHT||yWALL_BOTTM)ALL_BOTTM) return 0; //return 0; //蛇是否撞到墙壁蛇是否撞到墙壁 for(i=3; i0;i--)//蛇的每个环节往前移动一节,到达前一节原位置蛇的每个环节往前移动一节,到达前一节原位置 { {snake.x[i]=snake.x[i-1];snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];snake.y[i]=snake.y[i-1];} } } } 7.产生一个新食物 随机产生一个新食物,位置是随机的,类型也是随机的,信息填写到一个食物结构体变量中,并给出食物的分数 struct Foodstruct FoodNewFood ()NewFood () { {struct Foodstruct Foodnewfd;newfd; int width = WALL_RIGHTint width = WALL_RIGHT -- WALL_LEFT;//WALL_LEFT;// 空间宽空间宽 int hight = WALL_BOTTOMint hight = WALL_BOTTOM -- WALL_TOP;//WALL_TOP;//空间高空间高 newfd.x =rand()%width + WALL_LEFT+1; //newfd.x =rand()%width + WALL_LEFT+1; // 随机生成食物的位置坐标随机生成食物的位置坐标( (在墙内在墙内) ) newfd.y =rand()%hight + WALL_TOP;newfd.y =rand()%hight + WALL_TOP; // //调整食物位置,使在整格内调整食物位置,使在整格内, ,这样才可以让蛇吃到这样才可以让蛇吃到 while(newfd.x%10!=0)while(newfd.x%10!=0)newfd.x++;newfd.x++; while(newfd.y%10!=0)while(newfd.y%10!=0)newfd.y++;newfd.y++; // //本可以随机生成食物类型本可以随机生成食物类型, ,但简化了,只生成一种但简化了,只生成一种 newfd.type=1;newfd.type=1;newfd.score=10;newfd.score=10; return newfd;return newfd; } } 8. 画一个食物 根据食物的类形,在屏幕上画不同的图形,来表示蛇要去吃的食物 void DrawFood( structvoid DrawFood( structFoodFoodfd,fd,intintcolor)color) { {// //可以用可以用 switch(fd.type)switch(fd.type)来分别针对不同类食物,画不同的图来分别针对不同类食物,画不同的图 // //为了简化,这里只画一种类型食物为了简化,这里只画一种类型食物 setcolor(color);setcolor(color); rectangle(food.x, food.y, food.x+10, food.y-10);rectangle(food.x, food.y, food.x+10, food.y-10); } } 9. 蛇是否吃到食物 判断蛇是否吃到食物的依据是蛇头移动到了食物位置(坐标相同) ,吃到了,蛇的节数增1,把食物分数加入得分,同时清除食物,随机生成另一新食物。 int CanEatFood()int CanEatFood() { { if(snake.x[0]==food.x //DrawFood( food, SPACECOLOR);//用背景色把画面上的食物东西擦掉用背景色把画面上的食物东西擦掉 Snake.count++; //Snake.count++; //蛇增长一节蛇增长一节 snake.x[snake.count]= snake.x[snake.count-1];//snake.x[snake.count]= snake.x[snake.count-1];//新的一节与原未节重又能叠新的一节与原未节重又能叠 snake.y[snake.count]= snake.y[snake.count-1];//snake.y[snake.count]= snake.y[snake.count-1];