TicTacToe作弊

时间:2014-03-26 04:27:47

标签: objective-c random tic-tac-toe

我创造了一款TTT游戏。但是我遇到了人工智能的问题。如何避免这种情况发生,以便在chooseCellRow:Col方法中它只返回一个尚未被任何一个玩家选中的随机点?

- (void) chooseCellRow:(NSInteger)row Col:(NSInteger)col
{
    //pick random spot for computer's turn
    row = random()%2;
    col = random()%2;

        if (row == 0 && col == 0) {
            [but00 setTitle:@"X" forState:0];
        }
        else if (row == 0 && col == 1) {
            [but01 setTitle:@"X" forState:0];
        }
        else if (row == 0 && col == 2) {
            [but02 setTitle:@"X" forState:0];
        }

        else if (row == 1 && col == 0) {
            [but10 setTitle:@"X" forState:0];
        }
        else if (row == 1 && col == 1) {
            [but11 setTitle:@"X" forState:0];
        }
        else if (row == 1 && col == 2) {
            [but12 setTitle:@"X" forState:0];
        }

        else if (row == 2 && col == 0) {
            [but20 setTitle:@"X" forState:0];
        }
        else if (row == 2 && col == 1) {
            [but21 setTitle:@"X" forState:0];
        }
        else if (row == 2 && col == 2) {
            [but22 setTitle:@"X" forState:0];
        }
}

2 个答案:

答案 0 :(得分:0)

作弊是一种道德概念,不适用于计算机,因为它完全按照你的要求去做。但是,如果单元格已被占用,可以通过简单地再次选择来阻止这种情况,伪代码:

row = random() % 3;
col = random() % 3;
while cell[row][col] != empty:  # Add your REAL detection code here.
    row = random() % 3;
    col = random() % 3;

您还会注意到上述代码也会阻止作弊。羞辱你只允许计算机选择九种可能中的四种: - )

% 2应用于某个号码会为您提供01,您还需要使用% 3来同时允许2


根据您的评论,您有一个包含占据该单元格的字符的单元格数组,在您找到空白单元格之前,代码将继续执行:

do {
    row = random() % 3;
    col = random() % 3;
} while (cell[row][col] != ' ');

答案 1 :(得分:0)

一种简单的方法是保留未使用的位置列表并从该列表中进行选择。当任一玩家移动时,从列表中移除他们选择的位置。

另一种更简单但效率更低的方法是让它选择任何位置,但如果它所选择的位置已被占用,请再试一次。