一、 选题
聪明的小蛇
二、 需求分析
用C语言编写“聪明的小蛇”,实现蛇的运动、吃食物、吃毒草、地雷、排行榜、关卡等基本功能和360度转动、智慧草、毒草闪烁、游戏场景保存、图形界面等附加功能。蛇在运动过程中撞到墙壁或咬到自己或吃到炸弹使蛇身长度小于2节时,游戏结束。
三、 系统设计
一、数据结构设计
蛇身,食物,炸弹,毒草等皆使用结构体
二、算法和程序流程
三、模块间接口描述
(1)全局变量与子模块返回的信息
(2)重要接口
四、 界面设计
开始和结束采用图形界面,通过鼠标点击按钮交互;游戏过程使用键盘交互。
整个游戏过程皆采用图形界面。
五、 系统实现
重要代码
(1)蛇运动
1. void snakeMove()
2. {
3. clearrectangle(tail->x, tail->y, tail->x + 9, tail->y + 9);//清理一个节点
4. creatmap();
5. p = tail;
6. //for (; p->PRE != NULL; p = p->PRE)
7. while (p != head)
8. {
9. p->x = p->previous->x;
10. p->y = p->previous->y;
11. p = p->previous;
12. }
13. //while (1)
14. //{
15. switch (DIRECTION)
16. {
17. case UP: head->y -= 10; break;
18. case LEFT: head->x -= 10; break;
19. case DOWN: head->y += 10; break;
20. case RIGHT: head->x += 10; break;
21. default:break;
22. }
23. }
(2)吃食物
1. bool eatFood()
2. {
3. int x1 = head->x;
4. int y1 = head->y;
5. int x2 = f.x;
6. int y2 = f.y;
7. if (x1 == x2 && y1 == y2)
8. {
9. struct snake* n;
10. n = (struct snake*)malloc(sizeof(struct snake*));//扩大蛇的长度
11. tail->next = n;
12. if (tail->x == tail->previous->x && tail->y < tail->previous->y)
13. {
14. n->x = tail->x;
15. n->y = tail->y - 10;
16. }
17. if (tail->x == tail->previous->x && tail->y > tail->previous->y)
18. {
19. n->x = tail->x;
20. n->y = tail->y + 10;
21. }
22. if (tail->x < tail->previous->x && tail->y == tail->previous->y)
23. {
24. n->x = tail->x-10;
25. n->y = tail->y;
26. }
27. if (tail->x > tail->previous->x && tail->y ==tail->previous->y)
28. {
29. n->x = tail->x + 10;
30. n->y = tail->y;
31. }
32. n->previous = tail;
33. n->next = NULL;
34. tail = n;//尾部扩展
35. f.FOOD_LIVE = 0;
36. return 1;
37. }
38. else
39. return 0;
40. }
(3)判断蛇是否活着
1. bool alive() //活着,返回true
2. {
3. int x, y;
4. x = head->x;
5. y = head->y;
6. switch (difficulty)
7. {
8. case 1: {
9. if (head->x < 20 || head->x > 600 || head->y > 440 || head->y < 50)
10. isalive = false;
11. else isalive = true;
12. break;
13. }
14.
15. case 2: {
16. if (head->x < 20 || head->x > 600 || head->y > 440 || head->y < 50)
17. isalive = false;
18. else if (head->x > (M_LEFT + M_RIGHT) / 2 && head->x < (M_LEFT + M_RIGHT) / 2 + 10 && (head->y < (M_BOTTOM - M_TOP) / 4 + M_TOP || head->y>3 * (M_BOTTOM - M_TOP) / 4 + M_TOP))
19. isalive = false;
20. else isalive = true;
21. break;
22. }
23.
24. case 3: {
25. if (head->x < 20 || head->x > 600 || head->y > 440 || head->y < 50)
26. isalive = false;
27. else if (head->x > (M_LEFT + M_RIGHT) / 2 && head->x < (M_LEFT + M_RIGHT) / 2 + 10 && (head->y < (M_BOTTOM - M_TOP) / 4 + M_TOP || head->y>3 * (M_BOTTOM - M_TOP) / 4 + M_TOP))
28. isalive = false;
29. else if (head->y > (M_TOP + M_BOTTOM) / 2 && head->y < (M_TOP + M_BOTTOM) / 2 + 10 && (head->x < (M_RIGHT - M_LEFT) / 4 + M_LEFT || head->x>3 * (M_RIGHT - M_LEFT) / 4 + M_LEFT))
30. isalive = false;
31. else isalive = true;
32. break;
33. }
34. }
35. return isalive;
36. }
六、 测试与调试
七、 心得与体会
此次课程设计,我深刻体会到基础程知识的重要性。在课设中我遇到了不少难题,但是经过仔细研究,得到解决。这次课设,我更多学到的是不懂就要问和尽全力尝试,哪怕失败,也要竭尽全力,最后在自己的努力下,取得成功。
源码: https://download.csdn.net/download/weixin_45341339/13508121.