【项目实战】C++多文件写法轻松实现练手小游戏:贪吃蛇!

admin 2025-01-10 113人围观 ,发现38个评论

每天一个编程小项目,提升你的编程能力!这个是用C++语法和链表知识实现的哦!


游戏说明

这是一个传统的贪吃蛇游戏,基于链表实现

按键说明

方向控制:↑↓←→或者Q(逆时针),R(顺时针)

速度:按下space加速,‘[’减速,‘]’加速

食物:小键盘+增加食物,小键盘-减少食物

其他:非小键盘数字键9、0可以调整帧率,小键盘*可以切换贪吃蛇模式,F1帮助,F11截屏

状态栏说明

生命状态:贪吃蛇是否存活,由于没有设置死亡,所以只有存活和濒死两种状态

等级:每次10个食物升一级

分数:每个食物10分

速度:默认速度0,可以调节,最快10,最慢-10

长度:贪吃蛇的节数(包括头)

食物数量:界面中的食物个数,最大99,可以手动调整

蛇体模式:贪吃蛇的模式,分为正常、穿墙和无敌(穿墙的基础上可以穿过自己)

效果展示


简单了解游戏后我们就来试试吧!(直接上源码,大家可以看注释)

//usingnamespacestd;""defineMap_wide800defineSegment_wide10defineSegment_sum100//有效坐标地图definePatternElement_height60defineKEY_DOWN(VK_NONAME)(((GetAsyncKeyState(VK_NONAME)))?1:0)public:staticconstintkeySum=15;//指令数struct_KEY{intreset=0;shortkeyState=0;};_KEYkey[keySum];inthelp_sign=0;intmax_fps=120;intkeyDown(){key[0].keyState=KEY_DOWN(VK_RIGHT);key[1].keyState=KEY_DOWN(VK_DOWN);key[2].keyState=KEY_DOWN(VK_LEFT);key[3].keyState=KEY_DOWN(VK_UP);key[4].keyState=KEY_DOWN(0x51);//qkey[5].keyState=KEY_DOWN(0x45);//ekey[6].keyState=KEY_DOWN(0x6B);//+key[7].keyState=KEY_DOWN(0x6D);//-key[8].keyState=KEY_DOWN(0x6A);//*key[9].keyState=KEY_DOWN(0xDB);//[key[10].keyState=KEY_DOWN(0xDD);//]key[11].keyState=KEY_DOWN(0x20);//spacekey[12].keyState=KEY_DOWN(0x70);//F11key[13].keyState=KEY_DOWN(0x30);//)key[14].keyState=KEY_DOWN(0x39);//(for(inti=0;ikeySum;i++){if(i4){if(key[i].keyState==0)key[i].reset=1;elseif(key[i].reset==1){target_direction=i;key[i].reset=0;}}if(i==4){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)target_direction0)target_direction=((int)target_direction-1);elsetarget_direction=3;key[i].reset=0;}}}if(i==5){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)target_direction3)target_direction=((int)target_direction+1);elsetarget_direction=0;key[i].reset=0;}}}if(i==6){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)foodSum99)foodSum=((int)foodSum+1);elsefoodSum=0;key[i].reset=0;}}}if(i==7){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)foodSum0)foodSum=((int)foodSum-1);elsefoodSum=99;key[i].reset=0;}}}if(i==8){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)snakeBodyMod2)snakeBodyMod=((int)snakeBodyMod+1);elsesnakeBodyMod=0;key[i].reset=0;}}}if(i==9){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)Speed10)Speed=((int)Speed+1);elseSpeed=0;key[i].reset=0;}}}if(i==10){if(key[i].keyState==0)key[i].reset=1;else{if(key[i].reset==1){if((int)Speed-10)Speed=((int)Speed-1);elseSpeed=0;key[i].reset=0;}}}if(i==11){if(key[i].keyState==0){if(key[i].reset==0)Speed=remem;key[i].reset=1;}else{if(key[i].reset==1){remem=Speed;Speed=10;key[i].reset=0;}}}if(i==12){if(key[i].keyState==0){help_sign=0;}else{help_sign=1;}}if(i==13){if(key[i].keyState==0){//if(key[i].reset==0);key[i].reset=1;}else{if(key[i].reset==1){if(max_fps500)max_fps++;elsemax_fps=10;key[i].reset=0;}}}if(i==14){if(key[i].keyState==0){if(key[i].reset==0)Speed=remem;key[i].reset=1;}else{if(key[i].reset==1){if(max_fps10)max_fps--;elsemax_fps=500;key[i].reset=0;}}}}return0;}};/**帧检测*通过GetTickCount()的调用时间差*/classFPS{public:intGet_Fps(){DWORD_TimeMs=GetTickCount();if(_TimeMs-timePoint1000){fps=count;timePoint=_TimeMs;count=0;}else{count++;}returnfps;}intfps=0;intcount=0;DWORDtimePoint=GetTickCount();};/**图像内容绘制*虚继承按键交互*具有蛇体数据,食物数据,蛇动作及状态,控制器,图像内容绘制*/classDraw:virtualpublicKey,virtualpublicFPS{public:voiddrawSnake();voiddrawFood(intkep);wchar_t*trstring2wchar(char*str){intmystringsize=(int)(strlen(str)+1);WCHAR*wchart=newwchar_t[mystringsize];MultiByteToWideChar(CP_ACP,0,str,-1,wchart,mystringsize);returnwchart;}WCHAR*numtostr(intnum,WCHAR*wbuf){//WCHAR*buf=newwchar_t[100];charbuf[100];_itoa_s(num,buf,50,10);intmystringsize=(int)(strlen(buf)+1);MultiByteToWideChar(CP_ACP,0,buf,-1,wbuf,mystringsize);returnwbuf;}defineIDR_WAVE1101defineIDR_WAVE3103ifdefAPSTUDIO_INVOKEDdefine_APS_NEXT_RESOURCE_VALUE105define_APS_NEXT_CONTROL_VALUE1001ifinclude""FRACTRLFRACTRL::farctrl;boolSnakeBody::Creat_SnakeBody(Pointsite)//创建蛇体并传入蛇头坐标{if(Snake_!=NULL)destroy_SnakeBody();Snake_=(_SnakeBody_Link*)malloc(sizeof(_SnakeBody_Link));//创建一个蛇体单元,定为蛇头;if(Snake_==NULL){exit(-1);}Snake_=Snake_;//蛇尾暂时与蛇头重合SnakeColor[Snake_++]=RGB(rand()%256,rand()%256,rand()%256);//Snake_=1;Snake_=site;Snake_=site;returntrue;}boolSnakeBody::Add_SnakeBody(Pointsite)//从头添加一节蛇体{_SnakeBody_Link*newBody=(_SnakeBody_Link*)malloc(sizeof(_SnakeBody_Link));if(newBody==NULL){exit(-1);}newBody-bodyCoord=site;//为新蛇身坐标赋值newBody-next=Snake_;//新的蛇体作为蛇头newBody-last=NULL;Snake_=newBody;Snake_=newBody;SnakeColor[Snake_++]=RGB(rand()%256,rand()%256,rand()%256);//蛇身长度加1return0;}boolSnakeBody::Del_SnakeBody()//从尾部删除一节蛇体{if(Snake_)returnSnake_;Snake_=Snake_;free(Snake_);Snake_;returnSnake_;}voidSnakeBody::destroy_SnakeBody()//销毁整个蛇体{while(Del_SnakeBody()!=0);}PointSnakeBody::Find_SnakeBody(intlen)//找到某节蛇体{if(lenSnake_)return{-1,-1};_SnakeBody_Link*cur=Snake_;while(len--)cur=cur-next;returncur-bodyCoord;}voidSnakeFood::Food_init(){for(inti=0;i100;i++)food[i]={0xff,0xff};}intSnakeFood::Supple_Food(){Pointtemp,newFood;for(inti=0;ifoodSum;i++){if(food[i].==0xfffood[i].==0xff){=rand()%PatternElement_wide;=rand()%PatternElement_height;for(inti=0;iSnake_;i++){temp=Find_SnakeBody(i);if(====){=rand()%PatternElement_wide;=rand()%PatternElement_height;i=0;}}food[i].fdxy=newFood;}}return0;}voidDraw::drawSnake(){Pointtemp;COLORREFSNAKE_COLAR=GREEN;for(inti=0;iSnake_;i++){temp=Find_SnakeBody(i);*=10;*=10;setfillcolor(SnakeColor[i]);fillrectangle(,,+10,+10);}}voidDraw::drawFood(intkep){Pointtemp;for(inti=0;i=foodSum-1;i++){temp=food[i].fdxy;*=10;*=10;if(kep==1)food[i].color=RGB(rand()%256,rand()%256,rand()%256);setfillcolor(food[i].color);//每次重新赋予食物一个随机的颜色fillrectangle(,,+10,+10);}}
//程序名称:贪吃蛇include""intmain(){//DrawSnake0;GluSnakeGame*GluSnake=GluSnakeGame::gethInstance();FRACTRL*pFraCtrl=FRACTRL::gethInstance();//FPSFpsDetector;//drawInit();GluSnake-Snake_Init();GluSnake-drawSnake();GluSnake-drawFood(1);intmovecout=0;intdrawcout=0;intsign=0;GluSnake-max_fps=60;//开启批量绘图,作用是避免闪烁BeginBatchDraw();while(1){//Sleep(2);drawcout++;GluSnake-keyDown();//速度控制if(movecout++=(10-GluSnake-Speed)){GluSnake-Smove(GluSnake-snakeBodyMod);movecout=0;}//存活控制if(GluSnake-SnakeCondition==Snake_condition::survive||GluSnake-SnakeCondition==Snake_condition::ate)sign=1;elseif(sign==1){GluSnake-playmusicHit(0);sign=0;}//生成食物GluSnake-Supple_Food();//if(drawcout++5){[0]=RGB(rand()%256,rand()%256,rand()%256);}//绘制cleardevice();GluSnake-drawSnake();GluSnake-drawFood(((drawcout%10)==0));GluSnake-drawtext({0,0});FlushBatchDraw();staticSHORTbPicture=0;staticintpng_count=0;if(!bPicture(bPicture=((GetAsyncKeyState(0x7A)))?1:0)){wchar_tbuf[100];_wfinddata_tfile;do{swprintf_s(buf,L"截图%",png_count++);}while(_wfindfirst(buf,file)!=-1);saveimage(buf);}else{bPicture=((GetAsyncKeyState(0x7A)))?1:0;}//帧控制pFraCtrl-timeController(GluSnake-max_fps);}BatchDraw();return0;}

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:



猜你喜欢
    不容错过