所以我开始为学校项目制作游戏。这是一个更简单的口袋妖怪版本,没有图形,只有文字。目前我的问题是我不知道如何存储所有口袋妖怪的数据库(每个个人统计数据),移动(带有他们的统计数据)等。
每个口袋妖怪(151个不同的)都有统计数据和每个移动(大约100个)的特定信息也有特定的统计数据和信息。所以我不能真正制作一个Pokemon类和151个扩展它的类。我能做的是制作一个Pokemon和Moves类的数组,并让Pokemon类(或移动类)的构造函数具有统计数据。
我遇到麻烦的是弄清楚如何将一个神奇宝贝(让皮卡丘滚动)给玩家(或我正在战斗的敌人)并编辑那个 one的统计数据,等级,经验等/ em>口袋妖怪。我不想改变游戏中每个皮卡丘的等级,只是玩家的特定皮卡丘和敌人的特定神奇宝贝。这有意义吗?
我是Java的新手,我不确定我会做什么。我看到有些人尝试做同样的事情,人们推荐使用XML或其他东西?我试图将它全部保存在Java中。
答案 0 :(得分:1)
一个非常简单的解决方案是(伪代码)
class Pokemon:
String name
String/int... other_stats
Array<Move> moves // This is a simple strategy to store any moves
// you want to associate with this pokemon.
class Move:
String name
int power
[...other move stats...]
要向玩家提供一个神奇宝贝,你只需要实例化一个带有名字的新口袋妖怪(例如“皮卡丘”),然后你会实例化一些“移动”对象以与刚刚创建的神奇宝贝相关联。所以,例如:
ArrayList<Move> moves = new ArrayList<Move>();
moves.add( new Move("Thunderbolt", 16) );
moves.add( new Move("Foobar", 10) );
Pokemon pikachu = new Pokemon( "Pikachu", moves )
// and now you can give pikachu to any player you want.
你可以为这个特殊的皮卡丘改变任何东西,或者你可以让另一个皮卡丘,或者一个Bulbasaur给另一个玩家。
要保存游戏状态,您可以使用toString方法以JSON / XML输出该对象的属性,然后您可以将它们保存在文本文件中。
这是一个相当简单的设计。当然,您可以使用复杂的设计模式,因为其他人建议增强功能。
答案 1 :(得分:1)
“我遇到麻烦的是弄清楚如何将一个神奇宝贝(让皮卡丘滚动)给玩家(或我正在战斗的敌人)并编辑那个玩家的统计数据,等级,经验等等。宠物小精灵。我不想改变游戏中每个皮卡丘的等级,只是玩家的特定皮卡丘和敌人的特定神奇宝贝。这有意义吗?“
嗯,你会在这个类型的领域有一个口袋妖怪课:
class PStats {
int defense = 1;
int attack = 1;
}
class Pokemon {
int level = 1;
long xp = 0;
PStats stats = new PStats();
}
然后以某种方式决定Pokemon的类型和潜在属性,无论你是将Pokemon作为超类并将其子类化,还是拥有这些东西的字段并从Java外部加载它们。
然后你的播放器将有一个你将要访问的ArrayList。
如果您希望玩家能够保存游戏并加载他们的宠物小精灵,您将不得不发明一种简单的文件格式并每次保存/加载。如果你想保存混合类型而不自己将所有格式化为字节,DataOutputStream和DataInputStream可能适用于此。
作为一个例子,你可能有一个如下所示的文件结构:
header, UTF (8 bytes) [FILE]
int, 4 bytes [number of Pokemon]
1st Pokemon chunk id [PKMN]
int, 4 bytes [level]
long, 8 bytes [experience]
[other fields...]
2nd Pokemon chunk id [PKMN]
[level]
and so on...
你可以在这里制作一个简单的UTF标题:
static final char[] PKMN {
'P', 'K', 'M', 'N'
};
虽然通常标题/字段ID是ASCII,您可以使用字节来执行此操作:
static final byte[] PKMN {
0x50, 0x4B, 0x4D, 0x4E
};
FILE标题是您想要识别文件的任何标题,因此您不依赖于扩展名。
如果要保存文件,只需循环遍历数组并将字段写入文件即可。然后,当您想从文件加载时,您将拥有如下基本结构:
// read header and anything else you put at the start of the file
while (/*next bytes are the PKMN id*/) {
Pokemon pToAdd = new Pokemon();
pToAdd.level = dis.readInt();
pToAdd.xp = dis.readLong();
// and so on
playerPokemon.add(pToAdd);
}
通过从文件指示的内容创建对象来重新创建玩家所拥有的一切。
如果您这样做,我建议您在一张纸上勾勒出您的文件结构,以便在编写IO时将它放在您面前。
答案 2 :(得分:0)
将数据存储在代码之外可能更易于管理。为了简单起见,我建议一个文本文件。您可以为文件的每一行使用逗号分隔值。只需将口袋妖怪信息存储在那里。
当程序加载时,询问两个玩家他们想要的口袋妖怪角色。然后读取你的文本文件。当你读取一个带有其中一个名字的行时,解析数据并创建你的口袋妖怪类的实例,填写统计数据。
至于移动,只需进入一个循环,一个玩家移动,然后移动另一个玩家。每个移动都可以作为Move对象存储在一个数组中,并带有该移动的统计数据。或者,如果你只是想记录它,并且一旦移动被操作(你的口袋妖怪的位置已经改变,或者口袋妖怪被损坏)你就不需要对移动统计做任何事情,那么你可以改为写动作info到文件而不是将对象放入数组。同样,您可以将其作为逗号分隔值存储在每次移动的行中。
答案 3 :(得分:0)
你总是可以让每个皮卡丘事件驱动。
从基本皮卡丘开始,然后记录影响统计数据,级别,经验等的每个事件。当您想要实际使用属性时,重播事件。只需将它们放入每个实例的列表中即可。
如果性能是一个问题,那么你可以拥有一个与个人皮卡丘相关联的“快照”,如果发生任何其他事件并根据需要重新计算,该快照将失效。
你甚至可以通过将这些事件与皮卡丘的个人身份联系起来来坚持这些事件。
(请注意,我对口袋妖怪一无所知。)
答案 4 :(得分:0)
您应该阅读strategy,abstract factory和访客3设计模式。
你的口袋妖怪常见的是它可以用不同的结果执行不同的攻击。这意味着攻击的逻辑非常复杂,并且依赖于攻击者和受害者。你可以使用策略模式。
此外,你必须扩展生物做一些动作,这可以使用Vistor模式来实现。
最后,您必须根据某些经验设置该生物。给他们特殊的攻击或形式。在这里你可以使用抽象工厂。
答案 5 :(得分:0)
我正在做一个类似的项目,除了它是一个2D神奇宝贝与基于执政官的战斗序列。我也在努力存储口袋妖怪的独特价值。我想出了两个解决方案,但我不确定哪个更有效。
解决方案1:许多很多类都扩展了抽象的Pokemon类,它包含类型,hp,level,stats等基本值,但是单独填充它们
解决方案2 :(我正在尝试的)一个通用的Pokemon类,它有一个不同的枚举作为id。枚举标识特定的口袋妖怪并在JDBC derby数据库中搜索值。举个例子:
public enumeration PokeId{
Pikachu(),
Mew(),
Ditto();
}
public class Pokemon{
private PokeId id;
public Pokemon(PokeId id){
this.id = id;
if(id == PokeId.Pikachu){
//load from derby
}
}
}
我不确定哪种更有效。我希望这对一些人有所帮助,我很乐意合作进一步开发像这样的代码。 谢谢!