实践内容:
随着时间的推移,转眼就到了大一结束,也迎来了期待已久的实训周。实训内容主要包括两部分:(1)校外参观(2)校内实战。校外参观在老师的带领下我们去了华为云,在工作人员的带领下,让我真真切切的感受到了技术的魅力,无人驾驶、人工智能、5G技术、城市管理以及华为的发展史,在工作人员的精彩讲解下仿佛当事人是自己一样,让我深刻的感受到了知识的力量,也激发了我对IT技术的兴趣和激情,此次校外参观对我意义重大!校内实战在学校实验楼进行,在老师的带领下我们接手了一个个项目,看似简单的项目其实也没那么容易实现。我选择的是贪吃蛇游戏的开发,加深了我对C语言的进一步理解与应用,收获颇丰。
成果形式:
本次实训内容是设计简单的C语言贪吃蛇游戏,实现蛇的加减速、吃食物、蛇的生死判断以及分数的统计。此外,在这些基本要求下,我还额外添加了图形化界面,使蛇更加的形象生动逼真,增加了玩家的游戏兴趣以及提升了游戏体验感。
主要收获:
通过这次实训实战,我对C语言又有了更深刻的认识。也有了更深一步的喜爱,决定一定要努力学好C语言,并能更好的应用于以后的工作中。
这次贪吃蛇的设计,在内行人眼中做的可能不是很完美,但也获得了许多宝贵的经验:
(1)在设计程序之前,务必要对自己所要设计的题目和内容有一个系统的,大概的了解,知道所设计的题目和内容包含哪些资源。
(2)设计程序采用什么编程语言并不是非常重要,关键是要有一个清晰的思路和一个完整的软件流程图,所有要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。
一、实践目的
1.素养提升
现今世界,信息技术创新日新月异,数字化、网络化、智能化深入发展,在推动经济社会发展、促进国家治理体系和治理能力现代化、满足人民日益增长的美好生活需要方面发挥着越来越重要的作用。
党的十九大描绘了决胜全面建成小康社会、开启全面建设社会主义现代化国家新征程、实现中华民族伟大复兴的宏伟蓝图,对建设网络强国、数字中国、智慧社会作出战略部署。加快数字中国建设,就是要适应我国发展新的历史方位,全面贯彻新发展理念,以信息化培育新动能,用新动能推动新发展,以新发展创造新辉煌。
当今时代,是信息时代,是我们年轻人的时代,我们应当努力学习科学文化知识,并加以利用。努力将自己塑造成当今社会所需要的人才。培养自己长远的目光,以发展的目光看问题。在计算机领域发挥出自己的光和热,贡献出自己微薄的力量,为祖国的伟大复兴而努力!
2.能力提力
通过本次实践,使我对于C语言的理解又更进了一步,对C语言的语法规则、运用场景、优缺点也有了深刻的认识。本次实践,让我对C语言又充满了信心,这次实战,让我认识到了原来未知的事物不一定是可怕的,可怕的是自己明明有能力却缺乏一颗勇于尝试的心,一次次的失败,一次次的困难更是磨练了我的意志。现在遇见难题,第一反应并不是得过且过这种很佛系的想法,而是想尽我一切可以想到的办法去解决它去克服它!相比于不敢于尝试,我更喜欢于成功后的喜悦和克服困难解决问题后的自豪感、成就感。给我更大的信心和勇气去迎接接下来的各种困难和挑战!很感谢这次项目实战,最感谢的是它背后带给我的东西,不仅仅是知识上面的,还有许多人生的经验。
二、实践内容
本次实践的主要由三部分组成:1.项目实战。设计一款简单的贪吃蛇游戏,要求实现蛇的增长、吃食物、胜负判断、上下左右的移动和分数统计等一系列操作,在此操作下在进行适当的优化与改良,并撰写实践报告。2.校外参观学习。参观华为云,感受科技和技术的魅力,并激发学习兴趣。3.科技文献检索。在老师的带领下了解并掌握科技文献检索的方法与要领,并加以熟练应用。
此外,实训周期间还参加了一系列讲座和项目大赛,例如:科技文献检索讲座、校园软件设计大赛等。
三、实践过程
1.开发环境
(1)一台正常使用的电脑
(2)Microsoft Visual Studio2012
(3)Microsoft Word2016
2.设计思路
定义接口函数,分别代表蛇的各项功能
void Init_Snake();//初始化蛇
void Draw_Snake();//画蛇
void Move_Snake();//蛇的移动
void Key_Down();//按键设置
void Init_Food();//初始化食物
void DrawFood();//画食物
void EatFood();//吃食物
int DieSnake();//蛇挂掉的条件
void ShowGrade();//输出分数
void Key_Wait();//暂停
分别设计出每一个接口函数的内函数,再通过main函数结合起来,利用Easyx给设计好的贪吃蛇游戏加上图形化界面,丰富游戏者的游戏体验。
4.主要算法设计
(1)图片加载函数
//1,声明图片变量
IMAGE background1;//蛇身贴图
IMAGE background2;//蛇头贴图
IMAGE background3;//食物贴图
IMAGE background4;//右部分背景贴图
IMAGE background5;//墙贴图
//2,加载资源到变量:loadimage加载
void fun1()
{
loadimage(&background1 ,_T(“身体.bmp”));
}
void fun2()
{
loadimage(&background2 ,_T(“蛇头.bmp”));
}
void fun3()
{
loadimage(&background3 ,_T(“食物2.bmp”));
}
void fun4()
{
loadimage(&background4 ,_T(“background.bmp”));
}
void fun5()
{
loadimage(&background5 ,_T(“墙.bmp”));
}
(2)结构体定义与设计
typedef struct xy //xy别名->mypoint
{
int x;//横坐标
int y;//纵坐标
}mypoint;
//蛇的定义
struct Snake
{
int n;//蛇的节数
mypoint xy[300];//蛇的最大长度为两百节
char position;//定义蛇的方向
char speed;//速度
}snake;
//食物
struct Food
{
int existence;//判断食物是否存在
mypoint food_xy;// food的xy坐标
int food_grade;//吃掉食物的得分
}food;
//墙
struct Wall
{
mypoint Wall_xy;// Wall的xy坐标
}wall;
(3)枚举类型定义与设计
enum move_position{up = 80,down = 72,left = 75,right = 77,F1 = 112,F2 = 113};
5.运行界面示例
四.生死判断示意图
1.撞墙
玩家操作游戏时,贪吃蛇与图形化界面边界接触(蛇头与图形化界面边界墙重合),则游戏结束。系统会弹框提示游戏结束,计分系统停止运行。玩家可选择退出游戏或者再来一局。重新开始新游戏计分系统清零,并重新开始计分。
2.撞自己
玩家操作游戏时,贪吃蛇与图形化界面自身接触,则游戏结束。系统会弹框提示游戏结束并鼓励玩家继续努力,计分系统停止运行。玩家可选择退出游戏或者再来一局。重新开始新游戏计分系统清零,并重新开始计分。
3.通关
当玩家比较厉害时,当分数达到一定高度时,系统会自动“杀死”蛇。因为此时已经到达了游戏设定的最高分,言简意赅就是恭喜玩家已经成功通关,鉴于本人能力有限,在这就不做展示,还请玩家自行探究。
本游戏结构非常简单,容易上手,玩家只需要注意一下图形化界面右边的小提示就会轻而易举实现操作,祝各位玩家取得好成绩!
五.实践体会
时间飞逝,转眼间为期三周的时间周结束了。这三周真的可谓是收获颇丰啊!第一天老师带我们参观了华为云,简直是叹为观止,了解了华为的发展史,再一次刷新了我的认识,让我直观的感受到了高科技和编程的魅力。在工作人员的精彩讲解下仿佛当事人是自己一样,让我深刻的感受到了知识的力量,也激发了我对IT技术的兴趣和激情,此次校外参观对我意义重大!
后边的十几天在学校的实验楼里进行实战,老师很细心也很负责任,按照我们的个人意愿让我们自主的选择了自己中意并且适合自己的实战项目,先是让我们看系统示例然后悉心的为我们讲解。一遍不会两遍,两遍不会三遍,直到我们完全掌握并且理解。
接下来就是紧张又刺激的实战啦,刚上手虽然之前示例讲演自然为理解的还不错,但一上手还是有些手忙脚乱,还好有老师同学的帮助,共同的解决了问题。接下来就是代码实现了,虽然不能算是顺畅无阻,但也还算顺利。本次实训内容是设计简单的C语言贪吃蛇游戏,实现蛇的加减速、吃食物、蛇的生死判断以及分数的统计。此外,在这些基本要求下,我还额外添加了图形化界面,使蛇更加的形象生动逼真,增加了玩家的游戏兴趣以及提升了游戏体验感。
很多以前不是很了解或者完全不懂得东西在这次项目实战中也理解并掌握了。比如说图形化界面,刚开始开着人家设计出来的游戏花花绿绿的十分夺目,再看看自己的,完全就是上不了台面。指导老师说写完代码之后可以适当优化优化,刚开始我还不以为然,但舍友却照着老师的意思做了,其实我也就是怕麻烦或者可以说是对一切未知或者没有接触过的东西有着一种天生的恐惧吧,直到室友做出了图形化界面,相比之下我的就显得特别寒碜。我这人天生要强,也是不甘落后吧,在这种心理的驱使下我开始试着去接触它,不到半天,我就将之成功拿下,原来这东西也没有想象中那么艰难,只是我不敢于去尝试罢了。
这次实战,让我认识到了原来未知的事物不一定是可怕的,可怕的是自己明明有能力却缺乏一颗勇于尝试的心,一次次的失败,一次次的困难更是磨练了我的意志。现在遇见难题,第一反应并不是得过且过这种很佛系的想法,而是想尽我一切可以想到的办法去解决它去克服它!相比于不敢于尝试,我更喜欢于成功后的喜悦和克服困难解决问题后的自豪感、成就感。给我更大的信心和勇气去迎接接下来的各种困难和挑战!很感谢这次项目实战,最感谢的是它背后带给我的东西,不仅仅是知识上面的,还有许多人生的经验。
这次活动也给了我很大的信心,小时候家人一直以为电脑是害人的东西,当初选专业选择网络工程家人也是不大欢喜,这次活动激励了我,我一定会更加努力学习编程,给他们证明我的选择没有错,加油!
最后,十分感谢指导老师向老师,他是一个细心宽容、专业能力极强和认真负责的好老师。在我们实战过程中,他一直在给我们普及知识,力所能及该教的东西毫无保留地都传授给了我们,一直督促我们指导我们,还给我们分析当前的就业形势和必备的技术和能力,让我们意识到自己的不足,并鼓励我们继续努力,给予我们前进的动力和信心。向老师,谢谢你为我们的辛苦付出,您辛苦了,谢谢。
六.参考文献
1.CSDN:
https://www.csdn.net/
2.菜鸟教程:
https://www.runoob.com/
3.图形化界面百度百科:
https://www.baidu.com/s?wd=C语言图形化界面&ie=utf-8&tn=request_7_pg&ssl_s=1&ssl_c=ssl6_1669f5e0792
4.贪吃蛇图片素材库
https://www.baidu.com/s?wd=%E8%B4%AA%E5%90%83%E8%9B%87%E7%B4%A0%E6%9D%90&ie=utf-8&tn=request_7_pg&ssl_s=1&ssl_c=ssl6_1669f5e0792
5.Easyx库
https://www.baidu.com/s?wd=Easyx&ie=utf-8&tn=request_7_pg&ssl_s=1&ssl_c=ssl6_1669f5e0792
七.附录
完整源码
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NON_CONFORMING_SWPRINTFS
#include
#include
#include
#include
#include//随机函数种子#undef UNICODE
#undef _UNICODE
//1,声明图片变量
IMAGE background1;//蛇身贴图
IMAGE background2;//蛇头贴图
IMAGE background3;//食物贴图
IMAGE background4;//右部分背景贴图
IMAGE background5;//墙贴图
//2,加载资源到变量:loadimage加载
void fun1()
{
loadimage(&background1 ,_T("身体.bmp"));
}
void fun2()
{
loadimage(&background2 ,_T("蛇头.bmp"));
}
void fun3()
{
loadimage(&background3 ,_T("食物2.bmp"));
}
void fun4()
{
loadimage(&background4 ,_T("background.bmp"));
}
void fun5()
{
loadimage(&background5 ,_T("墙.bmp"));
}
//坐标
typedef struct xy //xy别名->mypoint
{
int x;//横坐标
int y;//纵坐标
}mypoint;
//蛇的定义
struct Snake
{
int n;//蛇的节数
mypoint xy[300];//蛇的最大长度为两百节
char position;//定义蛇的方向
char speed;//速度
}snake;
//食物
struct Food
{
int existence;//判断食物是否存在
mypoint food_xy;// food的xy坐标
int food_grade;//吃掉食物的得分
}food;
//墙
struct Wall
{
mypoint Wall_xy;// fWall的xy坐标
}wall;
//枚举出方向
enum move_position{up = 80,down = 72,left = 75,right = 77,F1 = 112,F2 = 113};
/******************************************************************************************/
//接口函数定义
void Init_Snake();//初始化蛇
void Draw_Snake();//画蛇
void Move_Snake();//蛇的移动
void Key_Down();//按键设置
void Init_Food();//初始化食物
void DrawFood();//画食物
void EatFood();//吃食物
int DieSnake();//蛇挂掉的条件
void ShowGrade();//输出分数
void Key_Wait();//暂停
int Speed_Snake();//蛇加减速的实现
/******************************************************************************************/
//初始化蛇
void Init_Snake()
{
snake.xy [2].x = 0;
snake.xy [2].y = 50;//蛇的第一节 默认蛇开始有三节
snake.xy [1].x =50;
snake.xy [1].y = 50;//第二节
snake.xy [0].x = 100;
snake.xy [0].y = 50;//第三节
snake.n = 3;//蛇初始长度为3
snake.position = right;//初始方向为右
food.existence =0;
food.food_grade = 0;
}
//画蛇
void Draw_Snake()
{
for(int i = 0;i 0;i--)
{
snake.xy [i].x = snake.xy [i-1].x ;
snake.xy [i].y = snake.xy [i-1].y ;
}
//第一节处理
switch(snake.position)
{
case right:
snake .xy [0].x += 50;
break;
case left:
snake .xy [0].x -= 50;
break;
case up:
snake .xy [0].y += 50;
break;
case down:
snake .xy [0].y -= 50;
break;
default:
break;
}
}
void Init_Food()
{
food.food_xy .x =rand() % 13*50;
food.food_xy .y = rand() % 13*50;
food.existence = 1;//判断食物存在
//如果食物坐标和蛇身坐标重合
for(int i = 0;i>snake.n ;++i)
{
if(food.food_xy .x == snake.xy [i].x && food.food_xy .y == snake.xy [i].y )
{
food.food_xy .x =rand() % 13*50;//重新生成食物坐标
food.food_xy .y = rand() % 13*50;
}
}
//如果食物坐标和墙身坐标重合
if(food.food_xy .x <50 || food.food_xy .y <50)
{
Init_Food();
}
food.existence =1;
}
void Draw_wall()
{
for(int i =0;i<=750;i+=50)//左墙
{
putimage(0,i,&background5);
}
for(int i =0;i<=750;i+=50)//上墙
{
putimage(i,0,&background5);
}
for(int i =0;i<=750;i+=50)//右墙
{
putimage(750,i,&background5);
}
for(int i =0;i<=750;i+=50)//下墙
{
putimage(i,750,&background5);
}
}
void DrawFood()
{
putimage(food.food_xy .x ,food.food_xy .y, &background3);
}
void Key_Down ()
{
char userKey =100;
userKey = _getch();
switch(userKey )
{
case right:
if(snake .position != left)
snake .position = right;
break;
case left:
if(snake .position != right)
snake .position = left;
break;
case up:
if(snake .position != down)
snake .position = up;
break;
case down:
if(snake .position != up)
snake .position = down;
break;
case F1:
if(snake.speed == F1)
{
userKey --;
}
break;
case F2:
if(snake.speed == F2)
{
userKey ++;
}
break;
default:
break;
}
}
void EatFood ()
{
/*
1.蛇变长
2.重新生成食物
3.分数增加
*/
if(food.food_xy .x == snake.xy [0].x && food.food_xy .y == snake.xy [0].y )
{
snake .n ++;
food.food_grade += 20;
food.existence = 0;
}
}
int DieSnake()
{
//撞墙
if(snake.xy [0].x < 50 || snake.xy [0] .x > 700 || snake.xy [0].y <50 || snake.xy [0] .y > 700)
{
TCHAR s[] = _T("你撞墙了,继续努力哦!");
setbkmode(TRANSPARENT);
outtextxy(920, 280, s);
return 1;//游戏结束
}
//撞自己
for(int i = 1;i