C语言推箱子源代码推箱子代码完善

  • 格式:doc
  • 大小:49.00 KB
  • 文档页数:10

#include #include #include typedef struct MAP//地图 { int wall[50][2];//墙 int box[9][2];//箱子 int des[9][2];//终点 int overlap[9][2];//箱子与终点的重叠位置 int all,now;//总箱子个数,到位箱子个数 int x,y;//起点 } MAP,*map; //全局变量// int U=1,D=2,L=3,R=4; //定义按键状态 //int jump; int ofx=10,ofy=9; //定义xy偏移量 int player[2];//玩家位置 int nextp[2],nextb[2];//玩家下一步位置,箱子下一步位置 MAP Pass[5];//关卡数组 map Group,p;//关卡数组指针,当前关卡指针 int level;//关卡等级 int status;//玩家状态 int boxc[9][2],overlapc[9][2];//箱子状态栈,重叠箱子状态栈 int nowbox;//当前到位箱子个数 int reset;//是否重玩 //声明全部函数// void Pos(int x,int y)//设置光标位置 { COORD pos; HANDLE hOutput; pos.X=x; pos.Y=y; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos); system("color 3B"); } void welcometogame()//开始界面 { system("title 2017程序设计之推箱子"); 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"); } void inputmap(int a[][2])//创建地图数据 { int i,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; i<2+p->now; i++,k++) //输入重叠箱子信息 { p->overlap[k][0]=a[i][0]; p->overlap[k][1]=a[i][1]; } for(k=0; i<2+p->now+p->all; i++,k++) //输入终点信息 { p->des[k][0]=a[i][0]; p->des[k][1]=a[i][1]; } for(k=0; i<2+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]; } } void initgame()//初始化游戏 { //[0][0],[0][1]是玩家起始位置,[1][0],[1][1]是箱子个数和到位个数, //之后是重叠箱子位置,终点位置,箱子位置,墙位置 int a0[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); } void printfoverlap(int b[9][2])//打印重叠箱子位置 { int i; for(i=0; i<9; i++) { if(b[i][0]==0&&b[i][1]==0) continue; Pos(2*(b[i][0]+ofx),b[i][1]+ofy); printf("66"); } } void loadmap()//加载地图 { int i; 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); } void copybox(int copy[9][2],int b[9][2])//复制箱子信息 { int i; for(i=0; i<9; i++) { copy[i][0]=b[i][0]; copy[i][1]=b[i][1]; } } void trans(int p[2],int q[2])//状态传递,接收到玩家状态之后进行坐标改变的存储 { if(status==U)