Проблема с вектором C++

Я пытаюсь создать проект «Крестики-нолики» для урока в Codecademy.

Проблема в том, что нам никогда не показывали, как создать 2D-вектор, поэтому я поискал его в Интернете и, по сути, это то, что я создал для своего файла:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void intro(){
    cout << "Let's play a game of Tic-Tac-Toe!\n Decide who goes first and enter your letters accordingly.\n First to match three letters in a row wins!\n\n";
}

int i;
int j;

int main(){

    intro();

    vector<vector<int>>board{{1,2,3},{4,5,6}};
    for(int i = 0; i < board.size(); i++){
        for (int j = 0; j < board.size(); j++)
            cout << board[i][j] << " " << endl;
    }

    return 0;
}

Я не могу распечатать настоящий 2D-вектор на терминале. Я планирую настроить входные значения позже в игре, поэтому я не могу использовать массив (я думаю). Любой совет приветствуется.

Я предполагаю, что для второго цикла вам очень хочется board[i].size()? Кроме того (а также несколько вредных привычек, непоследовательные отступы и нефатальное несовпадение типов) программа должна работать нормально . Пожалуйста, отредактируйте свой вопрос, чтобы предоставить нам более подробную информацию о ваших проблемах. Например, фактический и ожидаемый результат.

Some programmer dude 21.04.2024 23:30

@Someprogrammerdude извини, новичок во всем этом. Итак, мне нужно создать сетку 3x3, на которой вы играете в крестики-нолики, и заполнить ее заполнителями. Когда программа запускается, игроки вводят либо X, либо O в позицию на сетке 3x3. Вектор, который печатается, является одномерным.

user24549772 21.04.2024 23:41
vector<vector<int>>board{{1,2,3},{4,5,6}}; создает сетку 2x3, а не 3x3, board.size() == 2, а board[0].size() == 3
Igor Tandetnik 21.04.2024 23:47

@IgorTandetnik да, спасибо, что указали на это. Я занимался этим последние 6 часов и уже изрядно перегорел.

user24549772 21.04.2024 23:49

Если вам не нужно использовать индексы в цикле, рассмотрите более чистые циклы на основе диапазона: godbolt.org/z/qMfP1KK4c

paddy 21.04.2024 23:58

@paddy Я посмотрю на это. Codecademy еще не рассмотрела это.

user24549772 22.04.2024 00:07

Я никогда не просматривал эти онлайн-сайты по изучению языков, но определенно вижу много сомнительного кода от людей, которые их используют. Тот факт, что i и j являются глобальными переменными, является серьезным тревожным сигналом. И нет: вы не сталкиваетесь с ошибками компилятора. Новые программисты любят обвинять компилятор в вещах, которых они еще не понимают.

paddy 22.04.2024 00:15

Я никогда не видел доски для игры в крестики-нолики 2х3, заполненной цифрами.

n. m. could be an AI 22.04.2024 00:19

@n.m.couldbeanAI цифры являются заполнителями для реальных букв, которые будет вводить человек, запускающий программу.

user24549772 22.04.2024 00:23

@paddy Нет, VSC вообще не показывает цифры. Буквально скопировали и вставили один и тот же код из одного места в другое и получили другой результат.

user24549772 22.04.2024 00:24

Введите [c++] tic tac toe в поле поиска «Переполнение стека», и вы увидите некоторые из многих других вопросов, которые задавались о крестиках-ноликах. Это должно стать для вас хорошим источником идей при работе над другими частями вашей программы.

tbxfreeware 22.04.2024 00:29

Ваша программа действительна. Проблема не в VSC — это либо ваша конфигурация, либо неправильное использование. Правильная настройка VSC — распространенная проблема, о которой регулярно сообщается на сайте Stack Overflow. Документы VSC содержат очень подробные инструкции по настройке для разработки.

paddy 22.04.2024 00:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для одномерной матрицы мы инициализируем ее с помощью vector<int>, размер которой можно извлечь, просто получив размер вектора с помощью board.size().

Теперь, в вашем случае, когда это 2D-матрица, размер строк и столбцов может отличаться. В этом случае вы обычно можете извлечь размер строки, легко получив размер внешней матрицы по board.size(), а размер столбца, извлекая внутренний размер вектора board[0].size() (если мы предполагаем, что столбцы на всех уровнях строк одинаковы). В противном случае, если вы хотите получить размер столбца в каждой строке, вы можете получить его по board[i].size(), где i — индекс строки.

Аналогично для 3D это будет vector<vector<vector<int>>> и так далее...

Ниже приведен исправленный код:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void intro() {
    cout << "Let's play a game of Tic-Tac-Toe!\n Decide who goes first and enter your letters accordingly.\n First to match three letters in a row wins!\n\n";
}

int main() {
    intro();
   
    // 2x3 matrix here, rows = 2 & columns = 3
    vector<vector<int>> board{{1, 2, 3}, {4, 5, 6}};

    // iterating on each row
    for (int i = 0; i < board.size(); i++) {
        // iterating on each column within row
        for (int j = 0; j < board[0].size(); j++) { // Change to board[i].size() or board[0].size()
            cout << board[i][j] << " ";
        }
        cout << endl; // line break on moving to next row
    }
    return 0;
}

Спасибо за это, ваше объяснение имеет смысл и помогает мне лучше его понять. Еще раз спасибо

user24549772 22.04.2024 00:26

Другие вопросы по теме