手游下载网

手游下载网

C语言零基础项目:连连看小游戏!详细思路+源码分享

admin 49 102

每天一个C语言小项目,提升你的编程能力!

连连看小游戏是一款以连连看为主要元素的Flash游戏,只要将相同的两张牌用三根以内的直线连在一起就可以消除,操作方便,绿色,无需安装,简单容易上手。和我们上一期所讲的对对碰游戏有所类似,我们一起来看看吧!

连连看小游戏速度节奏快,画面清晰可爱,适合细心的玩家。丰富的道具和公共模式的加入,增强游戏的竞争性。多样式的地图,使玩家在各个游戏水平都可以寻找到挑战的目标,长期地保持游戏的新鲜感。

效果展示:

操作方法

鼠标操作,将图案相同的两张图片用三根以内的直线连在一起就可以消除。

游戏目标

在有限的时间里,要将图片全部消除,才能步入下一关卡,通过全部关卡获得最终的胜利。

游戏中使用了大量图片、音乐、资源文件【】

本项目编译环境:VisualStudio2019/2022,EasyX插件

代码展示:

/////////////////////////////////////////////////////程序名称:连连看//作者:水木淋溪//注:本游戏可以说是网上一个游戏的复制//但是是用自己的思想编制的(生成算法有参考)//游戏的优点我就不多说了,玩的过的人都知道//游戏缺点:音乐、背景选的不好,只有一关,很传统···//没有计时,没有提示,没有自动完成···//总之是有待完成,不过这些代码是核心//////////////////////////////////////////////////(lib,"")//易//6010016932中//10012014828难definetopedge150//游戏区距上边框距离defineROW7//游戏区行数defineGridW42//游戏图片的长defineN555//开屏大小(宽)#defineM785//开屏大小(长)IMAGEimage[GridNum+1][2];//图片库IMAGEimage2;//填充图片intGridID[ROW+2][COL+2];//游戏图纸MOUSEMSGmouse;//记录鼠标信息structGridInfor//记入击中图片信息{intidx,idy;//图纸坐标intleftx,lefty;//屏幕坐标intGridID;//图片类型}pre,cur,dur;struct//记录连线点{intx;inty;}point[4];staticintpn;//记录连线点个数voidInitFace();//初始化界面voidShuffle();//随即打乱图片voidShowGrid();//显示图片voidRandGrid();//绘制地图voidLink();//连接两图voidDes_direct();//直接相消voidDes_one_corner();//一折相消voidDes_two_corner();//两折相消voidLoad_picture();//加载图片voidInit_Grid(GridInforpre);//初始化格子信息voidLeftbottondown(MOUSEMSGmouse);//实现鼠标左击效果voidDraw_frame(intleftx,intlefty);//绘制边框voidMousemove(intleftx,intlefty);//实现鼠标移动效果boolJudg_val(intleftx,intlefty);//判断鼠标是否在游戏区voidSeleReact(intleftx,intlefty);//显示选中效果voidTranstoPhycoor(int*idx,int*idy);//图纸坐标转变为屏幕坐标voidGridPhy_coor(intleftx,intlefty);//规范物理坐标voidiPaint(longx1,longy1,longx2,longy2);//将直线销毁voidDrawLine(intx1,inty1,intx2,inty2);//用直线连接两图boolDesGrid(GridInforpre,GridInforcur);//判断两者是否能相消boolMatch_direct(POINTppre,POINTpcur);//判断两者是否能够直接相消boolMatch_one_corner(POINTppre,POINTpcur);//判断两者是否能一折相消boolMatch_two_corner(POINTppre,POINTpcur);//判断两者是否能两折相消voidExchaVal(GridInforpre,GridInforcur);//交换图片信息boolSingle_click_judge(intmousex,intmousey);//判断单击是否有效voidRecordInfor(intleftx,intlefty,GridInforgrid);//记录选中的信息voidTranstoDracoor(intmousex,intmousey,int*idx,int*idy);//鼠标坐标转化为图纸坐标voidExplot(POINTpoint,int*left,int*right,int*top,int*bottel);//探索point点附近的空位置voidmain(){initgraph(M,N);mciSString("playgame_",NULL,0,NULL);InitFace();while(1){mouse=GetMouseMsg();switch(){caseWM_MOUSEMOVE:Mousemove(,);break;caseWM_LBUTTONDOWN:if(Single_click_judge(,)){Leftbottondown(mouse);}break;default:break;}}closegraph();}////////////////////////////////////////生成操作//////////////////////////////voidRandGrid()//产生图片的标记{for(intiCount=0,x=1;x=ROW;++x){for(inty=1;y=COL;++y){GridID[x][y]=iCount++%GridNum+1;}}}voidShuffle()//打乱棋盘{intix,iy,jx,jy,grid;for(intk=0;k84;++k){ix=rand()%ROW+1;//产生1-COL的随机数iy=rand()%COL+1;//产生1-ROW的随机数jx=rand()%ROW+1;//产生1-COL的随机数jy=rand()%COL+1;//产生1-ROW的随机数if(GridID[ix][iy]!=GridID[jx][jy])//如果不相等就交换数据{grid=GridID[ix][iy];GridID[ix][iy]=GridID[jx][jy];GridID[jx][jy]=grid;}}}////////////////////////////////初始化界面///////////////////////////////////////voidInitFace(){srand((unsigned)time(NULL));Load_picture();RandGrid();IMAGEimage3;loadimage(image3,"res\\");putimage(0,0,image3);getimage(image2,3*42,2*48,42,48);Shuffle();ShowGrid();}voidLoad_picture()//加载图片{IMAGEimage1,background;loadimage(image1,"IMAGE","grids");SetWorkingImage(image1);for(inti=1;iGridNum+1;i++)for(intj=0;j2;j++)getimage(image[i][j],j*42,i*48,42,48);loadimage(background,"IMAGE","bg");SetWorkingImage(background);getimage(image2,3*42,2*48,42,48);SetWorkingImage();putimage(0,0,background);}voidShowGrid(){intidx,idy;for(inti=0;iROW;i++)for(intj=0;jCOL;j++){idy=i*48+topedge,idx=j*42+leftedge;putimage(idx,idy,image[GridID[i+1][j+1]][0]);}}/////////////////////////////////鼠标操作////////////////////////////////////////voidMousemove(intleftx,intlefty)//鼠标移动时的变化{staticintprex,prey,preidx,preidy,curidx,curidy;if(Judg_val(leftx,lefty)){TranstoDracoor(leftx,lefty,curidx,curidy);//转化为图纸坐标if(GridID[curidy][curidx]!=0){GridPhy_coor(leftx,lefty);if(====preidy)putimage(prex,prey,image[GridID[preidy][preidx]][1]);elseputimage(prex,prey,image[GridID[preidy][preidx]][0]);prex=leftx,prey=lefty;preidx=curidx,preidy=curidy;Draw_frame(leftx,lefty);//绘制边框}}}voidLeftbottondown(MOUSEMSGmouse)//左击时的变化{staticintclick=0,idx,idy;click++;SeleReact(,);//显示选中效果if(click==1)RecordInfor(,,pre);if(click==2){TranstoDracoor(,,idx,idy);if(idx!=||idy!=){RecordInfor(,,cur);if(==(pre,cur)){GridID[][]=GridID[][]=0;Link();pn=0;putimage(,,image2);putimage(,,image2);Init_Grid(pre);Init_Grid(cur);click=0;}else{ExchaVal(dur,pre);ExchaVal(pre,cur);Init_Grid(cur);click=1;putimage(,,image[GridID[][]][0]);}}elseclick=1;}}voidSeleReact(intleftx,intlefty)//选中时效果{if(Judg_val(leftx,lefty)){intidx,idy;TranstoDracoor(leftx,lefty,idx,idy);GridPhy_coor(leftx,lefty);putimage(leftx,lefty,image[GridID[idy][idx]][1]);}}boolJudg_val(intleftx,intlefty)//判断鼠标是否在游戏区{returnleftxleftedgeleftxleftedge+GridW*COLleftytopedgeleftytopedge+GridH*ROW;}voidTranstoDracoor(intmousex,intmousey,int*idx,int*idy)//鼠标坐标转化为图纸坐标{if(Judg_val(mousex,mousey)){*idx=(mousex-leftedge)/42+1;*idy=(mousey-topedge)/48+1;}}voidRecordInfor(intleftx,intlefty,GridInforgrid)//记录选中的信息{TranstoDracoor(leftx,lefty,,);=()*42+leftedge;=()*48+topedge;=GridID[][];}boolSingle_click_judge(intmousex,intmousey)//判断单击是否有效{intidx,idy;TranstoDracoor(mousex,mousey,idx,idy);//转化为图纸坐标if(Judg_val(,)GridID[idy][idx]!=0)returntrue;returnfalse;}voidDraw_frame(intleftx,intlefty)//绘制方框{setcolor(RGB(126,91,68));setlinestyle(PS_SOLID,NULL,1);rectangle(leftx,lefty,leftx+41,lefty+47);rectangle(leftx+2,lefty+2,leftx+39,lefty+45);setcolor(RGB(250,230,169));rectangle(leftx+1,lefty+1,leftx+40,lefty+46);}////////////////////////////////判断消除操作/////////////////////////////////////boolDesGrid(GridInforpre,GridInforcur)//判断两者是否能相消{boolmatch=false;POINTppre,pcur;=;=;=;=;if(Match_direct(ppre,pcur))match=true;elseif(Match_one_corner(ppre,pcur))match=true;elseif(Match_two_corner(ppre,pcur))match=true;returnmatch;}boolMatch_direct(POINTppre,POINTpcur)//判断两者是否能够直接相消{intk,t;if(==){k=?:;t=?:;if(t+1==k)gotoFIND;for(inti=t+1;ik;i++)if(GridID[i][]!=0)returnfalse;if(i==k)gotoFIND;}elseif(==){k=?:;t=?:;if(t+1==k)gotoFIND;for(inti=t+1;ik;i++)if(GridID[][i]!=0)returnfalse;if(i==k)gotoFIND;}returnfalse;FIND:point[pn].x=,point[pn].y=;pn++;point[pn].x=,point[pn].y=;pn++;returntrue;}boolMatch_one_corner(POINTppre,POINTpcur)//判断两者是否能一折相消{intleft,right,top,bottel,x=,y=;Explot(ppre,left,right,top,bottel);=top-1;RESEARCHX:if()++;elsegotoBACK;if(Match_direct(ppre,pcur))gotoFIND;elsegotoRESEARCHX;BACK:=y;=left-1;RESEARCHY:if()++;elsegotoREBACK;if(Match_direct(ppre,pcur))gotoFIND;elsegotoRESEARCHY;REBACK:pn=0;returnfalse;FIND:point[pn].x=x,point[pn].y=y,pn++;returntrue;}boolMatch_two_corner(POINTppre,POINTpcur)//判断两者是否能两折相消{intleft,right,top,bottel,x=,y=;Explot(ppre,left,right,top,bottel);=top-1;RESEARCHX:if()++;elsegotoBACK;if(Match_one_corner(ppre,pcur))gotoFIND;elsegotoRESEARCHX;BACK:=y;=left-1;RESEARCHY:if()++;elsegotoREBACK;if(Match_one_corner(ppre,pcur))gotoFIND;elsegotoRESEARCHY;REBACK:pn=0;returnfalse;FIND:point[pn].x=x,point[pn].y=y,pn++;returntrue;}voidExplot(POINTpoint,int*left,int*right,int*top,int*bottel){intx=,y=;x++;while(x=COL+1GridID[y][x]==0)x++;*right=x-1;x=;x--;while(x=0GridID[y][x]==0)x--;*left=x+1;x=;y++;while(y=ROW+1GridID[y][x]==0)y++;*bottel=y-1;y=;y--;while(y=0GridID[y][x]==0)y--;*top=y+1;}/////////////////////////////////消除操作////////////////////////////////////////voidLink(){switch(pn){case2:Des_direct();break;case3:Des_one_corner();break;case4:Des_two_corner();break;default:break;}}voidDes_direct(){TranstoPhycoor(point[0].x,point[0].y);TranstoPhycoor(point[1].x,point[1].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);}voidDes_one_corner(){TranstoPhycoor(point[0].x,point[0].y);TranstoPhycoor(point[1].x,point[1].y);TranstoPhycoor(point[2].x,point[2].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);DrawLine(point[1].x,point[1].y,point[2].x,point[2].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);iPaint(point[1].x,point[1].y,point[2].x,point[2].y);}voidDes_two_corner(){TranstoPhycoor(point[0].x,point[0].y);TranstoPhycoor(point[1].x,point[1].y);TranstoPhycoor(point[2].x,point[2].y);TranstoPhycoor(point[3].x,point[3].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);DrawLine(point[1].x,point[1].y,point[2].x,point[2].y);DrawLine(point[2].x,point[2].y,point[3].x,point[3].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);iPaint(point[1].x,point[1].y,point[2].x,point[2].y);iPaint(point[2].x,point[2].y,point[3].x,point[3].y);}voidDrawLine(intx1,inty1,intx2,inty2){setlinestyle(PS_SOLID,NULL,3);setcolor(RGB(90,43,9));line(x1+21,y1+24,x2+21,y2+24);}voidiPaint(longx1,longy1,longx2,longy2){intminx,miny,maxx,maxy;if(x1==x2){maxy=y1y2?y1:y2;miny=y1y2?y1:y2;for(inti=miny;i=maxy;i+=48)putimage(x1,i,image2);}elseif(y1==y2){maxx=x1x2?x1:x2;minx=x1x2?x1:x2;for(intj=minx;j=maxx;j+=42)putimage(j,y1,image2);}}/////////////////////////////////////////////////////////////////////////////////voidGridPhy_coor(intleftx,intlefty)//转化为标准物理坐标{leftx=((leftx-leftedge)/42)*42+leftedge;lefty=((lefty-topedge)/48)*48+topedge;}voidExchaVal(GridInforpre,GridInforcur)//交换格子信息{=;=;=;=;=;}voidInit_Grid(GridInforgrid)//初始化格子{=0;=0;=0;=0;=0;}voidTranstoPhycoor(int*idx,int*idy)//图纸坐标转变为屏幕坐标{intx,y;x=*idx,y=*idy;*idy=(y-1)*48+leftedge;*idx=(x-1)*42+topedge;}

大家赶紧去动手试试吧!

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

编程学习书籍分享: