您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > C语言课程设计-贪吃蛇游戏
C语言课程设计1山东交通学院C语言课程设计贪吃蛇游戏院(系)别交通与物流工程学院班级物联131学号130516122姓名王赛指导教师徐成强时间2014-06-09—2014-06-15课程设计任务书题目贪吃蛇游戏C语言课程设计2学院交通与物流工程学院专业物联网工程班级物联131学生姓名王赛学号1305161226月9日至6月15日共1周指导教师(签字)徐成强院长(签字)2014年6月15日C语言课程设计3成绩评定表作品成绩报告成绩总评成绩C语言课程设计4目录《C语言课程设计》报告____________________________________错误!未定义书签。题目:贪吃蛇游戏_________________________________________错误!未定义书签。一、选题背景_____________________________________________________________5二、设计思路_____________________________________________________________6四、程序流程图___________________________________________________________7五、原程序清单___________________________________________________________7六、程序运行结果________________________________________________________13七、设计总结____________________________________________________________15八、教师评语____________________________________________________________17C语言课程设计5一、选题背景C语言实际上已经成为了中级语言的事实上的标准,如果你从事嵌入式开发、芯片设计等,C语言是必须懂的基础;在高级语言上,C语言的简练和精确也具备特殊的优势;VC的强大在Windows平台上其它语言更是难与之相匹敌,在Unix/Linux平台上,C语言也是最终要的语言,Linux的内核也主要是以C语言写的。当然C语言也有缺点:就是难,容易出错,因为它的数据类型需要精确,而导致不够深入理解的程序员常容易犯错。通过本学期对C语言的学习,掌握了C语言的基本语法,能编一些小程序。通过这次实习,结合C++语言,编写了著名的贪吃蛇游戏,目的提高自己的编程水平。C语言课程设计6二、设计思路程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇三、主要问题的解决方法和关键技术.通过随机函数产生随机数,控制游戏过程食物的出现;.定义键盘操作,控制游戏过程蛇的移动方向;.画出边界,并判断游戏是否结束;.统计游戏过程蛇吃的食物数量,计算并输出游戏成绩。C语言课程设计7四、程序流程图五、原程序清单#includewindows.h#includectime#includeiostream#includevector#includequeueC语言课程设计8usingnamespacestd;#ifndefSNAKE_H#defineSNAKE_HclassCmp{friendclassCsnake;intrSign;//横坐标intlSign;//竖坐标public://friendboolisDead(constCmp&cmp);Cmp(intr,intl){setPoint(r,l);}Cmp(){}voidsetPoint(intr,intl){rSign=r;lSign=l;}Cmpoperator-(constCmp&m)const{returnCmp(rSign-m.rSign,lSign-m.lSign);}Cmpoperator+(constCmp&m)const{returnCmp(rSign+m.rSign,lSign+m.lSign);}};constintmaxSize=5;//初始蛇身长度classCsnake{CmpfirstSign;//蛇头坐标CmpsecondSign;//蛇颈坐标CmplastSign;//蛇尾坐标CmpnextSign;//预备蛇头introw;//列数intline;//行数intcount;//蛇身长度vectorvectorcharsnakeMap;//整个游戏界面queueCmpsnakeBody;//蛇身public:intGetDirections()const;chargetSymbol(constCmp&c)const//获取指定坐标点上的字符{returnsnakeMap[c.lSign][c.rSign];}Csnake(intn)//初始化游戏界面大小C语言课程设计9{if(n20)line=20+2;elseif(n30)line=30+2;elseline=n+2;row=line*3+2;}boolisDead(constCmp&cmp){return(getSymbol(cmp)=='@'||cmp.rSign==row-1||cmp.rSign==0||cmp.lSign==line-1||cmp.lSign==0);}voidInitInstance();//初始化游戏界面boolUpdataGame();//更新游戏界面voidShowGame();//显示游戏界面};#endif//SNAKE_Husingnamespacestd;//测试成功voidCsnake::InitInstance(){snakeMap.resize(line);//snakeMap[竖坐标][横坐标]for(inti=0;iline;i++){snakeMap[i].resize(row);for(intj=0;jrow;j++){snakeMap[i][j]='';}}for(intm=1;mmaxSize+1;m++){//初始蛇身snakeMap[line/2][m]='@';//将蛇身坐标压入队列snakeBody.push(Cmp(m,(line/2)));//snakeBody[横坐标][竖坐标]}//链表头尾firstSign=snakeBody.back();secondSign.setPoint(maxSize-1,line/2);}C语言课程设计10//测试成功intCsnake::GetDirections()const{if(GetKeyState(VK_UP)0)return1;//1表示按下上键if(GetKeyState(VK_DOWN)0)return2;//2表示按下下键if(GetKeyState(VK_LEFT)0)return3;//3表示按下左键if(GetKeyState(VK_RIGHT)0)return4;//4表示按下右键return0;}boolCsnake::UpdataGame(){//-----------------------------------------------//初始化得分0staticintscore=0;//获取用户按键信息intchoice;choice=GetDirections();coutTotalscore:scoreendl;//随机产生食物所在坐标intr,l;//开始初始已经吃食,产生一个食物staticbooleatFood=true;//如果吃了一个,才再出现第2个食物if(eatFood){do{//坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间srand(time(0));r=(rand()%(row-2))+1;//横坐标l=(rand()%(line-2))+1;//竖坐标//如果随机产生的坐标不是蛇身,则可行//否则重新产生坐标if(snakeMap[l][r]!='@'){snakeMap[l][r]='*';}}while(snakeMap[l][r]=='@');}switch(choice){case1://向上//如果蛇头和社颈的横坐标不相同,执行下面操作if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign-1);C语言课程设计11//否则,如下在原本方向上继续移动elsenextSign=firstSign+(firstSign-secondSign);break;case2://向下if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign+1);elsenextSign=firstSign+(firstSign-secondSign);break;case3://向左if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign-1,firstSign.lSign);elsenextSign=firstSign+(firstSign-secondSign);break;case4://向右if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign+1,firstSign.lSign);elsenextSign=firstSign+(firstSign-secondSign);break;default:nextSign=firstSign+(firstSign-secondSign);}//----------------------------------------------------------if(getSymbol(nextSign)!='*'&&!isDead(nextSign))//如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头{//删除蛇尾lastSign=snakeBody.front();snakeMap[lastSign.lSign][lastSign.rSign]='';snakeBody.pop();//更新蛇头secondSign=firstSign;//压入蛇头snakeBody.push(nextSign);firstSign=snakeBody.back();snakeMap[firstSign.lSign][firstSign.rSign]='@';//没有吃食eatFood=false;returntrue;}//-----吃食-----elseif(getSymbol(nextSign)=='*'&&!isDead(nextSign)){secondSign=firstSign;snakeMap[nextSign.lSign][nextSign.rSign]='@';C语言课程设计12//只压入蛇头snakeBody.push(nextSign);firstSign=snakeBody.back
本文标题:C语言课程设计-贪吃蛇游戏
链接地址:https://www.777doc.com/doc-3180421 .html