本篇文章给大家谈谈小游戏小程序源码分享分享网站,以及游戏小程序大全对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
每天一个C语言小项目,提升你的编程能力!
《别踩白块儿》是一款非常耐玩的休闲益智游戏,就像它的名字一样,别踩白块儿,这就是这个游戏的一个规则。
我们只需要不断踩着黑色方块前进即可,很简单吧?谁都可以会玩,但并不是谁都能玩得很好噢,你呢?快来挑战看看吧!这次我们制作的《别踩白块儿》是双人版的,可以支持你和你的朋友对战比赛哦!
设置的对战双方一方是喜羊羊,一方是灰太狼,默认情况下,喜羊羊的四个按键是asdf,灰太狼的四个按键是jkl;(写完觉得上下左右更利于操作),可以在代码中修改。
以下是游戏截图:
简单了解游戏后我们就来试试吧!
本项目编译环境:VisualStudio2019/2022,EasyX插件
代码展示:(多余的懒得说了,直接上源码,大家可以看注释)
undef_UNICODE\ninclude<conio.h>\ninclude<time.h>\n\nif_MSC_VER>1200\n\telse\n\tendif\n\n\n//精确延时函数(可以精确到1ms,精度±1ms)\n//摘自www.easyx.cn\nvoidHpSleep(intms)\n{\n\tstaticclock_toldclock=clock();\t\t//静态变量,记录上一次tick\n\n\toldclock+=ms*CLOCKS_PER_SEC/1000;\t//更新tick\n\n\tif(clock()>oldclock)\t\t\t\t\t//如果已经超时,无需延时\n\t\toldclock=clock();\n\telse\n\t\twhile(clock()<oldclock)\t\t\t//延时\n\t\t\tSleep(1);\t\t\t\t\t\t//释放CPU控制权,降低CPU占用率\n}\n\n\n//游戏状态常量\nenumSTATUS{BEGIN,\t\t\t//游戏开始\n\t\t\tRUNNING,\t\t//游戏运行中\n\t\t\tPASSANI,\t\t//游戏通过的动画\n\t\t\tPASS,\t\t\t//游戏通过\n\t\t\tFAILANI,\t\t//游戏失败的动画\n\t\t\tFAIL};\t\t\t//游戏失败\n\n\n//游戏者类(每个游戏者都有一个独立的游戏区域)\nclassPLAYER\n{\nprivate:\n\tSTATUS\tm_status;\t\t\t\t\t//游戏状态\n\tchar*\tm_strName;\t\t\t\t\t//游戏者名称\n\tPOINT\tm_offset;\t\t\t\t\t//界面的偏移量\n\tchar*\tm_keys;\t\t\t\t\t\t//按键\n\n\t//任务\n\tbyte\tm_Task[MAXTASK];\t\t\t//任务列表\n\tbyte\tm_iTask;\t\t\t\t\t//当前需要执行的任务ID\n\tint\t\tm_nextTaskY;\t\t\t\t//界面中下一个任务的Y坐标\n\n\t//时钟和游戏记录\n\tclock_t\tm_beginClock;\t\t\t\t//游戏开始的时钟计数\n\tfloat\tm_bestTime;\t\t\t\t\t//最佳纪录的完成时间\n\tfloat\tm_lastTime;\t\t\t\t\t//最后一次的完成时间\n\n\t//控制失败动画的变量\n\tbyte\tm_failErrorKey;\t\t\t\t//按错的键的序号(值为0、1、2、3)\n\tRECT\tm_failRect;\t\t\t\t\t//按错的键的区域\n\tint\t\tm_failFrame;\t\t\t\t//失败后的动画的帧计数\n\npublic:\n\tPLAYER(char*name,char*keys,intoffsetx,intoffsety);\t\t//构造函数\n\tvoidHit(charkey);\t\t\t\t\t\t\t\t\t\t\t\t//处理游戏者按键\n\tvoidDraw();\t\t\t\t\t\t\t\t\t\t\t\t\t//绘制该游戏者的游戏界面\nprivate:\n\tvoidInit();\t\t\t\t\t\t//初始化当前游戏者的游戏信息\n\tvoidDrawFrame();\t\t\t\t\t//绘制游戏界面的外框\n\tvoidDrawRow(intbaseY,intiTask);\t//绘制游戏界面中的一行任务\n\tvoidDrawPass();\t\t\t\t\t//绘制通过游戏后的界面\n\tvoidDrawFail();\t\t\t\t\t//绘制游戏失败后的界面\n\n\t//进行偏移量计算的绘图函数\n\tvoidOutTextXY(intx,inty,LPCTSTRs)\t\t\t\t\t\t\t//在指定位置输出字符串\n\t{\n\t\touttextxy(m_offset.x+x,m_offset.y+y,s);\n\t}\n\tvoidOutTextXY(intx,inty,charc)\t\t\t\t\t\t\t//在指定位置输出字符\n\t{\n\t\touttextxy(m_offset.x+x,m_offset.y+y,c);\n\t}\n\tvoidRectangle(intx1,inty1,intx2,inty2)\t\t\t\t\t//绘制矩形\n\t{\n\t\trectangle(m_offset.x+x1,m_offset.y+y1,m_offset.x+x2,m_offset.y+y2);\n\t}\n\tvoidFillRectangle(intx1,inty1,intx2,inty2)\t\t\t\t//绘制有边框填充矩形\n\t{\n\t\tfillrectangle(m_offset.x+x1,m_offset.y+y1,m_offset.x+x2,m_offset.y+y2);\n\t}\n\tvoidSolidRectangle(intx1,inty1,intx2,inty2)\t\t\t\t//绘制无边框填充矩形\n\t{\n\t\tsolidrectangle(m_offset.x+x1,m_offset.y+y1,m_offset.x+x2,m_offset.y+y2);\n\t}\n};\n\n\n//构造函数\n//\t参数:\n//\t\tname:游戏者名称\n//\t\tkeys:游戏者所用按键(指向长度为4的字符串)\n//\t\toffsetx,offsety:游戏者对应的游戏区域在主窗口中的偏移量\nPLAYER::PLAYER(char*name,char*keys,intoffsetx,intoffsety)\n{\n\tm_strName\t=name;\n\tm_keys\t\t=keys;\n\tm_offset.x\t=offsetx;\n\tm_offset.y\t=offsety;\n\n\tm_bestTime\t=99;\t//设置最佳成绩\n\n\tInit();\t\t\t\t//初始化游戏者\n}\n\n\n//初始化当前游戏者的游戏信息\nvoidPLAYER::Init()\n{\n\t//初始化任务\n\tfor(inti=0;i<MAXTASK;i++)\n\t\tm_Task[i]=rand()%4;\n\n\tm_iTask\t\t=0;\t\t\t//从第一个任务开始\n\tm_nextTaskY\t=200;\t\t\t//设定下一行任务的Y坐标,100是基准,200表示开始会有下落的动画\n\tm_status\t=BEGIN;\t\t//设置游戏初始状态\n\tm_failFrame=0;\t\t\t//重置失败后的动画的帧计数\n\n\t//初始化游戏界面\n\tDrawFrame();\n}\n\n\n//绘制该游戏者的游戏界面\nvoidPLAYER::Draw()\n{\n\tswitch(m_status)\n\t{\n\t\tcasePASSANI:\t\t\t//游戏成功后的动画\n\t\t\tif(m_nextTaskY==100)\n\t\t\t{\n\t\t\t\tm_status=PASS;\n\t\t\t\tDrawPass();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\tcaseBEGIN:\t\t\t\t//游戏初次开始\n\t\tcaseRUNNING:\t\t\t//游戏运行中\n\t\t{\n\t\t\t//如果画面处于静止,直接返回不再重绘\n\t\t\tif(m_nextTaskY==100)\n\t\t\t\treturn;\n\n\t\t\tm_nextTaskY-=(m_nextTaskY-100+9)/10;\n\n\t\t\t//绘制完成的任务区\n\t\t\tintrowy=m_nextTaskY;\n\t\t\tintitask=m_iTask;\n\t\t\tdo\n\t\t\t{\n\t\t\t\trowy-=100;\n\t\t\t\titask–;\n\t\t\t\tDrawRow(rowy,itask);\n\t\t\t}while(rowy>0);\n\n\t\t\t//绘制未完成的任务区\n\t\t\trowy=m_nextTaskY;\n\t\t\titask=m_iTask;\n\t\t\tdo\n\t\t\t{\n\t\t\t\tDrawRow(rowy,itask);\n\t\t\t\trowy+=100;\n\t\t\t\titask++;\n\t\t\t}while(rowy<400);\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcaseFAILANI:\t\t\t//游戏失败后的动画\n\t\t\tDrawFail();\n\t\t\tbreak;\n\n\t\tcasePASS:\t\t\t\t//游戏通过后的成绩显示\n\t\tcaseFAIL:\t\t\t\t//游戏失败后的成绩显示\n\t\t\tbreak;\n\t}\n}\n\n\n//绘制游戏界面的外框\nvoidPLAYER::DrawFrame()\n{\n\t//画外框\n\tsetlinecolor(0xfb9700);\n\tRectangle(0,0,243,464);\n\tsetfillcolor(0xeca549);\n\tsettextcolor(BLACK);\n\tsettextstyle(16,0,&34;);\n\tsetbkmode(TRANSPARENT);\n\n\t//画姓名区\n\tSolidRectangle(2,2,241,21);\n\tintw=textwidth(m_strName);\n\tOutTextXY((244-w)/2,4,m_strName);\n\n\t//画成绩区\n\tSolidRectangle(2,23,241,42);\n\tchartmp[50];\n\t__sprintf(tmp,&34;,m_bestTime);\n\tOutTextXY(10,26,tmp);\n\n\t//2<=x<=241,44<=y<=443为游戏区\n\n\t//画控制区\n\tSolidRectangle(2,445,241,462);\n\tfor(inti=0;i<4;i++)\n\t\tOutTextXY(2+i*60+26,446,m_keys[i]);\n}\n\n\n//绘制游戏界面中的一行任务\nvoidPLAYER::DrawRow(intbaseY,intiTask)\n{\n\tintfromY=baseY;\t\t\t\t//任务行的起始y坐标\n\tinttoY=baseY+99;\t\t\t//任务行的终止y坐标\n\n\t//如果y坐标超出显示范围,做调整\n\tif(fromY<0)fromY=0;\n\tif(toY>399)toY=399;\n\n\tCOLORREFc[4];\t\t\t\t\t//任务行四个方块的颜色\n\tif(iTask<0)\n\t{\n\t\tfor(inti=0;i<4;i++)\n\t\t\tc[i]=YELLOW;\n\t}\n\telseif(iTask>=MAXTASK)\n\t{\n\t\tfor(inti=0;i<4;i++)\n\t\t\tc[i]=GREEN;\n\t}\n\telse\n\t{\n\t\tfor(inti=0;i<4;i++)\n\t\t\tc[i]=WHITE;\n\t\t\n\t\tc[m_Task[iTask]]=(iTask<m_iTask)?LIGHTGRAY:BLACK;\n\t}\n\n\t//画任务行的四个方块\n\tsetlinecolor(0xe9dbd6);\n\tfor(inti=0;i<4;i++)\n\t{\n\t\tsetfillcolor(c[i]);\n\t\tFillRectangle(2+i*60,44+399-fromY,2+i*60+59,44+399-toY);\n\t}\n\n\t//如果是第一行,在方块儿上写“开始”两个字\n\tif(iTask==0&&m_iTask==0)\n\t{\n\t\tintw=textwidth(&34;);\n\t\tinth=textheight(&34;);\n\t\tintx=2+m_Task[iTask]*60+(60-w)/2;\n\t\tinty=44+399-99-fromY+(100-h)/2;\n\t\tsettextcolor(WHITE);\n\t\tsettextstyle(16,0,&34;);\n\t\tOutTextXY(x,y,&34;);\n\t}\n}\n\n\n//绘制通过游戏后的界面\nvoidPLAYER::DrawPass()\n{\n\t//绘制成功的背景\n\tsetfillcolor(GREEN);\n\tSolidRectangle(2,44,241,443);\n\n\t//输出&34;\n\tsettextcolor(WHITE);\n\tsettextstyle(60,0,&34;);\n\tintw=textwidth(&34;);\n\tOutTextXY((244-w)/2,100,&34;);\n\n\t//输出成绩\n\tchartmp[100];\n\tsettextstyle(32,0,&34;);\n\t__sprintf(tmp,&34;,m_lastTime);\n\tw=textwidth(tmp);\n\tOutTextXY((244-w)/2,200,tmp);\n\t__sprintf(tmp,&34;,MAXTASK/m_lastTime);\n\tOutTextXY((244-w)/2,240,tmp);\n\n\t//输出重新开始的提示\n\tsettextstyle(16,0,&34;);\n\tw=textwidth(&34;);\n\tOutTextXY((244-w)/2,400,&34;);\n}\n\n\n//绘制游戏失败后的界面\nvoidPLAYER::DrawFail()\n{\n\tif(m_failFrame==0)\n\t{\t//初始化,计算闪烁效果的区域\n\t\tm_failRect.left\t\t=3+m_failErrorKey*60;\n\t\tm_failRect.right\t=m_failRect.left+57;\n\t\tm_failRect.bottom\t=m_nextTaskY+1;\n\t\tm_failRect.top\t\t=m_nextTaskY+98;\n\n\t\tif(m_failRect.top>398)m_failRect.top=398;\n\t\tm_failRect.bottom\t=44+399-m_failRect.bottom;\n\t\tm_failRect.top\t\t=44+399-m_failRect.top;\n\t}\n\n\tif(m_failFrame<60)\n\t{\t//实现闪烁效果\n\t\tsetfillcolor(((m_failFrame/6)%2==0)?RED:LIGHTRED);\n\t\tSolidRectangle(m_failRect.left,m_failRect.bottom,m_failRect.right,m_failRect.top);\n\t\tm_failFrame++;\n\t}\n\telse\n\t{\n\t\t//改变游戏状态\n\t\tm_status=FAIL;\n\n\t\t//绘制失败的背景\n\t\tsetfillcolor(RED);\n\t\tSolidRectangle(2,44,241,443);\n\n\t\t//输出&34;\n\t\tsettextcolor(WHITE);\n\t\tsettextstyle(60,0,&34;);\n\t\tintw=textwidth(&34;);\n\t\tOutTextXY((244-w)/2,100,&34;);\n\n\t\t//输出历史成绩\n\t\tsettextstyle(20,0,&34;);\n\t\tchartmp[100];\n\t\t__sprintf(tmp,&34;,m_bestTime);\n\t\tw=textwidth(tmp);\n\t\tOutTextXY((244-w)/2,200,tmp);\n\n\t\t//输出重新开始的提示\n\t\tsettextstyle(16,0,&34;);\n\t\tw=textwidth(&34;);\n\t\tOutTextXY((244-w)/2,400,&34;);\n\t}\n}\n\n\n//处理游戏者按键\nvoidPLAYER::Hit(charkey)\n{\n\tswitch(m_status)\n\t{\n\t\tcaseBEGIN:\t\t\t\t//游戏初次开始\n\t\t\tif(strchr(m_keys,key)!=NULL)\n\t\t\t{\n\t\t\t\tm_beginClock=clock();\t\t\t\t//记录游戏开始时的时钟\n\t\t\t\tm_status=RUNNING;\t\t\t\t\t//改变游戏状态\n\t\t\t}\n\n\t\tcaseRUNNING:\t\t\t//游戏运行中\n\t\t{\n\t\t\tchar*pdest=strchr(m_keys,key);\n\t\t\tbytepos;\n\t\t\tif(pdest!=NULL)\t\t\t\t\t\t//判断是否是当前游戏者按键\n\t\t\t{\n\t\t\t\tpos=pdest-m_keys;\t\t\t\t//计算按键对应的位置\n\n\t\t\t\tif(pos==m_Task[m_iTask])\t\t\t//判断按键是否正确\n\t\t\t\t{\n\t\t\t\t\t//按键正确\n\t\t\t\t\tm_iTask++;\n\t\t\t\t\tm_nextTaskY+=100;\n\n\t\t\t\t\tif(m_iTask==MAXTASK)\t\t\t//如果完成了全部任务\n\t\t\t\t\t{\n\t\t\t\t\t\t//计算完成时间\n\t\t\t\t\t\tclock_tt=clock();\n\t\t\t\t\t\tm_lastTime=((float)(clock()-m_beginClock))/CLOCKS_PER_SEC;\n\n\t\t\t\t\t\t//更新最好记录\n\t\t\t\t\t\tif(m_lastTime<m_bestTime)\n\t\t\t\t\t\t\tm_bestTime=m_lastTime;\n\n\t\t\t\t\t\t//将最后一条任务滚动出屏幕\n\t\t\t\t\t\tm_iTask++;\n\t\t\t\t\t\tm_nextTaskY+=100;\n\t\t\t\t\t\tm_status=PASSANI;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t//按键失败\n\t\t\t\t\tm_failErrorKey=pos;\n\t\t\t\t\tm_status=FAILANI;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcasePASSANI:\t\t\t//游戏成功后的动画\n\t\tcaseFAILANI:\t\t\t//游戏失败后的动画\n\t\t\tbreak;\n\n\t\tcasePASS:\t\t\t\t//游戏通过后的成绩显示\n\t\tcaseFAIL:\t\t\t\t//游戏失败后的成绩显示\n\t\t\tif(strchr(m_keys,key)!=NULL)\n\t\t\t\tInit();\n\t\t\tbreak;\n\t}\n}\n\n\n//程序入口主函数\nintmain()\n{\n\n\tinitgraph(640,480);\t\t\t\t\t//创建绘图窗口\n\tsrand((unsigned)time(NULL));\t\t\t//设置随机函数种子\n\n\tsetbkcolor(0x01bbfb);\n\tcleardevice();\n\n\tPLAYERp1(&34;,&34;,38,8);\t\t//创建游戏者喜羊羊\n\tPLAYERp2(&34;,&34;,358,8);\t//创建游戏者灰太狼\n\n\tcharc=0;\n\n\twhile(c!=27)\n\t{\n\t\twhile(_kbhit())\t\t\t\t\t//判断是否有按键\n\t\t{\n\t\t\t//按键处理\n\t\t\tc=_getch();\n\t\t\tp1.Hit(c);\n\t\t\tp2.Hit(c);\n\t\t}\n\n\t\t//绘制游戏场景\n\t\tp1.Draw();\n\t\tp2.Draw();\n\n\t\t//延时\n\t\tHpSleep(16);\n\t}\n\n\t//结束游戏\n\tclosegraph();\t\t\t\t\t\t\t//关闭绘图窗口\n\treturn0;\n}\n
大家赶紧去动手试试吧!
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
关于小游戏小程序源码分享分享网站的内容到此结束,希望对大家有所帮助。
