简体   繁体   中英

Need assistance with a for loop in Tic Tac Toe game

My program is exiting without iterating. It automatically goes to "YOU WON". Without the champion function the program runs fine. Its probably some obvious error Im missing. If anyone could please I would greatly appreciate it.

#include <iostream>
#include <string>

#define GRID_SIZE 3

class TicTacToe {
private:
    char map[GRID_SIZE][GRID_SIZE];

public:

    void champion() {
        const char *possiblities[8]{
                "123"
                "456"
                "789"
                "147"
                "159"
                "258"
                "369"
                "753"
        };

        for (int i = 0; i < 8; i++) {
            bool winner = true;
            char previous_pos = '0';
            const char *possible_moves = possiblities[i];

            for (int index = 0; index < GRID_SIZE; index++) {
                char character = possible_moves[i];
                int entered_num = character - '0';
                int grid_space = entered_num - 1;
                int row = index / GRID_SIZE;
                int col = index % GRID_SIZE;

                char grid_coordinate = map[row][col];

                if (previous_pos == '0') {
                    previous_pos = grid_coordinate;
                } else if
                        (previous_pos == grid_coordinate) {
                    continue;
                } else {
                    winner = false;
                    break;
                }
            }
            if (winner = true) {
                std::cout << "YOU WON" << std::endl;
                exit(0);
                break;
            }

        }


    }

    void playgame() {
        std::string input;

        while (true) {
            std::cout << "Go player one" << std::endl;
            getline(std::cin, input);
            if (input != " ") {
                char entered = input.c_str()[0];

                if (entered >= '1' && entered <= '9') {
                    int entered_num = entered - '0';
                    int index = entered_num - 1;
                    int row = index / 3;
                    int col = index % 3;
                    char grid_position = map[row][col];

                    if (grid_position == 'X' || grid_position == 'O') {
                        std::cout << "Space taken. Try again" << std::endl;
                    } else {
                        map[row][col] = (char) 'X';
                        break;
                    }

                } else {
                    std::cout << "Only numbers 1 - 9" << std::endl;
                }
            } else {
                std::cout << "Have to enter something, try again" << std::endl;
            }


        }
    }

    void generateGrid() {
        int number = 1;

        for (int x = 0; x < GRID_SIZE; x++) {
            for (int y = 0; y < GRID_SIZE; y++) {
                map[x][y] = std::to_string(number).c_str()[0];
                number += 1;
            }
        }
    }

    void tictacToeMap() {


        std::cout << std::endl;

        for (int x = 0; x < GRID_SIZE; x++) {
            for (int y = 0; y < GRID_SIZE; y++) {
                std::printf(" %c ", map[x][y]);
            }
            std::cout << std::endl;
        }

    }


    TicTacToe() {
        generateGrid();
        while (true) {
            tictacToeMap();
            playgame();
            champion();


        }
    }
};


int main() {

    TicTacToe tic;
    tic.playgame();


    return 0;


}

The problem is here:

if (winner = true) {
                std::cout << "YOU WON" << std::endl;
                exit(0);
                break;
            }

You probably meant:

if (winner == true) {
                std::cout << "YOU WON" << std::endl;
                exit(0);
                break;
            }

First, do what Max Meijer said, by replacing if(winner = true) with if(winner == true) . But the program is still broken. The problem is that in your string array, you are not separating each string with a comma, so when my debugger hits const char *possible_moves , it ends up just assigning the entire array concatenated together. So just separate each string in the possibilities array with a comma, like so:

const char *possiblities[8]{
                "123",
                "456",
                "789",
                "147",
                "159",
                "258",
                "369",
                "753"
        };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM