小编Sli*_*ims的帖子

Java - 我的代码显然违背了常见的OOD范例,但不确定如何改进它

编辑:我非常感谢大家的意见.我从所有的反应中获得了一些东西,并且对OOD学到了很多东西.

我正在制作一个简单的虚拟桌面战争游戏.为了表示战场上的单位,我有以下简单的类层次结构:抽象类单元和两个派生类,即部队和车辆.

我有另一个类,它具有游戏中所有单元的哈希表.哈希表值是单元类型,因此我可以在O(1)时间内引用它们.

在大多数情况下,这很好,但有时候调用者需要知道某些东西是某个部队还是从这些派生类调用特定方法的工具.为了适应这种情况,我创建了两个get方法来强制执行这些类型:

  public Troop getTroop(String uniqueID) {
    Unit potentialTroop = get(uniqueID);
    if(potentialTroop instanceof Vehicle) {
      throw new InternalError();
    }
    return (Troop) potentialTroop;
  }

  public Vehicle getVehicle(String uniqueID) {
    Unit potentialVehicle = get(uniqueID);
    if(potentialVehicle instanceof Troop) {
      throw new InternalError();
    }
    return (Vehicle) potentialVehicle;
  }
Run Code Online (Sandbox Code Playgroud)

(注意它所属的类只扩展了Hashtable,所以这里使用的get方法是Java的hashtable的get方法.)

所以我认为这是糟糕的OOD设计,因为如果我进一步扩展单元,我将不得不为此哈希表添加更多检查和更多#get方法.

我说的是对的吗?如果是这种情况,是否有人有其他OOD建议?

java oop class hashtable

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

无法进入的基类

我正在用SDL写一个简单的游戏.我有一个类heirarchy,我正在构建我在游戏中使用的任何精灵.基类是Sprite,它包含碰撞框和spritesheet的数据抽象.直接在它下面是两个抽象类,Character和MapObject.

我目前正在实现从Character派生的Player类(Enemy和NPC也将派生自抽象Character类).

无论如何,希望这是有道理的.我的问题是:

当我尝试在引擎中使用播放器类时,我无法访问任何Sprite函数.

我收到以下错误:

'Sprite' is not an accessible base of 'Player'
Run Code Online (Sandbox Code Playgroud)

以下是头文件:

Sprite.h:

class Sprite{
public:
    virtual ~Sprite() = 0;  //I want this to be an abstract class and yes this is defined in the cpp

    //Initialization functions - MUST be called before anything else in the class can be used.
    void setupCollider(int xo, int yo, int ho, int wo);
    void setupSheet(SDL_Surface* dest, std::string file, int numClips, int ac, int _res, int sr);

    //SpriteSheet functions
    void setActiveClip(int a); …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance class

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

在这种情况下,我应该使用继承还是组合?

我正在写一个简单的游戏,很多游戏对象共享属性.我有两个可能的实现.

第一种是使用继承,如下图所示:

类层次结构

正如您所料,粗体类是抽象类.分支是实际使用的派生类.重要的是要注意这些类包含有关对象的数据,没有与它们相关的功能.

例如,部队和车辆有一个共同的界面,他们都用它来做诸如attack()和move()之类的事情.上面列出的类层次结构只是原始统计数据.此外,它们都是真正的ISA关系.

第二种实现使用组合.而不是上面的类层次结构,每个抽象类都是包含某些数据成员的"模块".因此,SpecialAbility有一个名为PointsValueObject的数据成员(虽然我更改了抽象的名称(尽管它们不再是抽象的),以反映它们的模块/属性性质).而且Troop有数据成员:PointsValueObject,PhysicalObject,PhysicalAttackObject和BattleOBject,它们每个都是存放有关部队数据的模块.同样,这些模块中不存在任何功能,它们仅用于存储数据.行为和功能仍然通过接口类实现.

我的问题是:人们通常更喜欢组合而不是继承,但在这种情况下,我倾向于坚持继承,因为ISA关系成立并且层次结构不包含行为,只包含数据.这个层次结构是好的OOD还是使用属性'modules'构建类更好?

java oop inheritance composition

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

Java - 关于碰撞处理和get()方法的HashMap混淆

我正在使用a HashMap并且我无法直接回答该get()方法在碰撞情况下的工作原理.

假设n > 1对象放在同一个键中.它们存放在一个LinkedList?它们是否被覆盖,以便只存在那个键中的最后一个对象?他们正在使用其他一些碰撞方法吗?

如果将它们放在a中LinkedList,有没有办法检索整个列表?如果没有,是否有其他内置的Java地图,我可以在其中执行此操作?

就我的目的而言,单独的链接是理想的,就像有冲突一样,我需要能够查看列表并获取有关其中所有对象的信息.在Java中最好的方法是什么?

感谢你的帮助!

java hashmap

4
推荐指数
2
解决办法
9819
查看次数

多人回合制游戏架构问题

我正在努力创建一个2D游戏,以便学习一些多人游戏的细节.在战略转弯的战斗中,游戏本身将使两名玩家的军队相互对抗.我正在开发它作为一个独立的桌面客户端(最后可能是一个手机应用程序).

我用Java编写游戏,我不信任客户端,因此我考虑了安全性.玩家将拥有一个个人帐户,其中包含军队列表和服务器上的内容.另外,我计划使用mySQL在服务器上存储这种数据.

但是,我不确定如何实现这一点.我是否使用类似网络服务器的东西?这似乎是错误的,但我不知道哪些技术可用于客户端不受信任的Java前端和后端.请注意,我不是在寻找关于最佳方法的辩论,我只需要了解概念,可能是一些示例技术,也许是教程的链接.

谢谢你的帮助!

java mysql webserver multiplayer

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

内存管理混乱C++

我无法理解C++中的一些基本内存管理原则.此代码是循环的一部分,循环是将迷宫文件读入2D矢量的函数的一部分.

根据Valgrind的说法,以下代码导致内存泄漏......

注意,它t是一个MazeNode对象,verts是t类中的一个向量,它包含指向节点对象的指针(不要与MazeNode对象混淆):

node* top = new node(TOP, rowCount, i, t.type);
node* bot = new node(BOTTOM, rowCount, i, t.type);
node* left = new node(LEFT, rowCount, i,  t.type);
node* right = new node(RIGHT, rowCount, i, t.type);

t.verts.push_back(top);
t.verts.push_back(bot);
t.verts.push_back(left);
t.verts.push_back(right);

temp.push_back(t);

top = NULL;
bot = NULL;
left = NULL;
right = NULL;
delete top;
delete bot;
delete left;
delete right;
Run Code Online (Sandbox Code Playgroud)

最初我没有在删除它们之前将每个指针设置为NULL,但是会出现分配错误.所以我只是将它们设置为NULL并且我的代码可以工作.我想我真的很困惑为什么这会导致内存泄漏以及为什么我需要将指针设置为NULL.有一种方法可以更轻松地执行此非指针方式,但也许这个问题可以帮助我更好地理解内存管理.

感谢大家.

编辑:这是MazeNode类(这就是't')(也可以原谅我在编写这个类时的懒惰,让每个公共像结构一样公开)

class MazeNode 
{
public:
    void setType(char c); …
Run Code Online (Sandbox Code Playgroud)

c++ pointers memory-management dynamic

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

我正在尝试实践多态性和OOD原则[在C++中].需要指导和回答几个问题

我正在编写一个以RPG元素迷宫为中心的简单2D游戏.它主要用于学习目的,用于练习类设计,图论算法,数据结构使用和使用2D图形.

该计划的简要概述:

游戏本身是基于平铺的.它当前生成并绘制迷宫到屏幕,允许玩家移动和墙壁的碰撞检测; 此外,它可以处理更大的迷宫的屏幕滚动.

无论如何,现在我正在构建一个处理在地图周围放置对象的对象.列表中的第一个是金币,然后是心和物品.我认为这是练习继承和多态的好时机,但我还没有接受过这种设计的正式培训.这是头文件:

#ifndef MAP_OBJECT_H
#define MAP_OBJECT_H

#include "Common.h"
#include "Utility Functions.h"

const int TILE_SIZE = 80;

class MapObject
{
public:


    MapObject(unsigned int nClips, unsigned int r, unsigned int c, unsigned int cSize)     :
         sheet(0), clips(0), row(r), col(c), numClips(nClips), clipSize(cSize)
    {
        //For those of you who aren't familiar with sprite sheet usage, basically this
        // handles which part of the sprite sheet your on, so it will draw the correct sprite to the screen
        if(numClips > 0) clips …
Run Code Online (Sandbox Code Playgroud)

c++ oop polymorphism sdl virtual-functions

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

如何在p4v中的流映射中排除目录

我正在使用 perforce 的可视客户端,并且我想从工作区中排除一个目录。在流之前,我只需导航到我的工作区,在树中找到该文件夹​​,然后将其排除(并且我在发现的许多其他相关问题中找到了此解决方案)。但是,现在我正在使用流,它不会让我这样做,我显然必须编辑流映射。

因此,我尝试在编辑流时将这一行添加到重新映射的框中:

-//NumberPlus/current/Library/... //nplus-mainline/current/Library/
Run Code Online (Sandbox Code Playgroud)

但是我只是收到一个错误:

Error in stream specification.
Error detected at line 24
Null directory (//) not allowed in '-//NumberPlus/current/Library/...'.
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,我使用的是 Windows 8.1。

version-control perforce

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