用现代的OO C语言做这个的好方法?

jju*_*uma 5 c# c++ java data-structures

我有Tile一个代表游戏二维世界中瓷砖的东西.瓷砖的4面可以有任意数量的墙.我现在有这样的事情:

interface Tile {
    boolean isWallAtTop();
    boolean isWallAtRight();
    boolean isWallAtLeft();
    boolean isWallAtBottom();
}
Run Code Online (Sandbox Code Playgroud)

在其他地方我也有16个图像,每个图像可用于每个可能的图块墙配置.像这样的东西:

static final Image WALLS_ALL_AROUND = ...
static final Image WALL_ON_TOP_AND_RIGHT = ...
/* etc etc all 16 possibilities */
Run Code Online (Sandbox Code Playgroud)

我想写一个

static Image getWallImage(Tile tile)
Run Code Online (Sandbox Code Playgroud)

我想要避免的是经历诸如此类可能性的折磨

if (tile.isWallTop && tile.isWallRight 
    && !tile.isWallBottom && !tile.isWallLeft) {
    return WALL_ON_TOP_AND_RIGHT;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道这样做的可行方法?

Ada*_*ght 15

去小工具位掩码.每个瓷砖使用4位掩模,说明哪一面有墙.

A B C D
Run Code Online (Sandbox Code Playgroud)

位A表示顶部的墙,B表示右侧,C表示底部,D表示左侧.定义常量以帮助您在逻辑上与蒙版相交,即

if (tile.Walls & (WALL_LEFT | WALL_RIGHT))
  // Do stuff
Run Code Online (Sandbox Code Playgroud)

为了找到图像,这个4位掩码产生16种可能性.使用它作为图像"数组"的索引,这样您就可以毫不费力地直接找到正确的图像.

  • 位掩码是IMO错误的解决方案(通常是一个丑陋的黑客攻击).OP的代码纯粹是程序性的,他要求提供OO解决方案. (5认同)
  • *16*常量对象,包含4个布尔字段(总共64个字段).这比简单的位掩码更好*?以什么方式?您捕获了哪些通用,可重用的功能?这种基础设施支持哪些可扩展的情况?此外,这是如何避免他想避免的情况,需要4个布尔测试来检查是否只设置了一个墙(相对于简单的逻辑操作)? (3认同)