您的位置:首页 > 编程语言 > C语言/C++

C语言 推箱子小游戏 可重玩 可选关 保存记录

2013-03-10 01:37 531 查看
转载请保留此行,来自Vic___

这是DLNU大一的题目,估计我发上来后,这个课题的难度大大降低。

可以随意增加地图

根据20*20的画就行

0:可移动 1:墙 2:目的地 3:箱子 5:玩家

记得也要增加“存在关数”



//-----------------------------------
//
//		version 1.0
//			From Vic___
//
//-----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <fstream.h>
void DisplayMap();
const int completelevel=5;//存在关数
int dataMap[30][20][20]=
{

{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,            //0:可移动 1:墙 2:目的地 3:箱子 5:玩家
0,0,0,0,0,0,0,1,1,3,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,1,1,2,3,5,3,2,1,0,0,0,0,0,0,0,
0,0,0,0,0,1,2,3,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,2,2,2,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,3,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,5,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,3,3,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,2,0,3,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,2,0,5,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,3,0,1,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,5,0,0,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,3,3,1,0,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,1,0,3,0,1,0,1,2,1,0,0,0,0,0,
0,0,0,0,0,0,1,1,1,0,1,1,1,2,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
},
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,1,1,3,1,1,1,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,0,5,3,0,0,3,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,2,2,1,0,3,0,1,1,0,0,0,0,0,0,0,
0,0,0,1,1,2,2,1,0,0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}
};
int Map[20][20];
int level=0;
int x,y;
int bestdata[30]={0};
int ReadKey()
{
int a;
a=getch();
if(a==114)
return 0;
if(a==122)
return 10;
if(a==120)
return 11;
if(a==224)
{
a=getch();
switch(a)
{
case 72:return 1;
case 75:return 2;
case 80:return 3;
case 77:return 4;
}
}
else
return 0;
}
void FindXY()
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
if(Map[i][j]==5 ||Map[i][j]==7)
{
y=i;x=j;break;
}
}
void GameStart()
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
Map[i][j]=dataMap[level][i][j];
FindXY();
DisplayMap();
printf("第 %d 关\t\t最佳纪录 %d 步\n\nR:重玩\tZ:上关\tX:下关\n",level+1,bestdata[level]);
}
void HandleKey(int key)
{
if(key==1)//上
{
int y1,y2;
y1=y-1;
y2=y-2;
if(y1<0)
return ;
else if(Map[y1][x]==3||Map[y1][x]==4)
{
if(Map[y2][x]==3 ||Map[y2][x]==4||Map[y2][x]==1)
return ;
else  if(Map[y2][x]==0 ||Map[y2][x]==2)
{
// tuixiangzi
Map[y][x]-=5;
if(Map[y1][x]==3)
Map[y1][x]=5;
else if(Map[y1][x]==4)
Map[y1][x]=7;
if(Map[y2][x]==0)
Map[y2][x]=3;
else if(Map[y2][x]==2)
Map[y2][x]=4;
FindXY();

}

}
else if(Map[y1][x]==0 ||Map[y1][x]==2)
{

Map[y][x]-=5;Map[y1][x]+=5;
FindXY();

}

}
else if(key==2) //左
{
int x1,x2;
x1=x-1;
x2=x-2;
if(x1<0)
return ;
else if(Map[y][x1]==1)
return ;
else if(Map[y][x1]==3||Map[y][x1]==4)
{
if(Map[y][x2]==3 ||Map[y][x2]==4||Map[y][x2]==1)
return ;
else  if(Map[y][x2]==0 ||Map[y][x2]==2)
{
// tuixiangzi
Map[y][x]-=5;
if(Map[y][x1]==3)
Map[y][x1]=5;
else if(Map[y][x1]==4)
Map[y][x1]=7;
if(Map[y][x2]==0)
Map[y][x2]=3;
else if(Map[y][x2]==2)
Map[y][x2]=4;
FindXY();

}

}
else if(Map[y][x1]==0 ||Map[y][x1]==2)
{

Map[y][x]-=5;Map[y][x1]+=5;
FindXY();

}

}
else if(key==3)//下
{
int y1,y2;
y1=y+1;
y2=y+2;
if(y1>=20)
return ;
else if(Map[y1][x]==3||Map[y1][x]==4)
{
if(Map[y2][x]==3 ||Map[y2][x]==4||Map[y2][x]==1)
return ;
else  if(Map[y2][x]==0 ||Map[y2][x]==2)
{
// tuixiangzi
Map[y][x]-=5;
if(Map[y1][x]==3)
Map[y1][x]=5;
else if(Map[y1][x]==4)
Map[y1][x]=7;
if(Map[y2][x]==0)
Map[y2][x]=3;
else if(Map[y2][x]==2)
Map[y2][x]=4;
FindXY();

}

}
else if(Map[y1][x]==0 ||Map[y1][x]==2)
{

Map[y][x]-=5;Map[y1][x]+=5;
FindXY();

}

}
else if(key==4)//右
{
int x1,x2;
x1=x+1;
x2=x+2;
if(x1>=20)
return ;
else if(Map[y][x1]==1)
return ;
else if(Map[y][x1]==3||Map[y][x1]==4)
{
if(Map[y][x2]==3 ||Map[y][x2]==4||Map[y][x2]==1)
return ;
else  if(Map[y][x2]==0 ||Map[y][x2]==2)
{
Map[y][x]-=5;
if(Map[y][x1]==3)
Map[y][x1]=5;
else if(Map[y][x1]==4)
Map[y][x1]=7;
if(Map[y][x2]==0)
Map[y][x2]=3;
else if(Map[y][x2]==2)
Map[y][x2]=4;
FindXY();// tuixiangzi
}
}
else if(Map[y][x1]==0 ||Map[y][x1]==2)
{

Map[y][x]-=5;Map[y][x1]+=5;
FindXY();

}
}
}
void DisplayMap()
{
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
switch(Map[i][j])
{
case 0:printf("  ");break;
case 1:printf("▓");break;
case 2:printf("※");break;
case 3:printf("□");break;
case 4:printf("■");break;
case 5:printf("♀");break;
case 7:printf("♂");break;
}
}
printf("\n");
}

}
int JudgeComplete()
{
int i,j;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
if(2==Map[i][j]||3==Map[i][j]) return 0;
return 1;
}

void OpenData()
{
int i=0;
ifstream ifile("save.dat",ios::binary);
if(!ifile)
{
printf("不能打开文件\n");
return;
}
while(!ifile.eof())
{
ifile.read((char *)&bestdata[i],sizeof(bestdata[i]));
i++;
}
ifile.close();
}

void SaveData()
{
ofstream ofile("save.dat",ios::binary);
if(!ofile)
{
printf("不能存入文件\n");
return;
}
for(int i=0;i<completelevel;i++)
ofile.write((char *)&bestdata[i],sizeof(bestdata[i]));
ofile.close();

}

void main()
{
OpenData();
int key,move,movex,movey;
while(1){
GameStart();
move=0;
while(1)
{
movex=x;
movey=y;
key=ReadKey();
if(1!=key&&2!=key&&3!=key&&4!=key) break;
HandleKey(key);
if(movex!=x||movey!=y)move++;
system("cls");
DisplayMap();
printf("第 %d 关\t\t已走 %d 步\t最佳纪录 %d 步\n\nR:重玩\tZ:上关\tX:下关\n",level+1,move,bestdata[level]);
if(JudgeComplete()) break;
}
if(10==key)
{
if(0==level){printf("这是第一关!!!");system("pause");}
else level--;
}
else if(11==key)
{
if(completelevel==level+1){printf("这是最后一关!!!");system("pause");}
else level++;
}
else if(0!=key)
{
if(0==bestdata[level]||move<bestdata[level])
{
bestdata[level]=move;
printf("恭喜破纪录了\n");
SaveData();
}
printf("恭喜进入下一关\n");
level++;
system("pause");
system("cls");
}
if(completelevel==level)
{
printf("恭喜你打通所有关了!\n");
system("pause");
return;
}
system("cls");

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: