实验四程序源码 83推箱子C版学生实验讲解.docx
- 文档编号:16222064
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:26
- 大小:18.76KB
实验四程序源码 83推箱子C版学生实验讲解.docx
《实验四程序源码 83推箱子C版学生实验讲解.docx》由会员分享,可在线阅读,更多相关《实验四程序源码 83推箱子C版学生实验讲解.docx(26页珍藏版)》请在冰点文库上搜索。
实验四程序源码83推箱子C版学生实验讲解
/*
实验要求:
1.有些方向的移动不能工作,需要根据能工作的进行对比研究后修改,确保四个方向都能正常移动
2.计数器工作有故障,需要根据实际效果找到问题解决之
3.添加第四关的基础数据并使之在软件开始玩和重新玩中全部承认
4.添加栈的机制使得可以在推到墙体时可以后退一步或者数步
*/
//推箱子小游戏C版
#include
#include
#include
#include
constroomsize=9;//设计房间内部为正方形,边长为9
intmap[roomsize+2][roomsize+2];//推箱子房间布局的数据结构:
二维数组
intdata;//记录最短步骤数目
inttimes=0;
intarray[2]={100,100};//记录最好成绩
charstring[30]="正在装入..................";
//以下为前几轮游戏房间中细节布局的数据结构:
二维数组的实际内容
intmap1[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
};
intmap2[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
};
intmap3[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
};
//其他关的房间布局模板
intmap4[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,0,0,1,0,0,0,1,-1,-1},//2
{-1,1,0,1,0,0,1,0,1,-1,-1},//3
{-1,1,0,0,0,3,1,0,1,-1,-1},//4
{-1,1,1,1,3,0,3,4,1,-1,-1},//5
{-1,1,0,0,0,0,1,0,1,-1,-1},//6
{-1,1,0,2,2,2,0,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
};
intpositionh;//人的位置纵坐标
intpositionl;//人的位置横坐标
intflag;//标志位,记录人在目标位置上
intgate;//记录关数
intstep;//记录步数
voidinitbox();//初始化函数
voidbegin();//开始界面
voidchoose_gate();//选关提示
voidchoose();//游戏时c选项的提示
voidreplay();//重玩
voidplaying();//玩游戏时界面
voiddisplay();//显示地图
voidmoveleft();//移向左方向
voidmoveright();//移向右方向
voidmovedown();//移向下方向
voidmoveup();//移向上方向
voidtest_flag();//过关提示
voidrecord();//成绩排行榜
//=====
voidplaying()//Ascii码键盘键位:
左为75右为77上为72下为80
{
intchoice;
step=0;
printf("开始游戏!
");
while
(1)
{
display();
switch(getch())
{
case72:
moveup();
step++;
break;
case80:
movedown();
step++;
break;
case75:
moveleft();
step++;
break;
case77:
moveright();
step++;
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)
{
case1:
step=0;
Sleep(500);
system("cls");
begin();
break;
case2:
exit(0);
}
default:
break;
}
system("cls");
}
}
voiddisplay()
{
printf("\n\n\n\n\n");
for(inti=1;i<=roomsize;i++)
{
printf("");
for(intj=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);
}
voidmoveright()
{
if(map[positionh][positionl+1]==0)//向空白位置移动
{
map[positionh][positionl+1]=4;
if(flag==1)
{map[positionh][positionl]=2;flag=0;}
else
map[positionh][positionl]=0;
positionl++;
}
elseif(map[positionh][positionl+1]==2)//人要到目标位置上
{
map[positionh][positionl+1]=4;
if(flag==1)//人在目标位置上
map[positionh][positionl]=2;//恢复目标位置
else
{
map[positionh][positionl]=0;//恢复原来的状态
flag=1;//标志位,记录人在目标位置上
}
positionl++;
}
elseif(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==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++;
}
elseif(map[positionh][positionl+1]==5&&map[positionh][positionl+2]!
=1)//要将箱子从目标位置上推出
{
if(map[positionh][positionl+2]==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;}
}
elseif(map[positionh][positionl+2]==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++;
}
elseif(map[positionh][positionl+1]==3&&map[positionh][positionl+2]==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++;
}
elsestep--;//抵消人不动的情况
test_flag();
}
voidmoveleft()
{
if(map[positionh][positionl-1]==0)//向空白位置移动
{
map[positionh][positionl-1]=4;
if(flag==1)
{map[positionh][positionl]=2;flag=0;}
else
map[positionh][positionl]=0;
positionl--;
}
elseif(map[positionh][positionl-1]==2)//人要到目标位置上
{
map[positionh][positionl-1]=4;
if(flag==1)//人在目标位置上
map[positionh][positionl]=2;//恢复目标位置
else
{
map[positionh][positionl]=0;//恢复原来的状态
flag=1;//标志位,记录人在目标位置上
}
positionl--;
}
elseif(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==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--;
}
elseif(map[positionh][positionl-1]==5&&map[positionh][positionl-2]!
=1)//要将箱子从目标位置上推出
{
if(map[positionh][positionl-2]==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;}
}
elseif(map[positionh][positionl-2]==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--;
}
elseif(map[positionh][positionl-1]==3&&map[positionh][positionl-2]==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--;
}
elsestep--;//抵消人不动的情况
test_flag();
}
voidmoveup()
{
if(map[positionh-1][positionl]==0)
{
map[positionh-1][positionl]=4;
if(flag==1)
{map[positionh][positionl]=2;flag=0;}
else
map[positionh][positionl]=0;
positionh--;
}
elseif(map[positionh-1][positionl]==2)//人要到目标位置上
{
map[positionh-1][positionl]=4;
if(flag==1)
map[positionh][positionl]=2;//恢复目标位置
else
{
map[positionh][positionl]=0;//恢复原来的状态
flag=1;//标志位,记录人在目标位置上
}
positionh--;
}
elseif(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==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--;
}
elseif(map[positionh-1][positionl]==5&&map[positionh-2][positionl]!
=1)//要将箱子从目标位置上推出
{
if(map[positionh-2][positionl]==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;}
}
elseif(map[positionh-2][positionl]==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--;
}
elseif(map[positionh-1][positionl]==3&&map[positionh-2][positionl]==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--;
}
elsestep--;//抵消人不动的情况
test_flag();
}
voidmovedown()
{
if(map[positionh+1][positionl]==0)
{
map[positionh+1][positionl]=4;
if(flag==1)
{map[positionh][positionl]=2;flag=0;}
else
map[positionh][positionl]=0;
positionh++;
}
elseif(map[positionh+1][positionl]==2)//人要到目标位置上
{
map[positionh+1][positionl]=4;
if(flag==1)
map[positionh][positionl]=2;//恢复目标位置
else
{
map[positionh][positionl]=0;//恢复原来的状态
flag=1;//标志位,记录人在目标位置上
}
positionh++;
}
elseif(map[positionh+1][positionl]==3&&map[positionh+2][positionl]==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++;
}
elseif(map[positionh+1][positionl]==5&&map[positionh+2][positionl]!
=1)//要将箱子从目标位置上推出
{
if(map[positionh+2][positionl]==2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四程序源码 83推箱子C版学生实验讲解 实验 程序 源码 83 箱子 学生 讲解