推箱子游戏

    xiaoxiao2021-12-14  18

    恩..可能在回退机制上会出现一些问题

    //推箱子小游戏C版 #include<stdio.h> #include<windows.h> #include<stdlib.h> #include<conio.h> typedef int ElementType; const int roomsize=10; //设计房间内部为正方形,边长为9 int map[roomsize+2][roomsize+2]; //推箱子房间布局的数据结构:二维数组 int data; //记录最短步骤数目 int times=0; char ch; int array[2]={100,100}; //记录最好成绩 char string[30]="正在装入.................."; //以下为前几轮游戏房间中细节布局的数据结构:二维数组的实际内容 int map1[roomsize+2][roomsize+2]= { //0,1,2,3,4,5,6,7,8,9,10 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, //0 {-1,0,0,0,0,1,1,1,1,1,-1}, //1 {-1,0,0,0,0,1,0,0,0,1,-1}, //2 {-1,1,1,1,0,1,0,0,0,1,-1}, //3 {-1,1,2,1,0,1,0,0,0,1,-1}, //4 {-1,1,2,1,0,1,0,3,0,1,-1}, //5 {-1,1,2,1,1,1,0,3,0,1,-1}, //6 {-1,1,0,0,0,0,3,4,0,1,-1}, //7 {-1,1,0,0,1,0,0,0,0,1,-1}, //8 {-1,1,1,1,1,1,1,1,1,1,-1}, //9 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 }; int map2[roomsize+2][roomsize+2]= { //0,1,2,3,4,5,6,7,8,9,10 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0 {-1,0,1,1,1,1,0,0,0,-1,-1}, //1 {-1,0,1,4,0,1,1,1,0,-1,-1}, //2 {-1,0,1,0,3,0,0,1,0,-1,-1}, //3 {-1,1,1,1,0,1,0,1,1,-1,-1}, //4 {-1,1,2,1,0,1,0,0,1,-1,-1}, //5 {-1,1,2,3,0,0,1,0,1,-1,-1}, //6 {-1,1,2,0,0,0,3,0,1,-1,-1}, //7 {-1,1,1,1,1,1,1,1,1,-1,-1}, //8 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 }; int map3[roomsize+2][roomsize+2]= { //0,1,2,3,4,5,6,7,8,9,10 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0 {-1,1,1,1,1,1,1,1,1,-1,-1}, //1 {-1,1,4,0,0,0,1,1,1,-1,-1}, //2 {-1,1,0,3,3,0,0,0,1,-1,-1}, //36 {-1,1,0,2,1,2,0,0,1,-1,-1}, //4 {-1,1,0,0,1,1,3,0,1,-1,-1}, //5 {-1,1,0,0,1,1,2,1,1,-1,-1}, //6 {-1,1,0,0,0,0,0,1,1,-1,-1}, //7 {-1,1,1,1,1,1,1,1,1,-1,-1}, //8 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 }; //其他关的房间布局模板 int map4[roomsize+2][roomsize+2]= { //0,1,2,3,4,5,6,7,8,9,10 {-1,-1,-1,-1,-1,-1,-1,-1,-1},//0 {-1,1,1,1,1,1,1,1,1,-1,-1}, //1 {-1,1,1,1,1,1,1,1,1,-1,-1}, //2 {-1,1,1,0,0,0,0,0,1,1,1,}, //3 {-1,1,1,3,1,1,1,0,0,0,1}, //4 {-1,1,0,4,0,3,0,0,3,0,1}, //5 {-1,1,0,2,2,1,0,3,0,1,1}, //6 {-1,1,1,2,2,1,0,0,0,1,-1}, //7 {-1,1,1,1,1,1,1,1,1,1,-1}, //8 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//9 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} //10 }; typedef struct SNode *PtrToSNode; struct SNode { ElementType peopleh; ElementType peoplel; /*ElementType position1h; ElementType position1l; ElementType position2h; ElementType position2l; */ int downdata1; int downdata2; int updata1; int updata2; int rightdata1; int rightdata2; int leftdata1; int leftdata2; char ch; PtrToSNode Next; }; typedef PtrToSNode Stack; int positionh;//人的位置纵坐标 int positionl;//人的位置横坐标 int flag;//标志位,记录人在目标位置上 int gate;//记录关数 int step;//记录步数 bool returned();//后退 void initbox();//初始化函数 void begin();//开始界面 void choose_gate();//选关提示 void choose();//游戏时c选项的提示 void replay();//重玩 void playing();//玩游戏时界面 void display();//显示地图 void moveleft();//移向左方向 void moveright();//移向右方向 void movedown();//移向下方向 void moveup();//移向上方向 void test_flag();//过关提示 void record();//成绩排行榜 Stack CreateStack( ); bool IsEmpty ( Stack S ); bool Push( Stack S); bool Pop( Stack S ); //===== Stack CreateStack( ) { /* 构建一个堆栈的头结点,返回该结点指针 */ Stack S; S = (Stack)malloc(sizeof(struct SNode)); S->Next = NULL; return S; } bool IsEmpty ( Stack S ) { /* 判断堆栈S是否为空,若是返回true;否则返回false */ return ( S->Next == NULL ); } bool Push( Stack S) { /* 将元素X压入堆栈S */ PtrToSNode TmpCell; TmpCell = (PtrToSNode)malloc(sizeof(struct SNode)); TmpCell->Next = S; S = TmpCell; return true; } bool Pop( Stack S ) { /* 删除并返回堆栈S的栈顶元素 */ PtrToSNode FirstCell; //ElementType TopElem; if( IsEmpty(S) ) { printf("堆栈空"); return ERROR; } else { FirstCell = S->Next; //TopElem = FirstCell->Data; S->Next = FirstCell->Next; free(FirstCell); //return TopElem; return true; } } Stack S =CreateStack( ); void playing()//Ascii码键盘键位:左为75 右为77 上为72 下为80 { int choice; step=0; printf("开始游戏!"); while(1) { display(); ch = getch(); switch(ch) { case 72: moveup(); step++; break; case 80: movedown(); step++; break; case 75: moveleft(); step++; break; case 77: moveright(); step++; break; case 't': case 'T': returned(); break; case 'c': case 'C': choose(); break; case 'q': case 'Q': printf(" ╭─────────────╮\n"); printf(" │是退出游戏还是返回到主界面? │\n"); printf(" │ 1. 返回主界面 │\n"); printf(" │ 2. 退出游戏 │\n"); printf(" ╰──────────────╯\n"); scanf("%d",&choice); switch(choice) { case 1: step=0; Sleep(500); system("cls"); begin(); break; case 2: exit(0); } default: break; } system("cls"); } } void display() { printf("\n\n\n\n\n"); for(int i=1;i<=roomsize;i++) { printf(" "); for(int j=1;j<=roomsize;j++) { if(map[i][j]==0) printf(" "); if(map[i][j]==1) printf("■");//墙 if(map[i][j]==2) printf("○");//目标位置 if(map[i][j]==3) printf("★");//箱子 if(map[i][j]==4) printf("♀");//人 if(map[i][j]==5) printf("㊣");//箱子在目标位置上 } printf("\n"); } printf("\n\n"); printf("选项(c) 步数:%d\n",step); } bool returned() { if(S->ch == 't') { return false; } if(S->ch == 80) { if(map[positionh+1][positionl]==0) { flag = 0; } positionl = S->peoplel; positionh = S->peopleh; map[positionh][positionl] = 4; map[positionh+1][positionl] = S->downdata1; if(S->updata1 == 2) { flag = 1; } if(S->updata1 == 0) { flag = 0; } if(S->downdata1 == 3&&S->downdata2 == 0) { map[positionh+2][positionl] = 0; } if(S->downdata2 == 0) { map[positionh+2][positionl] = 2; } if(S->downdata1 == 3&&S->downdata2 == 2) { map[positionh+2][positionl] = 2; } if(S->downdata1 == 5&&S->downdata2 == 0) { map[positionh+2][positionl] = 0; } step--; } if(S->ch == 72) { if(map[positionh-1][positionl]==0) { flag = 0; } positionl = S->peoplel; positionh = S->peopleh; map[positionh][positionl] = 4; map[positionh-1][positionl] = S->updata1; if(S->downdata1 == 2) { flag = 1; } if(S->downdata1 == 0) { flag = 0; } if(S->updata1 == 3) { map[positionh-2][positionl] = 0; } if(S->updata2 == 2) { map[positionh-2][positionl] = 2; } if(S->updata1 == 3&&S->updata2 == 2) { map[positionh-2][positionl] = 2; } step--; } if(S->ch == 77) { if(map[positionh][positionl+1]==0) { flag = 0; } positionl = S->peoplel; positionh = S->peopleh; map[positionh][positionl] = 4; map[positionh][positionl+1] = S->rightdata1; if(S->leftdata1 == 2) { flag = 1; } if(S->leftdata1 == 0) { flag = 0; } if(S->rightdata1 == 3) { map[positionh][positionl+2] = 0; } if(S->rightdata2 == 2) { map[positionh][positionl+2] = 2; } step--; } if(S->ch == 75) { if(map[positionh][positionl-1]==0) { flag = 0; } positionl = S->peoplel; positionh = S->peopleh; map[positionh][positionl] = 4; map[positionh][positionl-1] = S->leftdata1; if(S->rightdata1 == 2) { flag = 1; } if(S->rightdata1 == 0) { flag = 0; } if(S->leftdata1 == 3) { map[positionh][positionl-2] = 0; } if(S->leftdata2 == 2) { map[positionh][positionl-2] = 2; } step--; } Push(S); S->ch = ch; return true; } void movedown() //向下移动 { Push(S); S->ch = ch; S->peopleh = positionh; //定好人所在的位置 S->peoplel = positionl; if(map[positionh+1][positionl]==0)//向空白位置移动 { S->downdata1 = 0; map[positionh+1][positionl]=4; if(flag==1) { map[positionh][positionl]=2;flag=0; } else map[positionh][positionl]=0; positionh++; } else if(map[positionh+1][positionl]==2)//人要到目标位置上 { S->downdata1 = 2; map[positionh+1][positionl]=4; if(flag==1)//人在目标位置上 map[positionh][positionl]=2;//恢复目标位置 else { map[positionh][positionl]=0;//恢复原来的状态 flag=1;//标志位,记录人在目标位置上 } positionh++; } else if(map[positionh+1][positionl]==3&&map[positionh+2][positionl]==0)//将箱子推到空白位置上 { S->downdata1 = 3; S->downdata2 = 0; map[positionh+2][positionl]=3; map[positionh+1][positionl]=4; if(flag==1) { map[positionh][positionl]=2; flag=0; } else map[positionh][positionl]=0; positionh++; } else if(map[positionh+1][positionl]==5&&map[positionh+2][positionl]!=1)//要将箱子从目标位置上推出 { S->downdata1 = 5; if(map[positionh+2][positionl]==2)//下一个位置还是目标位置 { S->downdata2 = 2; map[positionh+2][positionl]=5; map[positionh+1][positionl]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } else if(map[positionh+2][positionl]==0)//下一个位置是空白 { S->downdata2 = 0; map[positionh+2][positionl]=3; map[positionh+1][positionl]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } positionh++; } else if(map[positionh+1][positionl]==3&&map[positionh+2][positionl]==2)//要将箱子推到目标位置上 { S->downdata1 = 3; S->downdata2 = 2; map[positionh+2][positionl]=5;//箱子在目标位置上 map[positionh+1][positionl]=4; if(flag==1)//人在目标位置上 { map[positionh][positionl]=2; flag=0; } else //人不在目标位置上 map[positionh][positionl]=0; positionh++; } else step--;//抵消人不动的情况 S->updata1 = map[positionh-1][positionl]; test_flag(); } void moveright() //右边移动 { Push(S); S->ch = ch; S->peopleh = positionh; //定好人所在的位置 S->peoplel = positionl; if(map[positionh][positionl+1]==0)//向空白位置移动 { S->rightdata1 = 0; map[positionh][positionl+1]=4; if(flag==1) { map[positionh][positionl]=2;flag=0; } else map[positionh][positionl]=0; positionl++; } else if(map[positionh][positionl+1]==2)//人要到目标位置上 { S->rightdata1 = 2; map[positionh][positionl+1]=4; if(flag==1)//人在目标位置上 map[positionh][positionl]=2;//恢复目标位置 else { map[positionh][positionl]=0;//恢复原来的状态 flag=1;//标志位,记录人在目标位置上 } positionl++; } else if(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==0)//将箱子推到空白位置上 { S->rightdata1 = 3; S->rightdata2 = 0; map[positionh][positionl+2]=3; map[positionh][positionl+1]=4; if(flag==1) { map[positionh][positionl]=2; flag=0; } else map[positionh][positionl]=0; positionl++; } else if(map[positionh][positionl+1]==5&&map[positionh][positionl+2]!=1)//要将箱子从目标位置上推出 { S->rightdata1 = 5; if(map[positionh][positionl+2]==2)//下一个位置还是目标位置 { S->rightdata2 = 2; map[positionh][positionl+2]=5; map[positionh][positionl+1]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } else if(map[positionh][positionl+2]==0)//下一个位置是空白 { S->rightdata2 = 0; map[positionh][positionl+2]=3; map[positionh][positionl+1]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } positionl++; } else if(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==2)//要将箱子推到目标位置上 { S->rightdata1 = 3; S->rightdata2 = 2; map[positionh][positionl+2]=5;//箱子在目标位置上 map[positionh][positionl+1]=4; if(flag==1)//人在目标位置上 { map[positionh][positionl]=2; flag=0; } else //人不在目标位置上 map[positionh][positionl]=0; positionl++; } else step--;//抵消人不动的情况 S->leftdata1 = map[positionh][positionl-1]; test_flag(); } void moveleft() //左边移动 { Push(S); S->ch = ch; S->peopleh = positionh; //定好人所在的位置 S->peoplel = positionl; if(map[positionh][positionl-1]==0)//向空白位置移动 { S->leftdata1 = 0; map[positionh][positionl-1]=4; if(flag==1) { map[positionh][positionl]=2; flag=0; } else map[positionh][positionl]=0; positionl--; } else if(map[positionh][positionl-1]==2)//人要到目标位置上 { S->leftdata1 = 2; map[positionh][positionl-1]=4; if(flag==1)//人在目标位置上 map[positionh][positionl]=2;//恢复目标位置 else { map[positionh][positionl]=0;//恢复原来的状态 flag=1;//标志位,记录人在目标位置上 } positionl--; } else if(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==0)//将箱子推到空白位置上 { S->leftdata1 = 3; S->leftdata2 = 0; map[positionh][positionl-2]=3; map[positionh][positionl-1]=4; if(flag==1) { map[positionh][positionl]=2; flag=0; } else map[positionh][positionl]=0; positionl--; } else if(map[positionh][positionl-1]==5&&map[positionh][positionl-2]!=1)//要将箱子从目标位置上推出 { S->leftdata1 = 5; if(map[positionh][positionl-2]==2)//下一个位置还是目标位置 { S->leftdata2 = 2; map[positionh][positionl-2]=5; map[positionh][positionl-1]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } else if(map[positionh][positionl-2]==0)//下一个位置是空白 { S->leftdata2 = 0; map[positionh][positionl-2]=3; map[positionh][positionl-1]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } positionl--; } else if(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==2)//要将箱子推到目标位置上 { S->leftdata1 = 3; S->leftdata2 = 2; map[positionh][positionl-2]=5;//箱子在目标位置上 map[positionh][positionl-1]=4; if(flag==1)//人在目标位置上 { map[positionh][positionl]=2; flag=0; } else //人不在目标位置上 map[positionh][positionl]=0; positionl--; } else step--;//抵消人不动的情况 S->rightdata1 = map[positionh][positionl+1]; test_flag(); } void moveup() //向上移动 { Push(S); S->ch = ch; S->peopleh = positionh; //定好人所在的位置 S->peoplel = positionl; if(map[positionh-1][positionl]==0)//向空白位置移动 { S->updata1 = 0; map[positionh-1][positionl]=4; if(flag==1) { map[positionh][positionl]=2;flag=0; } else map[positionh][positionl]=0; positionh--; } else if(map[positionh-1][positionl]==2)//人要到目标位置上 { S->updata1 = 2; map[positionh-1][positionl]=4; if(flag==1)//人在目标位置上 map[positionh][positionl]=2;//恢复目标位置 else { map[positionh][positionl]=0;//恢复原来的状态 flag=1;//标志位,记录人在目标位置上 } positionh--; } else if(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==0)//将箱子推到空白位置上 { S->updata1 = 3; S->updata2 = 0; map[positionh-2][positionl]=3; map[positionh-1][positionl]=4; if(flag==1) { map[positionh][positionl]=2; flag=0; } else map[positionh][positionl]=0; positionh--; } else if(map[positionh-1][positionl]==5&&map[positionh-2][positionl]!=1)//要将箱子从目标位置上推出 { S->updata1 = 5; if(map[positionh-2][positionl]==2)//下一个位置还是目标位置 { S->updata2 = 2; map[positionh-2][positionl]=5; map[positionh-1][positionl]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } else if(map[positionh-2][positionl]==0)//下一个位置是空白 { S->updata2 = 0; map[positionh-2][positionl]=3; map[positionh-1][positionl]=4; if(flag==1) map[positionh][positionl]=2; else { map[positionh][positionl]=0; flag=1; } } positionh--; } else if(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==2)//要将箱子推到目标位置上 { S->updata1 = 3; S->updata2 = 2; map[positionh-2][positionl]=5;//箱子在目标位置上 map[positionh-1][positionl]=4; if(flag==1)//人在目标位置上 { map[positionh][positionl]=2; flag=0; } else //人不在目标位置上 map[positionh][positionl]=0; positionh--; } else step--;//抵消人不动的情况 S->downdata1 = map[positionh+1][positionl]; test_flag(); } void initbox()//初始化函数 { positionh=0; positionl=0; flag=0; step=0; gate=0; } void begin() { printf(" ╭────────────────────────────────╮\n"); printf(" │ │\n"); printf(" │ ★☆★ 推箱子 小组名称 ★☆★ │\n"); printf(" │ ╭─────╮ │\n"); printf(" │ │ 游戏简介 │ │\n"); printf(" │ ╰──────╯ │\n"); printf(" │推箱子游戏:最终目的是操作一个人(♀)将箱子(★)推到目标位置(○)上。 │\n"); printf(" │当箱子在目标位置上时显示㊣. │\n"); printf(" │ ╭─────╮ │\n"); printf(" │ │ 操作说明 │ │\n"); printf(" │ ╰──────╯ │\n"); printf(" │按方向键移动,'c'选项,'q'退出,'t'回退 │\n"); printf(" │(建议使用最大化窗口,这样效果较好。) │\n"); printf(" │ 注:回退只能回退一步 │\n"); printf(" ╰─────────────────────────────────╯\n"); choose_gate();//选择关数 printf("%s\n",string); Sleep(500); system("cls"); playing(); } void choose_gate() { int j,k; printf(" ╭──────╮\n"); printf("│ 1.第一关 │\n"); printf("│ 2.第二关 │\n"); printf("│ 3.第三关 │\n"); printf("│ 4.第四关 │\n"); printf("╰───────╯\n"); printf("请选择:"); scanf("%d",&gate); do { switch(gate) { case 1: for(j=0;j<roomsize+2;j++)//此处 j控制行,k控制列 for(k=0;k<roomsize+2;k++) map[j][k]=map1[j][k]; positionh=7; positionl=7; break; case 2: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map2[j][k]; positionh=2; positionl=3; break; case 3: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map3[j][k]; positionh=positionl=2; break; case 4: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map4[j][k]; positionh=3; positionl=5; break; default: printf("输出有误!重新输入"); scanf("%d",&gate); } }while(gate>5); } void choose()//选项 { int choice; printf(" ╭──────--╮\n"); printf("│ 1. 重玩 │\n"); printf("│ 2. 返回主界面 │\n"); printf("│ 3. 最佳记录 │\n"); printf("│ 4. 复盘 │\n"); printf("│ 5. 退出 │\n"); printf("╰────────╯\n"); scanf("%d",&choice); switch(choice) { case 1: system("cls"); replay(); break; case 2: system("cls"); begin(); break; case 3: record(); system("cls"); playing(); break; // case 4: case 5: exit(0); } } void replay() { int j,k; step=0; flag=0; do { switch(gate) { case 1: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map1[j][k]; positionh=7; positionl=7; break; case 2: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map2[j][k]; positionh=2; positionl=3; break; case 3: for(j=0;j<roomsize+2;j++) for(k=0;k<roomsize+2;k++) map[j][k]=map3[j][k]; positionh=positionl=2; break; } }while(gate>3); playing(); } void test_flag() { int choice; for(int i=1;i<=roomsize;i++) for(int j=1;j<=roomsize;j++) { if(map[i][j]==3) return; } system("cls"); step++; data=step; times++; display(); printf(" ╭─────────────╮\n"); printf("│ 恭喜你!你已经通过了这关。 │\n"); printf("│是不是很有成就感?是否继续?│\n"); printf("│1. 继续 │\n"); printf("│2. 最佳记录 │\n"); printf("│3. 退出 │\n"); printf("╰──────────────╯\n"); scanf("%d",&choice); switch(choice) { case 1: step=0; Sleep(500); system("cls"); begin(); break; case 2: record(); system("cls"); printf("按任意键返回主界面...\n"); begin(); break; case 3: printf("欢迎再来玩!\n"); printf("按任意键退出...\n"); getchar(); exit(0); } } void record()//最佳记录 { int rhigh; if(times%2) array[0]=data; else array[1]=data; if(array[0]>array[1]) rhigh=array[1]; else rhigh=array[0]; if(times%2) array[0]=rhigh; else array[1]=rhigh; printf("最佳记录:%d\n",rhigh); system("pause"); } //主函数 int main(void) { system("color f0");//设置颜色 SetConsoleTitle("推箱子小游戏(C版)"); //设置标题 initbox();//初始化 begin();//开始游戏 return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-964014.html

    最新回复(0)