2017-04-17 109 views
0

我不想将char数组转换成const char数组,但是在得到特定值后使元素保持不变。这,我需要一个tic tac toe游戏。当电网获得X或O的价值时,它必须是不可改变的,以确保玩家不能将X和O放在已经采取的电网上。是否有可能将char arrary的元素转换为const char?

我搜索了它(谷歌和stackoverflow),但到目前为止,它似乎不可能。这种方法是错误的吗?我不想改变整个程序来克服这个问题,所以我需要一些其他方法来确保玩家在采取后不更改网格。

+2

'const'是一个编译时功能。这听起来像你需要根据运行时输入来防止更改。 – aschepler

+0

完全是@aschepler。但我该怎么做? –

+0

你在说什么类型的数组?普通的旧数据C型阵列?像'char square [9]'? – sergiol

回答

2

const是为开发者制作的。它只是告诉编译器一个值是不可改变的,允许编译器进行一些优化并避免编程错误。

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

+0

请不要随意忽略单词 –

+0

这只是我可怕的英语:) – devalone

+0

谢谢!我把一个循环中的cin(即得到网格编号,它将被改变),只有当该网格既不是X也不是O时终止。 –

4

没有办法让数组中的某些元素为const,而让其他元素变为可变(即非const)。相反,请考虑为每个包含锁定值的方法创建一个对象。举个例子,下面的类轮廓:

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

    private: 
     char value; 
     bool isLocked; 
}; 

现在你可以以这样的方式实现的SetValue它:

  • 检查isLocked之前它试图改变什么
  • 设置值在第一次通话后锁定为真。

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

+0

谢谢!这似乎是一个整洁的方式,但我实现了devalone的想法。对我来说更容易! –

0

你可以使用一个背景布尔格来跟踪位置是否已经用完或者没有...如果玩家已经使用了它,它将是真的,否则位置将是错误的,任何人都可以使用它。

//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"; 

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

+0

谢谢,这是一个不错的主意! –

+0

说实话,你甚至不需要一个布尔已经使用的二维数组。 if(!(grid [playerChoiceX] [playerChoiceY] =='X'|| grid [playerChoiceX] [playerChoiceY] =='O')) grid [playerChoiceX] [playerChoiceY] = playerTurn; // playerTurn是X或O – amzshow

+0

是啊!我是那么做的。 :) –

相关问题