Я пытаюсь создать проект «Крестики-нолики» для урока в 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-вектор на терминале. Я планирую настроить входные значения позже в игре, поэтому я не могу использовать массив (я думаю). Любой совет приветствуется.
@Someprogrammerdude извини, новичок во всем этом. Итак, мне нужно создать сетку 3x3, на которой вы играете в крестики-нолики, и заполнить ее заполнителями. Когда программа запускается, игроки вводят либо X, либо O в позицию на сетке 3x3. Вектор, который печатается, является одномерным.
vector<vector<int>>board{{1,2,3},{4,5,6}};
создает сетку 2x3, а не 3x3, board.size() == 2
, а board[0].size() == 3
@IgorTandetnik да, спасибо, что указали на это. Я занимался этим последние 6 часов и уже изрядно перегорел.
Если вам не нужно использовать индексы в цикле, рассмотрите более чистые циклы на основе диапазона: godbolt.org/z/qMfP1KK4c
@paddy Я посмотрю на это. Codecademy еще не рассмотрела это.
Я никогда не просматривал эти онлайн-сайты по изучению языков, но определенно вижу много сомнительного кода от людей, которые их используют. Тот факт, что i
и j
являются глобальными переменными, является серьезным тревожным сигналом. И нет: вы не сталкиваетесь с ошибками компилятора. Новые программисты любят обвинять компилятор в вещах, которых они еще не понимают.
Я никогда не видел доски для игры в крестики-нолики 2х3, заполненной цифрами.
@n.m.couldbeanAI цифры являются заполнителями для реальных букв, которые будет вводить человек, запускающий программу.
@paddy Нет, VSC вообще не показывает цифры. Буквально скопировали и вставили один и тот же код из одного места в другое и получили другой результат.
Введите [c++] tic tac toe
в поле поиска «Переполнение стека», и вы увидите некоторые из многих других вопросов, которые задавались о крестиках-ноликах. Это должно стать для вас хорошим источником идей при работе над другими частями вашей программы.
Ваша программа действительна. Проблема не в VSC — это либо ваша конфигурация, либо неправильное использование. Правильная настройка VSC — распространенная проблема, о которой регулярно сообщается на сайте Stack Overflow. Документы VSC содержат очень подробные инструкции по настройке для разработки.
Для одномерной матрицы мы инициализируем ее с помощью 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;
}
Спасибо за это, ваше объяснение имеет смысл и помогает мне лучше его понять. Еще раз спасибо
Я предполагаю, что для второго цикла вам очень хочется
board[i].size()
? Кроме того (а также несколько вредных привычек, непоследовательные отступы и нефатальное несовпадение типов) программа должна работать нормально . Пожалуйста, отредактируйте свой вопрос, чтобы предоставить нам более подробную информацию о ваших проблемах. Например, фактический и ожидаемый результат.