聪明的小蛇

一、 选题
聪明的小蛇
二、 需求分析
用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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值