您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > C语言推箱子源代码推箱子代码完善
#includestdio.h#includestdlib.h#includeWindows.htypedefstructMAP//地图{intwall[50][2];//墙intbox[9][2];//箱子intdes[9][2];//终点intoverlap[9][2];//箱子与终点的重叠位置intall,now;//总箱子个数,到位箱子个数intx,y;//起点}MAP,*map;//全局变量//intU=1,D=2,L=3,R=4;//定义按键状态//intjump;intofx=10,ofy=9;//定义xy偏移量intplayer[2];//玩家位置intnextp[2],nextb[2];//玩家下一步位置,箱子下一步位置MAPPass[5];//关卡数组mapGroup,p;//关卡数组指针,当前关卡指针intlevel;//关卡等级intstatus;//玩家状态intboxc[9][2],overlapc[9][2];//箱子状态栈,重叠箱子状态栈intnowbox;//当前到位箱子个数intreset;//是否重玩//声明全部函数//voidPos(intx,inty)//设置光标位置{COORDpos;HANDLEhOutput;pos.X=x;pos.Y=y;hOutput=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput,pos);system(color3B);}voidwelcometogame()//开始界面{system(title2017程序设计之推箱子);Pos(28,3);printf(欢迎来到推箱子!);Pos(50,24);printf(软件1603刘刈16110572087\n);Pos(27,9);printf(用↑.↓.←.→控制人物的移动。);Pos(27,10);printf(按空格键重新开始此局。);Pos(27,11);printf(按ESC结束游戏。\n);Pos(0,22);system(pause);if(GetAsyncKeyState(VK_ESCAPE)){system(cls);Pos(34,14);printf(欢迎下次再玩。);Pos(25,20);printf(请按任意键退出。);getch();exit(0);}system(cls);}voidinputmap(inta[][2])//创建地图数据{inti,k;p-x=a[0][0];p-y=a[0][1];//玩家坐标p-all=a[1][0];p-now=a[1][1];//箱子状态for(k=0,i=2;i2+p-now;i++,k++)//输入重叠箱子信息{p-overlap[k][0]=a[i][0];p-overlap[k][1]=a[i][1];}for(k=0;i2+p-now+p-all;i++,k++)//输入终点信息{p-des[k][0]=a[i][0];p-des[k][1]=a[i][1];}for(k=0;i2+p-now+2*p-all;i++,k++)//输入箱子信息{p-box[k][0]=a[i][0];p-box[k][1]=a[i][1];}for(k=0;a[i][0]!=666;i++,k++)//输入墙的信息{p-wall[k][0]=a[i][0];p-wall[k][1]=a[i][1];}}voidinitgame()//初始化游戏{//[0][0],[0][1]是玩家起始位置,[1][0],[1][1]是箱子个数和到位个数,//之后是重叠箱子位置,终点位置,箱子位置,墙位置inta0[50][2]={{4,4},{4,0},{1,4},{3,1},{4,6},{6,3},{3,3},{3,4},{4,5},{5,3},{0,3},{0,4},{0,5},{1,3},{1,5},{2,0},{2,1},{2,2},{2,3},{2,5},{3,0},{3,5},{3,6},{3,7},{4,0},{4,1},{4,2},{4,7},{5,2},{5,4},{5,5},{5,6},{5,7},{6,2},{6,4},{7,2},{7,3},{7,4},{666,666}},a1[50][2]={{1,1},{3,0},{7,3},{7,4},{7,5},{2,2},{2,3},{3,2},{0,0},{0,1},{0,2},{0,3},{0,4},{1,0},{1,4},{1,5},{1,6},{1,7},{1,8},{2,0},{2,4},{2,5},{2,8},{3,0},{3,8},{4,0},{4,1},{4,2},{4,3},{4,4},{4,8},{5,4},{5,6},{5,7},{5,8},{6,2},{6,3},{6,4},{6,7},{7,2},{7,7},{8,2},{8,3},{8,4},{8,5},{8,6},{8,7},{666,666}},a2[50][2]={{2,3},{4,0},{2,4},{2,5},{3,4},{3,5},{2,2},{4,3},{6,4},{7,3},{0,2},{0,3},{0,4},{0,5},{1,0},{1,1},{1,2},{1,5},{1,6},{2,0},{2,6},{3,0},{3,2},{3,6},{4,0},{4,2},{4,4},{4,5},{4,6},{5,0},{5,2},{5,6},{6,0},{6,6},{7,0},{7,1},{7,6},{8,1},{8,4},{8,5},{8,6},{9,1},{9,2},{9,3},{9,4},{666,666}},a3[50][2]={{1,2},{5,1},{3,6},{1,5},{1,6},{2,6},{3,6},{4,6},{2,2},{2,3},{2,5},{3,4},{3,6},{0,1,},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{1,0},{1,1},{1,3},{1,4},{1,7},{2,0},{2,7},{3,0},{3,7},{4,0},{4,1},{4,2},{4,3},{4,7},{5,3},{5,4},{5,5},{5,6},{5,7},{666,666}};Group=Pass;p=Group+0;inputmap(a0);p=Group+1;inputmap(a1);p=Group+2;inputmap(a2);p=Group+3;inputmap(a3);}voidprintfoverlap(intb[9][2])//打印重叠箱子位置{inti;for(i=0;i9;i++){if(b[i][0]==0&&b[i][1]==0)continue;Pos(2*(b[i][0]+ofx),b[i][1]+ofy);printf(66);}}voidloadmap()//加载地图{inti;Pos(2*(p-wall[0][0]+ofx),p-wall[0][1]+ofy);printf(■);for(i=1;p-wall[i][0]!=0||p-wall[i][1]!=0;i++)//打印墙{Pos(2*(p-wall[i][0]+ofx),p-wall[i][1]+ofy);printf(■);}for(i=0;p-des[i][0]!=0||p-des[i][1]!=0;i++)//打印终点{Pos(2*(p-des[i][0]+ofx),p-des[i][1]+ofy);printf(×);}for(i=0;p-box[i][0]!=0||p-box[i][1]!=0;i++)//打印箱子{Pos(2*(p-box[i][0]+ofx),p-box[i][1]+ofy);printf(◇);}printfoverlap(p-overlap);//打印重叠箱子位置Pos(2*(p-x+ofx),p-y+ofy);//打印玩家位置printf(★);Pos(79,29);}voidcopybox(intcopy[9][2],intb[9][2])//复制箱子信息{inti;for(i=0;i9;i++){copy[i][0]=b[i][0];copy[i][1]=b[i][1];}}voidtrans(intp[2],intq[2])//状态传递,接收到玩家状态之后进行坐标改变的存储{if(status==U){p[0]=q[0];p[1]=q[1]-1;}elseif(status==D){p[0]=q[0];p[1]=q[1]+1;}elseif(status==L){p[0]=q[0]-1;p[1]=q[1];}elseif(status==R){p[0]=q[0]+1;p[1]=q[1];}}voidmove()//玩家移动{inti,j,k,con;//i用于遍历,j保存要移动的箱子编号,k标记重叠箱子//con:0下一步有墙重合,1下一步没有墙,2下一步没有墙没有箱子//,3下一步有箱子,4箱子下一步没有墙,5箱子下一步有墙//,6箱子下一步没有墙没有箱子,7箱子下一步有其他箱子if(status!=0)//status不等于0执行移动{trans(nextp,player);//更新下一步for(i=1,con=1;p-wall[i][0]!=0||p-wall[i][1]!=0;i++)//判断玩家下一步是否与墙重合{if(p-wall[i][0]==nextp[0]&&p-wall[i][1]==nextp[1]){con=0;//重合使con为0break;}}if(con==1)//1下一步没有墙{for(i=0,con=2;boxc[i][0]!=0||boxc[i][1]!=0;i++)//判断下一步是否有箱子{if(boxc[i][0]==nextp[0]&&boxc[i][1]==nextp[1]){con=3;//下一步有箱子使con为3j=i;//保存要移动的箱子break;}}if(con==3)//3下一步有箱子{trans(nextb,nextp);//更新盒子下一步for(i=1,con=4;p-wall[i][0]!=0||p-wall[i][1]!=0;i++)//判断箱子下一步是否与墙重合{if(p-wall[i][0]==nextb[0]&&p-wall[i][1]==nextb[1]){con=5;//箱子下一步与墙重合使con为5break;}}if(con==4)//4箱子下一步没有墙{for(i=0,con=6;boxc[i][0]!=0||boxc[i][1]!=0;i++)//判断箱子下一步是否有其他箱子{if(boxc[i][0]==nextb[0]&&boxc[i][1]==nextb[1]){con=7;//箱子下一步有其他箱子使con为7break;}}if(con==6)//6箱子下一步没有墙并且也没有其他箱子{Pos(2*(nextb[0]+ofx),nextb[1]+ofy);printf(◇);Pos(2*(nextp[0]+ofx),nextp[1]+ofy);printf(★);Pos(2*(player[0]+ofx),player[1]+ofy);printf();for(i=0;p-des[i][0]!=0||p-des[i][1]!=0;i++)//当前玩家位置是否有终点标记{if(p-des[i][0]==player[0]&&p-des[i][1]==player[1]){Pos(2*(player[0]+ofx),player[1]+ofy);printf(×);break;}}for(i=0;p-des[i][0]!=0||p-des[i][
本文标题:C语言推箱子源代码推箱子代码完善
链接地址:https://www.777doc.com/doc-5646184 .html