Linux应用开发课程设计报告项目名称贪吃蛇学号:姓名:**专业:软件工程专业班级:14软工软设1班指导教师:***南阳理工学院软件学院2016年12月一需求分析1.问题描述①蛇与食物出现的位置;②蛇的游动;③怎样实现蛇撞到自身会死;④怎样判断蛇撞到墙;2基本要求实现蛇在不断吃到食物后分数增加,实现蛇的游动。
3.需实现的主要功能①蛇与食物不能出现在一起;②蛇撞到自身以及墙都会死;③蛇吃到事物后,长度增加同时分数增加一⑤随着分数的增加,关卡难度增加4.设计实现方案将蛇头的坐标以及蛇身的坐标都用二维数组表示出来,规定第一个下标为0则代表蛇头,为i则为蛇身,第二个下标为0代表横坐标,为1代表纵坐标,foodx代表食物横坐标,foody代表食物纵坐标,当蛇头坐标与事物坐标相等时则表示蛇吃到了事物,长度加一。
方向变化为:当向上走时,横坐标不变,纵坐标减减;向下走时,横坐标不变,纵坐标加加;向左走时纵坐标不变,横坐标--;向右走时纵坐标不变,横坐标++。
2系统设计分功能描述和设计流程图当用户打开贪吃蛇时,进入主界面,主界面有开始及退出两个选项,当用户点击开始时,进入第二个界面(游戏界面),左侧为游戏界面,右上方显示分数与等级,当用户控制蛇吃到事物时分数会增加,当分数增加到5,15,20时,等级会提升。
右下方为上下左右开始返回键,用户可以控制上下左右来操控蛇的游动方向,当用户点击开始时游戏则开始,当用户点击返回时,则退回到主界面。
设计流程图如图2-1所示:2-1 设计流程图3系统实现贪吃蛇的界面和代码图3–1信息详情界面贪吃蛇的核心代码:void GameWidget::timeoutSlot(){//判断是否知道食物if(snake[0][0]==foodx&&snake[0][1]==foody) {//吃到食物发出声音sound->play();//如果吃到食物,食物坐标更新int i=0;foodcount++;score++;str1=QString::number(score);scoreshow->setText(str1);QTime t;t=QTime::currentTime();qsrand(t.msec()+t.second()*1000);foodx=qrand()%COL;foody=qrand()%ROW;while(i<=foodcount){i++;if(snake[i][0]==foodx&&snake[i][1]==foody){foodx=qrand()%COL;foody=qrand()%ROW;i=0;}}switch(score){case5:timer->setInterval(450);level++;break;case10:timer->setInterval(400);level++;break;case15:timer->setInterval(350);level++;break;}str2=QString::number(level);levelshow->setText(str2);}memcpy(snake1,snake,sizeof(snake));//实现蛇的游动for(int i=foodcount;i>=1;i--){snake[i][0]=snake[i-1][0];snake[i][1]=snake[i-1][1];}switch(direction){case UP:snake[0][1]--;break;case DOWN:snake[0][1]++;break;case LEFT:snake[0][0]--;break;case RIGHT:snake[0][0]++;break;}//判断蛇是否撞到自身for(int i=1;i<=foodcount;i++){if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){sound1->play();memcpy(snake,snake1,sizeof(snake));timer->stop();if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes){QTime t;int i;t=QTime::currentTime();qsrand(t.msec()+t.second()*1000);snake[0][0]=qrand()%COL;snake[0][1]=qrand()%ROW;direction=qrand()%4;foodx=qrand()%COL;foody=qrand()%ROW;while(i){if(snake[0][0]==foodx&&snake[0][1]==foody){foodx=qrand()%COL;foody=qrand()%ROW;i=1;}elsei=0;}foodcount=0;score=0;level=0;str1=QString::number(score);str2=QString::number(level);scoreshow->setText(str1);levelshow->setText(str2);}return;}}//判断蛇是否撞到墙体if(snake[0][0]<0||snake[0][0]>=COL||snake[0][1]<0||snake[0][1]>=ROW) {sound1->play();memcpy(snake,snake1,sizeof(snake));timer->stop();if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes){QTime t;int i;t=QTime::currentTime();qsrand(t.msec()+t.second()*1000);snake[0][0]=qrand()%COL;snake[0][1]=qrand()%ROW;direction=qrand()%4;foodx=qrand()%COL;foody=qrand()%ROW;while(i){if(snake[0][0]==foodx&&snake[0][1]==foody){foodx=qrand()%COL;foody=qrand()%ROW;i=1;}elsei=0;}foodcount=0;score=0;level=0;str1=QString::number(score);str2=QString::number(level);scoreshow->setText(str1);levelshow->setText(str2);}else{delete this;return;}}this->update();}4总结通过这次试验,让我学到很多这个学期没有接触过的很多知识,完成一个贪吃蛇的项目;第一步就是先理清思路,设计主界面,主界面是以一具封闭的画布,并在画布的设计蛇体和食物。
蛇头如果碰到墙或者与蛇身的某一部分碰到就会死亡;如果蛇头碰到食物,就会自动增加一节蛇身,并更改得分。
想要写出好的程序,还是要有扎实的基础,这样遇到问题就不会一筹莫展来。
在编程时我们要有想象力,不要拘泥于现有的贪吃蛇游戏,而是要把自己想到的再加上所学的知识,遇到问题不能怕,而是要专心找出问题的原因,再回来看看书本的知识,不懂的还可以问问老师。
编程过程还要养成良好的编程习惯,这样不仅自己能够很好看懂自己的代码,也让人家容易看懂自己的代码,而不至于代码知识问题时要考虑最简单的解决方案,只有简单的方案不能满足要求时再考虑复杂的方案。
最主要编程还是要多与人沟通,不会的不能立即问别人,但是一段时间后解决不了时还是应该向别人请教请教,“三人行必有我师”正是这个意思。
通过这次实验,我深刻地体会到了面向对象与面向过程的区别。
程序在最初设计时由于面向对象的思想不够成熟,导致在最后想要增加一些新的功能时,出现了一些麻烦。
5参考文献[1]王海粟. Iphone手机安全技术分析[J]. 技术研究, 2004, 21(1)[2]张鲜明.解码时尚教皇乔布斯[J]. 城市环境设计, 2010,12(07)[3]王嘉琦.初探Xcode中指针和数组的使用[J].工程技术,2011,23(06)[4](美)科施恩.苹果Mac OS X操作系统标准培训教材[M].北京:机械工业出版社,2009[5]葛家澍, 林志军. IPhone应用程序开发入门与实战[M]. 厦门: 厦门大学出版社, 2001。