标签: adventure

关于基于类的文本冒险游戏设计的质疑.

我整个夏天都在学习C#,现在感觉就像我到目前为止做的一个小项目.我决定采用一种基于文本的冒险游戏.

游戏的基本结构将涉及具有多个扇区(或房间).进入房间后,将输出描述并采取一些行动等等; 能够检查,拾取,使用那个房间里的东西; 可能是战斗系统等等.扇区可以连接多达4个其他扇区.

无论如何,在纸上涂写关于如何为此设计代码的想法,我对我的部分代码的结构感到头疼.

我已经决定了一个球员级别,以及一个代表级别/地牢/区域的"级别"级别.这个级别的课程将由许多相互关联的"部门"组成.在任何给定时间,玩家将出现在该级别中的某个特定部门中.

所以这就是混乱:

从逻辑上讲,人们会期望像player.Move(Dir d)
这样的方法这样的方法应该改变关卡对象中的"当前扇区"字段.这意味着类Player需要知道类级别.嗯.并且Level可能必须操纵Player对象(例如,玩家进入房间,被某些东西伏击,从库存中丢失一些东西.)所以现在Level还需要持有对玩家对象的引用?

这感觉不太好; 一切都必须提到其他一切.

在这一点上,我记得从我正在使用的书中读到有关代表的内容.虽然我知道C++中的函数指针,但有关代表的章节中提供了一些带有"基于事件"编程观点的例子,我对此并没有多少启示.

这给了我设计类的想法如下:

玩家:

class Player
{
    //...

    public delegate void Movement(Dir d);   //enum Dir{NORTH, SOUTH, ...}

    public event Movement PlayerMoved;

    public void Move(Dir d)
    {        
        PlayerMoved(d);

        //Other code...
    }

}
Run Code Online (Sandbox Code Playgroud)

水平:

class Level
{
    private Sector currSector;
    private Player p;
    //etc etc...

    private void OnMove(Dir d)
    {
        switch (d)
        {
            case Dir.NORTH:
                //change currSector
                //other …
Run Code Online (Sandbox Code Playgroud)

c# oop delegates adventure

14
推荐指数
1
解决办法
1378
查看次数

在文本冒险中编码交互

编辑:如果你不能阅读这个庞大的问题,我会在底部写一个摘要.

我目前正在研究一种用于C#的文本冒险的"框架",作为编码练习.在此框架中,可能的操作由"交互"类定义.

潜在的"可操作"对象是库存物品(棍子,枪,剑),环境物品(墙,门,窗)和角色(人,动物).其中每个都有一个属性,它是一个交互列表.目前,交互基本上是一个"动作/响应"名称值对.当您键入"粉碎窗口"时,它会查看播放器可用的所有可操作项目并匹配主题(在本例中为"窗口").然后确定操作是"粉碎"并在窗口上的交互列表(环境项)中查找以获得对Smash操作的响应,然后将其写入控制台.

这一切都已完成,但这就是我被困的观点:

一个行动有任何数量的潜在后果,每个潜在的互动都会有所不同.这些是:

- 通过查找交互,可能与第二个主题,返回描述操作结果的响应

EITHER - 动作的主题(库存项目,环境项目或角色)改变它的描述EG."冲墙"可以改变墙的描述来描述墙上的凹痕 或者 - 动作的主体被另一个项目EG替换."粉碎瓶子"导致"瓶子"变成"破瓶子"或"杀死约翰"导致角色约翰被环境项目"约翰的尸体"取代.

- 返回描述先前变化EG的响应."破碎的瓶子散落在地板上."

- 区域的描述已更改.例如."粉碎灯泡"导致房间的描述改变以描述黑色的房间

- 从库存或环境EG添加/删除项目."拿起瓶子".您现在在库存中有一个瓶子,瓶子已从环境中移除.

- 可以移动的方向和它们导致的区域改变EG."用钥匙解锁门"允许您将东移到另一个房间

- 将玩家移动到新区域EG."往北走"带你到另一个地方.

我需要以某种方式确定特定交互应该调用哪些后果,并调用它们.一项行动可能会使用其中的一些后果,或只是一种.

例如,如果项目是瓶子:

" 用水填充瓶子 "将首先返回一个回复,描述您已用水填充瓶子.然后它将用"瓶装水"物品替换"瓶子"物品.这是两个后果,返回响应并替换项目.

说你当时要" 在窗口扔一瓶水 ".这更复杂.它会首先返回一个描述发生事件的响应,瓶子和窗口都会粉碎,水会到处流动.瓶子将从玩家的库存中移除.接下来," 瓶装水 "将被"破瓶"取代,"窗户"将被"破窗"取代.区域描述也会改变以反映这一点.这是五个后果,返回响应,从库存中删除项目,替换两个项目并更新当前区域的描述.

正如您所看到的,我需要一种通用的方法,能够在每个"交互"的基础上定义该操作的后果,并适当地更新其他对象,例如Item,Player(用于库存)和Area.

如果不清楚我很抱歉,我会尽力澄清是否有人有任何疑问.

编辑:我有没有办法在交互上定义一个方法,我可以通过多种方法调用(及其参数)?返回的初始响应将是默认的强制结果,如果指定则可能有额外的响应.

例如,在上面的例子中,对于第一次交互,"填充水",我会告诉它返回一个响应("你已用水填充瓶子")并且还调用一个ReplaceItem方法来取代"瓶子"用"一瓶水".

对于第二次交互,我会告诉它返回一个响应("瓶子通过空气冲进......"),在动作主题上调用RemoveFromInventory,在瓶子上调用UpdateStatus("瓶子被粉碎")并且窗口("窗口被粉碎")并调用UpdateAreaDescription来更改当前区域的描述("你正站在一个单一窗口的房间里,玻璃碎成碎片").

这听起来可行吗?为了所有不同的可能交互,我试图尽可能保持通用.

编辑2:进一步澄清,并试图总结问题:

在我的游戏中,有Actionable对象(一个瓶子,一面墙,John).每个Actionable对象都有一个Interaction对象列表,描述了玩家如何与它们进行交互.此时,Interaction具有"Name"属性("throw","hit","break")并返回Response("You throw the").

我试图解决的问题是,交互还需要做许多其他事情,每个特定的交互都会有所不同.我们以一个玻璃瓶为例.

"扔玻璃瓶"
- 返回一个回复("你扔了玻璃瓶.")
- "瓶子",从玩家的库存中删除.
- 用新的替换来反映变化.("瓶子"替换为"破瓶子").
- 返回第二个响应("玻璃瓶的碎片散落在地板上").

"在窗口扔玻璃瓶"
- 返回一个响应("你把玻璃瓶扔在窗户上.")
- 从玩家的库存中删除对象"瓶子".
- 将对象替换为新对象以反映更改.("瓶子"替换为"破瓶子").
- 第二个可选对象替换为new以反映更改.("窗口"替换为"破窗").
- 更新当前Area的"Description"属性.("你站在一个房间里,只有一个破窗户.").

当我创建交互时,如何更改它们执行的其他操作,例如主题的状态更改或当前区域描述的更改?

如果你需要更多上述行动的例子,请告诉我,我会再做一些.

.net c# text adventure

10
推荐指数
1
解决办法
2454
查看次数

Python实例化模块中的所有类

我工作的一个基于文本的冒险游戏,并拥有一个具有所有的动作类,例如模块Move(Action),Look(Action).我需要一种方法,将模块中作为类的子类的所有类实例Action化为如下列表:

actions = [Move(), Look()]
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,而无需通过键入他们的名称单独实例化类?

python adventure python-3.5

9
推荐指数
1
解决办法
1368
查看次数

基于文本的冒险游戏

我正在监督一个技术营地,其中一个营员为一个基于文本的视频游戏创建了一些代码,他无法显示结果.当程序编译并正确运行时,当选择"治疗"时它不会增加玩家的健康状况,当用户选择"攻击"时我们也会得到零.我对编程知识有限,并且我尽力帮助他,以便他在这里的经历将是愉快和充实的.如果您能提供任何帮助或建议,我们将非常感激.这是代码:

// Test for hard stuff.cpp : Defines the entry point for the console application.
//
// Bigger proj
// Constructors will make characters with rolling statistics

#include "stdafx.h"
#include <iostream>
#include <string> 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;
// declaring function for hit power
//int power( int str, int def);

    int command;


class character
{
public:
    character();
    //~character();
    string name;
    float str;
    float def;
    float health;   // hit points
    float regen;    // health regen amount
    float …
Run Code Online (Sandbox Code Playgroud)

c++ class adventure game-engine

7
推荐指数
2
解决办法
5401
查看次数

文本冒险在某一行后意外停止.

我一直致力于文本冒险,一切顺利,直到达到一行代码.我的朋友非常擅长编程无法弄清楚出了什么问题,所以他做了一些测试但仍然没有好结果.我需要你的帮助,因为他不是最伟大的.这是迄今为止的代码.尝试测试它,直到遇到不接受任何输入的错误.首先选择ax,然后选择帮助,然后是,然后继续,然后停止接受.

主类代码:

package main;

import java.awt.*;
import java.util.*;

import javax.swing.*;

public class Main 
{
public static String thetext;
public static int test;
public static boolean boo;
public static Scanner scan=new Scanner(System.in);
public static JFrame window = new JFrame();
public static JPanel panel = new JPanel();
public static JTextArea out = new JTextArea();
public static JTextField in = new JTextField(30);
public static boolean debug_mode = true;

public static void main (String[] a)
{
    window.setSize(640, 480);
    window.setTitle("CtaQuest_A_Text_Adventure");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLocation(200, 200);
    window.setVisible(true);
    window.setResizable(false); …
Run Code Online (Sandbox Code Playgroud)

java maintainability text adventure switch-statement

5
推荐指数
1
解决办法
568
查看次数

如何为文本冒险游戏实现调度表?

在C#中进行文本冒险,有人建议我使用调度表而不是switch语句.

这是switch语句代码:

        #region Public Methods
        public static void Do(string aString)
        {
                if(aString == "")
                        return;

                string verb = "";
                string noun = "";

                if (aString.IndexOf(" ") > 0)
                {
                        string[] temp = aString.Split(new char[] {' '}, 2);
                        verb = temp[0].ToLower();
                        noun = temp[1].ToLower();
                }
                else
                {
                        verb = aString.ToLower();
                }

                switch(Program.GameState)
                {
                        case Program.GameStates.Playing:
                                if (IsValidInput(Commands, verb, true))
                                {
                                        switch(verb) //this is the switch statement
                                        {
                                                case "help":
                                                case "?":
                                                        WriteCommands();
                                                        break;
                                                case "exit": …
Run Code Online (Sandbox Code Playgroud)

c# adventure dispatch-table

4
推荐指数
1
解决办法
1262
查看次数

使用Switch-blocks解析Text Adventure的输入?

好的,我现在有一个目标是进行基本的文本冒险.但是,要做到这一点,我需要/想要一个可以执行以下操作的switch语句:

  • 检查一个字符串是否在里面有一个单词SOMEWHERE.
  • 检查一个字符串是否在内部的任何组合中有两个单词.

我怎么做到这一点?你能告诉我这个具体例子的编码吗:

提示用户输入数据.switch语句将"look box"视为一种情况,并将"sleep"视为另一种情况.程序不关心任何单词的顺序,但是关心字母的顺序.

请详细解释一切.我刚刚开始编码.

编辑:谢谢你的所有答案.我知道有更好,更复杂,更有用的处理方法,但它还不是我的水平.

c# string adventure switch-statement text-based

2
推荐指数
1
解决办法
3468
查看次数

Objective-C中的简单自然语言解析器

我正在为Mac OS X v10.6构建这个应用程序

我正在构建一个基于文本的冒险,我创建了一个非常简单的自然语言解析器,可以处理用户键入的命令.到目前为止它工作得很好并且可以解析句子,例如:"拿剑"或"在盒子里看"

我要做的是为不同的单词创建一个别名列表,使输入命令不那么严格.因此,例如"take"可能具有别名"grab"或"go"可能具有别名"move,walk,or travel"

我已经尝试创建一个NSDictionary,其中键是单词,值是一个别名的NSArray.问题是,当确定输入的命令是否与可用命令匹配时,我将不得不使用用于密钥的单词引用别名.

我希望能够使用任何别名来引用任何其他别名.有谁知道这样做的好方法?

我的另一个想法(但似乎效率低下)是将每组别名存储在一个数组中.在解析时,我会找到包含我想要匹配的单词的数组,并尝试匹配该数组中的所有其他单词.

nlp objective-c adventure text-based

2
推荐指数
1
解决办法
1787
查看次数

OCaml:设计文本冒险游戏的数据类型

我正在尝试制作一个简单的天真文本冒险游戏(基本一页)来学习OCaml.

游戏是关于制作游戏引擎,所以关于房间,项目等的所有信息都存储在json文件中.

示例json文件将如下所示:

{
  "rooms":
  [
    {
      "id": "room1",
      "description": "This is Room 1.  There is an exit to the north.\nYou should drop the white hat here.",
      "items": ["black hat"],
      "points": 10,
      "exits": [
        {
          "direction": "north",
          "room": "room2"
        }
      ],
      "treasure": ["white hat"]
    },
    {
      "id": "room2",
      "description": "This is Room 2.  There is an exit to the south.\nYou should drop the black hat here.",
      "items": [],
      "points": 10,
      "exits": [
        {
          "direction": "south",
          "room": "room1"
        } …
Run Code Online (Sandbox Code Playgroud)

ocaml adventure game-engine data-structures

2
推荐指数
1
解决办法
350
查看次数

基于选择的冒险游戏的数据结构?

我正在VB.NET 2010中设计一个基于选择的冒险游戏,在那里你会看到一个故事标签,你可以选择2个按钮,你想要做出哪个选择.我想知道最有效的方法.

我的目标是以某种形式的数据结构存储按钮和故事的标签,这是暂时的哈希表,以及某种形式的选择结构.现在我使用的是一个自定义类,它引用了下两个选项的索引以及它们各自的标签索引,它们将类实例存储在一个哈希表中.我已经研究了数组,词典,列表和集合等内容,但我不确定哪一个最适合我所追求的内容.任何.NET数据结构都可以.这两个数据的最有效数据结构是什么?只是一个字符串数组工作?

.net vb.net adventure data-structures

1
推荐指数
1
解决办法
1383
查看次数

在Text-adventure中匹配用户选择的问题.

我目前正在python中进行简单的文本冒险.基本上我希望randint选择1或2然后分配给right_wire,然后raw_input为wire_choice,然后匹配2以提供所需的结果.我相信你们可以弄清楚我到底想做什么.我在这附近还是离开了?谢谢!

    right_wire = randint(1, 2)

    wrong_wire = 0

    if right_wire == 1:
        wrong_wire = 2
    elif right_wire == 2:
        wrong_wire = 1
    else:
        print "ERROR"

    while True:
        print "Which wire do you pull?"
        print
        print "1. The red one."
        print "2. The blue one."
        print
        wire_choice = raw_input('*>>*')

        if wire_choice == 1 and right_wire == 1:
            print "**BOMB DEFUSED**"
            return 'engineering2'
        elif wire_choice == 2 and right_wire == 2:
            print "**BOMB DEFUSED**"
            return 'engineering2'
        elif wire_choice == 1 and right_wire …
Run Code Online (Sandbox Code Playgroud)

python adventure python-2.7 text-based

1
推荐指数
1
解决办法
173
查看次数