【问题标题】:Is it possible to convert an element of a char arrary into a const char?是否可以将 char 数组的元素转换为 const char?
【发布时间】:2017-04-17 17:31:41
【问题描述】:

我不想将 char 数组转换为 const char 数组,而是在元素获得特定值后使其成为常量。这个,我需要一个井字游戏。当一个格子得到X或O的值时,它需要是不可改变的,以确保玩家不能将X和O放在已经被占用的格子上。

我搜索过它(在 google 和 stackoverflow 上),但到目前为止这似乎是不可能的。这种方法是错误的吗?我不想改变整个程序来解决这个问题,所以我需要一些其他的方法来确保玩家不会改变网格。

【问题讨论】:

  • const 是一个编译时特性。听起来您需要根据运行时输入来防止某些内容发生变化。
  • 是的,完全是@aschepler。但是我该怎么做呢?
  • 你说的是什么类型的数组?普通的旧数据 C 样式数组? char squares[9] 之类的东西?
  • 这样使用const 特性是不可能的,因为它是一个编译时特性,你需要在编译代码时知道const 是什么。可以创建一个自定义的Cell 类,其中唯一的突变器检查字符是否为空,但这可能是矫枉过正;更好的解决方案可能是只进行运行时检查,以确保一旦设置值就永远不会更改。

标签: c++ tic-tac-toe


【解决方案1】:

没有办法让数组的某些元素成为 const 而让其他元素保持可变(即非常量)。相反,请考虑为每个部分创建一个对象,其中包含锁定值的方法。例如,考虑以下课程大纲:

class Piece {
    public:
        Piece();
        void LockValue();
        void SetValue(char c);
        char GetValue();
        bool GetIsLocked();

    private:
        char value;
        bool isLocked;
};

现在您可以通过以下方式实现 SetValue:

  • 在尝试更改任何内容之前检查 isLocked 的值
  • 在第一次调用后将 isLocked 设置为 true。

现在您可以创建这些对象的数组并使用它们来实现所需的功能。

【讨论】:

  • 谢谢!这似乎是一种巧妙的方式,但我实现了 devalone 的想法。对我来说更容易!
【解决方案2】:

const 是为开发人员制作的。它只是告诉编译器一个值是不可更改的,允许编译器进行一些优化并防止程序员出错。

在您的情况下,您必须编写自己的代码来保护您的领域。例如,您可以使用空格符号 (' ') 初始化每个字段,并在更改单元格的值之前检查当前值……仅当值是空格符号时才允许更改。

【讨论】:

  • 请不要随意省略单词
  • 这只是我糟糕的英语:)
  • 谢谢!我将 cin(获取要更改的网格编号)放在一个循环中,该循环仅在该网格既不是 X 也不是 O 时终止。
【解决方案3】:

您可以使用背景布尔网格来跟踪位置是否已用完...如果玩家已经使用它,则为真,否则该位置将为假,任何人都可以使用它。

//general code
char grid[3][3];
bool alreadyUsed[3][3] = {{false,false,false},{false,false,false},{false,false,false}};

if(alreadyUsed[playerChoiceX][playerChoiceY] == false)
{
    grid[playerChoiceX][playerChoiceY] = playerTurn;   //playerTurn is X or O
    alreadyUsed[playerChoiceX][playerChoice] = true;
}
else
    cout << "Position already used, select another position.\n";

编辑:我知道这并不能回答你的问题,但它会帮助你完成游戏。希望对你有帮助。

【讨论】:

  • 谢谢,这是个好主意!
  • 说实话,你甚至不需要一个 bool 已经使用的二维数组。 if(!(grid[playerChoiceX][playerChoiceY] == 'X' || grid[playerChoiceX][playerChoiceY] == 'O')) 网格[playerChoiceX][playerChoiceY] = playerTurn; //playerTurn 是 X 或 O
  • 是的!我正是这样做的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多