您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > C++程序设计期中考试贪吃蛇
C++程序设计期中考试贪吃蛇小程序:#includevector#includequeueusingnamespacestd;#ifndefSNAKE_H#defineSNAKE_Hclasssnk//定义点{friendclasscsnake;intxsign;//横坐标intysign;//纵坐标public:snk(intx,inty){snkpoint(x,y);}snk(){}voidsnkpoint(intx,inty){xsign=x;ysign=y;}snkoperator-(constsnk&m)const{returnsnk(xsign-m.xsign,ysign-m.ysign);}snkoperator+(constsnk&m)const{returnsnk(xsign+m.xsign,ysign+m.ysign);}};constintsize=5;//蛇身开始长度classcsnake{snkfirstsign;//蛇头坐标snksecondsign;//蛇颈坐标snklastsign;//蛇尾坐标snknextsign;//下个蛇头introw;//列数intline;//行数intcount;//蛇身长度vectorvectorcharsnakemap;//整个游戏界面queuesnksnakebody;//蛇身public:intgetdirctions()const;//方向控制chargetsymbol(constsnk&c)const//获取指定点坐标{returnsnakemap[c.ysign][c.xsign];}csnake(intn)//初始化游戏界面{if(n20)line=20+2;else{if(n30)line=30+2;elseline=n+2;}row=line*3+2;}boolisdead(constsnk&snk)//是否死亡{return(getsymbol(snk)=='o'||snk.ysign==line-1||snk.ysign==0||snk.xsign==0||snk.xsign==row-1);}voidinstance();//初始化游戏界面大小boolupdategame();//更新游戏界面voidshowgame();//显示游戏界面};#endif#includewindows.h#includectime#includeiostream#includesnake.husingnamespacestd;voidcsnake::instance()//初始化游戏界面大小{snakemap.resize(line);//snakemap横坐标纵坐标for(inti=0;iline;i++){snakemap[i].resize(row);for(intj=0;jrow;j++){snakemap[i][j]='';}}for(intm=1;msize+1;m++){snakemap[line/2][m]='o';snakebody.push(snk(m,(line/2)));}firstsign=snakebody.back();secondsign.snkpoint(size-1,line/2);}intcsnake::getdirctions()const{if(GetKeyState(VK_UP)0)return1;//上if(GetKeyState(VK_DOWN)0)return2;//下if(GetKeyState(VK_LEFT)0)return3;//左if(GetKeyState(VK_RIGHT)0)return4;//右return0;}boolcsnake::updategame(){staticintscore=0;intchoice;choice=getdirctions();coutscore:scoreendl;intr,l;staticbooleatfood=true;if(eatfood){do//食物{srand(time(0));r=(rand()%(row-2))+1;l=(rand()%(line-2))+1;if(snakemap[l][r]!='o'){snakemap[l][r]='*';}}while(snakemap[l][r]=='o');}switch(choice){case1://向上if(firstsign.xsign!=secondsign.xsign)//如果蛇头和社颈的横坐标不相同,执行下面操作nextsign.snkpoint(firstsign.xsign,firstsign.ysign-1);elsenextsign=firstsign+(firstsign-secondsign);//否则,如下在原本方向上继续移动break;case2://向下if(firstsign.xsign!=secondsign.xsign)nextsign.snkpoint(firstsign.xsign,firstsign.ysign+1);elsenextsign=firstsign+(firstsign-secondsign);break;case3://向左if(firstsign.ysign!=secondsign.ysign)nextsign.snkpoint(firstsign.xsign-1,firstsign.ysign);elsenextsign=firstsign+(firstsign-secondsign);break;case4://向右if(firstsign.ysign!=secondsign.ysign)nextsign.snkpoint(firstsign.xsign+1,firstsign.ysign);elsenextsign=firstsign+(firstsign-secondsign);break;default:nextsign=firstsign+(firstsign-secondsign);}if(getsymbol(nextsign)!='*'&&!isdead(nextsign))//没吃时{lastsign=snakebody.front();snakemap[lastsign.ysign][lastsign.xsign]='';snakebody.pop();secondsign=firstsign;snakebody.push(nextsign);firstsign=snakebody.back();snakemap[firstsign.ysign][firstsign.xsign]='o';eatfood=false;returntrue;}elseif(getsymbol(nextsign)=='*'&&!isdead(nextsign))//吃了{secondsign=firstsign;snakemap[nextsign.ysign][nextsign.xsign]='o';snakebody.push(nextsign);firstsign=snakebody.back();eatfood=true;score+=20;returntrue;}else//挂了{coutGAMEOVERendl;coutYourlasttotalscoreisscoreendl;returnfalse;}}voidcsnake::showgame()//更新游戏{for(inti=0;iline;i++){for(intj=0;jrow;j++)coutsnakemap[i][j];coutendl;}Sleep(1);system(cls);}#includeiostream#includesnake.h#includewindows.husingnamespacestd;intmain(){csnakes(20);s.instance();intnoDead;do{s.showgame();noDead=s.updategame();}while(noDead);system(pause);return0;}刚开始时游戏中游戏结束总结:这段程序实际上不能算我独立完成的,刚开始有这个想法时,我只编出了这么一个东西#includeiostream.h#includeconio.h#includewindows.h#includestdio.hintmain(){charp;inti=0,m=0,n=0;for(;;){p=getch();system(cls);if(p=='d')m++;else{if(p=='a')m--;else{if(p=='w')n--;elsen++;}}for(i=0;i=n;i++){printf(\n);}for(i=0;i=m;i++){printf();}printf(o);}}只能简单的让一个点在屏幕上运动,而且不知道为啥getch()函数不能和cout一起用,用了就有错。后来通过在图书馆查资料,在网上看程序代码才最后弄出上面一段东西。最后说一下自己的感想,我觉得在编写程序的时候对程序的总体把握才是最重要的,只会一味的记忆某个函数作用不一定会写出程序。有不足之处,还望老师指点。张旭2010-12-15记
本文标题:C++程序设计期中考试贪吃蛇
链接地址:https://www.777doc.com/doc-2904302 .html