我整个夏天都在学习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#的文本冒险的"框架",作为编码练习.在此框架中,可能的操作由"交互"类定义.
潜在的"可操作"对象是库存物品(棍子,枪,剑),环境物品(墙,门,窗)和角色(人,动物).其中每个都有一个属性,它是一个交互列表.目前,交互基本上是一个"动作/响应"名称值对.当您键入"粉碎窗口"时,它会查看播放器可用的所有可操作项目并匹配主题(在本例中为"窗口").然后确定操作是"粉碎"并在窗口上的交互列表(环境项)中查找以获得对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"属性.("你站在一个房间里,只有一个破窗户.").
当我创建交互时,如何更改它们执行的其他操作,例如主题的状态更改或当前区域描述的更改?
如果你需要更多上述行动的例子,请告诉我,我会再做一些.
我工作的一个基于文本的冒险游戏,并拥有一个具有所有的动作类,例如模块Move(Action),Look(Action).我需要一种方法,将模块中作为类的子类的所有类实例Action化为如下列表:
actions = [Move(), Look()]
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,而无需通过键入他们的名称单独实例化类?
我正在监督一个技术营地,其中一个营员为一个基于文本的视频游戏创建了一些代码,他无法显示结果.当程序编译并正确运行时,当选择"治疗"时它不会增加玩家的健康状况,当用户选择"攻击"时我们也会得到零.我对编程知识有限,并且我尽力帮助他,以便他在这里的经历将是愉快和充实的.如果您能提供任何帮助或建议,我们将非常感激.这是代码:
// 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) 我一直致力于文本冒险,一切顺利,直到达到一行代码.我的朋友非常擅长编程无法弄清楚出了什么问题,所以他做了一些测试但仍然没有好结果.我需要你的帮助,因为他不是最伟大的.这是迄今为止的代码.尝试测试它,直到遇到不接受任何输入的错误.首先选择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) 我在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) 好的,我现在有一个目标是进行基本的文本冒险.但是,要做到这一点,我需要/想要一个可以执行以下操作的switch语句:
我怎么做到这一点?你能告诉我这个具体例子的编码吗:
提示用户输入数据.switch语句将"look box"视为一种情况,并将"sleep"视为另一种情况.程序不关心任何单词的顺序,但是关心字母的顺序.
请详细解释一切.我刚刚开始编码.
编辑:谢谢你的所有答案.我知道有更好,更复杂,更有用的处理方法,但它还不是我的水平.
我正在为Mac OS X v10.6构建这个应用程序
我正在构建一个基于文本的冒险,我创建了一个非常简单的自然语言解析器,可以处理用户键入的命令.到目前为止它工作得很好并且可以解析句子,例如:"拿剑"或"在盒子里看"
我要做的是为不同的单词创建一个别名列表,使输入命令不那么严格.因此,例如"take"可能具有别名"grab"或"go"可能具有别名"move,walk,or travel"
我已经尝试创建一个NSDictionary,其中键是单词,值是一个别名的NSArray.问题是,当确定输入的命令是否与可用命令匹配时,我将不得不使用用于密钥的单词引用别名.
我希望能够使用任何别名来引用任何其他别名.有谁知道这样做的好方法?
我的另一个想法(但似乎效率低下)是将每组别名存储在一个数组中.在解析时,我会找到包含我想要匹配的单词的数组,并尝试匹配该数组中的所有其他单词.
我正在尝试制作一个简单的天真文本冒险游戏(基本一页)来学习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) 我正在VB.NET 2010中设计一个基于选择的冒险游戏,在那里你会看到一个故事标签,你可以选择2个按钮,你想要做出哪个选择.我想知道最有效的方法.
我的目标是以某种形式的数据结构存储按钮和故事的标签,这是暂时的哈希表,以及某种形式的选择结构.现在我使用的是一个自定义类,它引用了下两个选项的索引以及它们各自的标签索引,它们将类实例存储在一个哈希表中.我已经研究了数组,词典,列表和集合等内容,但我不确定哪一个最适合我所追求的内容.任何.NET数据结构都可以.这两个数据的最有效数据结构是什么?只是一个字符串数组工作?
我目前正在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) adventure ×11
c# ×4
text-based ×3
.net ×2
game-engine ×2
python ×2
text ×2
c++ ×1
class ×1
delegates ×1
java ×1
nlp ×1
objective-c ×1
ocaml ×1
oop ×1
python-2.7 ×1
python-3.5 ×1
string ×1
vb.net ×1