新手哭求洞穴寻金游戏的程序
可怜可怜吧T_T
洞穴寻金游戏描述
洞穴寻金游戏(亦称猛兽世界)是早期的计算机游戏之一。在这个游戏中,探险者在迷宫洞穴中漫游,寻找金子的同时避免被猛兽吃掉或掉入深渊。下面是有关这个游戏的叙述。
猛兽世界由含有多个屋子的洞穴组成。每间屋子可能为空,也可能包含单件物品。这类物品可以是下列对象之一:一只猛兽、一块金子、一道深渊、一个出口。猛兽指的是一种凶恶的动物,探险者遇见它(处在同一间屋子内)肯定送命。但是,用剑可以杀死猛兽。寻找金子是探险者的目的,然后通过带有出口的屋子逃离洞穴。探险者还需要避免掉入深渊,掉入深渊可以叫人送命。每个迷宫洞穴最多有一只猛兽、一块金子及一个出口。洞穴还可能有零到多个深渊。这些东西在单间屋子里只能出现一种。猛兽世界的边界由固体墙构成,探险者不能穿透墙体。探险者可以在各间屋子之间移动,但要冒着掉入深渊和被猛兽吃掉的危险。因为隔壁屋子可能存在猛兽或深渊。下图是一个4X4的猛兽世界,其中有一只猛兽、一块金子、两道深渊、一个出口。
+------+------+------+------+
|Player| | Pit | |
|Exit | | | |
+------+------+------+------+
| | | | |
| | | | |
+------+------+------+------+
| | Pit | |Wumpus|
| | | | |
+------+------+------+------+
| | | |Gold |
| | | | |
+------+------+------+------+
探险者在猛兽世界的动作有:左转turn left、右转turn right、前行move forward、射击shoot、攀爬climb、攫取grab。左转、右转改变探险者行走和射击的方向。转身指的是在原有方向上左转或右转90度。比如,探险者从北边左转90度,将使探险者面向西面。射击指的是将箭射向当前方向上的隔壁屋子里。如果这个邻近的屋子里有猛兽,就将杀死它。前行指的是在当前方向上从一间屋子移动到另一间屋子。如果在这个方向上前行且没有墙的阻挡,就将进入到隔壁邻近的屋子中。攫取指的是如果当前屋子内有金子就抓取它。攀爬指的是如果处在洞穴的出口就爬出来。
用户可以通过一系列的感知行为感觉到猛兽世界里探险者所处的处境。如果探险者所处的隔壁屋子里有一只猛兽他就将能闻到(smell)猛兽的气味;如果隔壁屋子是一道深渊,则探险者能感觉到(feel)深渊的阴森;如果探险者处在有出口的屋子,他将能看到(see)上方透出的光线;如果探险者与金子同处一屋,他将能看到(see)金子发出的光芒。当探险者执行某些动作达到目的后,他将被告知结果。比如,当探险者与金子同处一屋,并且探险者发出了攫取动作,则要告诉探险者“你得到攫取到了金子(You grabbed the gold)”;当探险者射出了箭而被射的屋子里确有猛兽,则要告诉探险者“你杀死了猛兽(You killed the wumpus)“。最后,如果探险者试图直接走出洞穴他将撞到墙上。选手也只需要判断从不同方向接近的哪一间邻近屋子可能存在猛兽或深渊。
在这个实验中,你需要做的是:
1. 阅读上述关于猛兽世界的描述。设计猛兽世界的初始状态:猛兽世界的大小、探险者的位置和方向、以及可能的猛兽,金子,出口和深渊的位置。
2. 采用某种易于处理的表示方法来表示上述状态信息。
3. 从标准输入读入用户指令,由此修改以前的状态信息。
4. 将探险者当前正在体验的任何感知行为输出到屏幕上。
5. 判断用户的输赢,并将相应结果打印输出,终止游戏。
6. 如果用户输入文件结束符,或者游戏以正常输赢结束,打印猛兽世界的当前状态。
猛兽世界文件格式:由行组成, 每行有一个正文关键字,2或5个整数参数。关键字指明参数的意义。比如,前述猛兽世界可以用下述文件表述:
dim 4 4
player 0 0 1 0 1
wumpus 3 2
gold 3 3
pit 2 0
pit 1 2
exit 0 0
dim 分别表示x和y的大小。X代表水平,y代表垂直。
注意:猛兽世界的维数最大不会超出100X100。
player 有5个参数:按序为 x y o g a 。x,y 代表位置;o 代表探险者当前的方向,0代表东,1代表南,2代表西,3代表北;g 和a 是布尔量,分别用来指明探险者是否有金子或箭。注意:探险者最多只有一支箭。
wumpus 代表wumpus的位置,这里为(3,2)。
gold, pit, and exit分别指明金子、深渊、出口的位置。这里有两道深渊。
各关键字的出现必须按照这个次序,多个深渊应该集中出现。dim, player, and和exit行是必须出现的,其它行根据具体情况来定。
初始状态和中间状态、最终状态的保留的格式都是相同的。
选手(用户)输入格式:选手用正文发出指令。一行一条指令。指令由一个或两个单词组成。两个单词的指令中间由空格分隔。下面是一些可能的指令:
shoot
grab
climb
turn left
turn right
move forward
如果选手输入了非法的命令,程序必须做出"That command had no effect."的回应。
感知输出格式: 探险者在探险过程中的感知应该按下列方式,一行一行地精确打印输出。如果一个动作引起了多个感知,应该按下列显示的次序都打印出来。比如,如果探险者被猛兽咬死或探险者掉入深渊,首先应该报告他的所有感知。注意,一旦探险者从洞穴出来,只能报告最后两条感知中的一种,不存在其它的出洞感知。
You bumped into a wall.
You killed the wumpus.
Your arrow disappeared into the darkness.
You smell a wumpus.
You feel a breeze.
You see glitter.
You see light above.
You fell into a pit.
You were killed by the wumpus.
You grabbed the gold.
You are out with the gold.
You are out without the gold.
攫取金子和杀死猛兽:如果探险者和金子同处一间屋子,并且探险者执行了攫取(grab)动作,那么在接下来的游戏过程中探险者将一直怀抱金子。这意味着在刚才的那间屋子里不再有金子,因此它也将不再会引起探险者看到金子的光芒。如果由此保留猛兽世界的状态,则在状态文件中应该不再出现金子,并且player行上的g参数应该为1。
同样地,如果探险者将箭射向了猛兽所在的屋子,猛兽被杀死了,猛兽世界中将不再有猛兽出现,因此也不再会闻到猛兽的气味,猛兽也不会再出现在状态文件中。也要注意一旦射出箭,探险者也不再有箭,由此保留的游戏状态中的player行上的a参数应该为0。
输出感知:一旦有感知就要立刻输出。如果探险者处在洞穴边上的屋子并且试图往外移动,就应该报告撞墙的感知。比如,在上述猛兽世界状态布局中,探险者的位置为(0,0)并且他还试图往北移动,此时就要报告感知“You bumped into a wall.”,但探险者的位置没有改变。
如果探险者处于一间有金子的房间,就应该报告"You see glitter." 在本例中,如果探险者位于(2,3),并且向东移动到(3,3),那么就应该报告看到金子光芒的感知。如果探险者就在(3,3)屋子里左转、右转或朝墙移动(结果并没有移动成功),也应该报告看到金子光芒的感知。。一旦探险者拿到了金子,对金子光芒的感知就不应该再报告,因为目前金子为探险者所拥有。当探险者成功地执行了攫取动作时,应该报告"You grabbed the gold.",但是紧跟着这个动作后只能报告一次。如果探险者进入了一个带有出口的屋子,也应该报告"You see light above."。
如果探险者进入一间屋子,这间屋子的隔壁屋子(可以是东、南、西、北)带有深渊,应该报告"You feel a breeze"。例如,在上述的例子中,屋子(1,2)带有深渊,处于屋子(1,2), (0,2), (2,3), (1,1), and (1,3)都要报告这个感知。注意,如果有多于一个的邻近深渊,应该为每个深渊报告这个感知。
与深渊的感知类似,如果猛兽在当前屋子或邻近屋子,都应该报告闻到猛兽气味的感知。如果探险者杀死了猛兽,那么将不再报告这个感知。
问题点数:50、回复次数:15Top
1 楼kittypizza(极光)回复于 2004-12-03 22:02:24 得分 0
沙发,先坐了说。。。
一个字,强。。。
学习中。。。Top
2 楼superpig2k(superpig2k)回复于 2004-12-04 10:47:47 得分 0
呵呵,帮你顶一下Top
3 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2004-12-04 16:11:02 得分 0
帮忙顶一下..Top
4 楼army258(阿敏)回复于 2004-12-04 17:11:42 得分 0
分数太少,
能做也不会帮啊。Top
5 楼Flood1984(峰子)回复于 2004-12-04 17:21:32 得分 0
这个程序要是想锻炼,
自己写一下可以,
要别人帮写这么大的工程,
对自己有什么用呢?
Top
6 楼homtipo()回复于 2004-12-04 21:14:01 得分 0
很简单的嘛,以前我做过一个。 你留下你的电子邮件。 我的电子邮件是
homtipo@163.com
记得给我加分哟。Top
7 楼homtipo()回复于 2004-12-04 21:28:40 得分 50
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s \
on line %d\n", __FILE__, GetLastError(), api, __LINE__);}
class explore
{
private:
/* 定义洞穴数据结构 */
typedef struct _cave
{
bool _gold; //洞穴是否有黄金
bool _wumpus; //洞穴是否有猛兽
bool _pit; //不会是深渊吧
bool _exit; //难道是出口
bool _foot; //有印象这个地方应该走过吧
};
/* 定义玩家数据结构 */
typedef struct _player
{
int _x; //玩家当前的x坐标位置
int _y; //玩家当前的y坐标位置
bool bullet; //玩家是否拥有子弹
bool _gold; //也许挖掘到黄金了哟
int _direct; //玩家的方向 ( 0 - East 1 - South 2 - West 3 - North )
};
bool map_set; //用户定义了地图了吗
int x_max,y_max; //定义玩家定义地图最大值
public:
_cave atlas[100][100]; // 构造地图 ( 最大地图尺寸为 100x100 )
_player player1; // 建立一个新的玩家
explore(int,int); //初始化数据结构参数
void cls(); //清幕
void menu(); //选择菜单
void custom_map();
void start_game();
void shoot();
void grab();
void left();
void right();
void forward();
void climb();
void apperceive();
void move(int direct);
void help();
void pos();
bool path_judge(int direct); //判断前面是不是通的
void exit_game(); //退出游戏
};Top
8 楼homtipo()回复于 2004-12-04 21:30:29 得分 0
后面具体实现太多了。无法写上去。 你发电子邮件给我,然后我将源程序和可执行程序都发给你。记得加分哟。哈哈Top
9 楼superpig2k(superpig2k)回复于 2004-12-04 22:33:48 得分 0
这是哪所学校的c语言题目啊,留给什么院做的Top
10 楼cao12m(★草上飞★)回复于 2004-12-05 02:04:05 得分 0
进来都没工夫坐!!没沙发 走拉Top
11 楼qingyuan18(zealot_tang)回复于 2004-12-05 10:29:20 得分 0
我靠!!用c来做么??好强!!
关注ing...Top
12 楼homtipo()回复于 2004-12-05 19:13:25 得分 0
哈哈,已经发给你了,要是没有收到再给我留言吧Top
13 楼qrlvls( 空 气 )回复于 2004-12-05 19:56:51 得分 0
太可怜了,帮你顶Top
14 楼skyofdreams(梦想天空)回复于 2004-12-06 01:50:49 得分 0
呵呵, Text based game. 可以结了.Top
15 楼coyprightbao(Mr'Bao)回复于 2004-12-06 21:21:37 得分 0
非法交易!!!!!!!:)Top




