很早就有了这个想法,只是一直没有践行,经过零零碎碎地小作业,慢慢就做了出来,看起来还行。
下面说一下我的思路:
a 通过画一个二维数组显示游戏框图
b 创建蛇,单向链表最合适了
c 蛇的行动,撞墙、吃自己:游戏结束,移动、吃食物:游戏进行
d 蛇的控制,一开始用简单的getchar模拟,后面从网上找了按键识别,做出来了,还有待学习
e 游戏步骤:恢复空图->写入蛇->写入食物->输出画面->控制输入->蛇的行动->游戏结束判断->恢复空图
总的来说,还有一些结构可以优化,部分可以集合到一个函数里,画面还ok。
难点:1 蛇移动的函数设计,开始用传入结点指针,返回void,结果蛇走一下没动,从尾巴到蛇头慢慢缩成一个头,于是发现传入的蛇头只是指针的值(形参),原来的蛇头还是没变,于是设计了返回结点指针,通过赋值 snake = Move(snake)的方式更新蛇头,然后蛇就活了
2 按键的输入,此处涉及I/O的操作,借鉴的网上代码,待学习
3 逻辑转换,二维数组与数学中x,y坐标的转换一开始就弄得很混乱,但所幸才二维而已,通过高度、宽度的概念一下就清晰了。
还算简单,脑海中有大概的思路,剩下的就是一步步来,多用printf()把错误点定位出来,下一步,继续学习。
<c/centos>
1 #include <stdio.h>
2 #include <time.h>
3 #include <malloc.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <stdlib.h>
7 #include <sys/select.h>
8
9 void setIO(int flag)
10 {
11 if(flag)
12 system("stty cbreak -echo");
13 else
14 system("stty cooked echo");
15 }
16
17 #define high 20
18 #define wide 30
19
20 #define up 1
21 #define down 2
22 #define left 3
23 #define right 4
24
25 int score = 0;
26 int Level = 1;
27 int direction = 1;
28 int IsEat=0;
29 int FoodH=5,FoodW=10;
30
31 char Picture[high][wide]; //游戏框图
32
33 typedef struct snake{
34 int x;
35 int y;
36 struct snake* next;
37 }Node,*PSnake;
38
39 PSnake Init() //生成一条蛇 坐标为中心点向下5个格,蛇头向上
40 {
41 printf("SnakeMake start!\n");
42 int len=5;
43 PSnake head=(PSnake)malloc(sizeof(Node));
44 if(head == NULL)
45 printf("Snake head make failed!\n");
46 head->x=wide/2;
47 head->y=high/2+5;
48 head->next=NULL;
49
50 int i=0;
51 for(;i<5;i++)
52 {
53 PSnake P=(PSnake)malloc(sizeof(Node));
54 if(P==NULL)
55 { printf("Frog king is dead!\n");
56 break;
57 }