需要帮助在c++中编辑二维矢量
Need help editing 2d vectors in c++
我目前正在用c++制作一个简单的井字游戏。我已经将游戏板存储为作为std::vector<std::vector<char>> _gameBoard;
的2d向量,并且具有用于创建_gameBoard
的另一向量,其为std::vector<char> _gamePieces;
。我用这个函数来设置矢量值
void Board::createBoard(int boardSize){
for(int i = 0; i < boardSize; i++){
for(int j = 0; j < boardSize; j++){
_gamePieces.push_back(' ');
}
_gameBoard.push_back(_gamePieces);
}
}
我现在正试图通过做这个来编辑玩家角色的矢量
void Board::editGameBoard(int players){
Players player;
char playerSymbol;
for(int i = 0; i < players; i++){
std::cout << "Player " << (i+1) << ": Where do you want to go(e.g 1 2)? ";
int x, y;
std::cin >> x >> y;
playerSymbol = player.getPlayerSymbol(i);
_gameBoard[x-1][y-1] = playerSymbol;
printBoard();
}
}
但我一直收到一个错误,我能想到的另一个解决方案是使用push_back
交换值,然后使用pop_back
,但有没有办法像数组一样访问它?
这是错误,错误,它说我无法嵌入图像,所以它创建了一个链接。
下面我将发布代码。
main.cpp
#include <iostream>
#include "Board.h"
#include "Input.h"
#include "Players.h"
int main(){
bool isRunning = true;
char endGame;
std::cout << "Welcome to Tic Tac Toe!n" << std::endl ;
while(isRunning){
Players player;
Board gameBoard;
player.setPlayers();
player.setPlayerSymbol();
gameBoard.setBoardSize(player.getPlayers());
gameBoard.createBoard(gameBoard.getBoardSize());
gameBoard.printBoard();
gameBoard.editGameBoard(player.getPlayers());
std::cout << "Do you want to end the game(Y or N): ";
std::cin >> endGame;
if(endGame == 'y' || endGame == 'Y')
isRunning = false;
}
system("pause");
return 0;
}
players.h
#pragma once
#include <vector>
class Players
{
public:
Players();
void setPlayers();
int getPlayers();
void setPlayerSymbol();
char getPlayerSymbol(int players);
private:
int _players;
std::vector<char> _playerSymbol;
};
播放器.cpp
#include "Players.h"
#include <iostream>
Players::Players(){
}
void Players::setPlayers(){
std::cout << "How many players are there(2-4): ";
std::cin >> _players;
while(_players < 1 && _players > 5){
std::cout << "Invalid entry, try again: ";
std::cin >> _players;
}
}
int Players::getPlayers(){
return _players;
}
void Players::setPlayerSymbol(){
for(int i = 0; i < _players; i++){
char symbol;
std::cout << "What symbol do you want for player " << (i+1) << ": ";
std::cin >> symbol;
_playerSymbol.push_back(symbol);
}
}
char Players::getPlayerSymbol(int player){
return _playerSymbol[player-1];
}
板.h
#pragma once
#include <vector>
class Board
{
public:
Board();
void createBoard(int boardSize);
void setBoardSize(int players);
int getBoardSize();
void printBoard();
void editGameBoard(int players);
private:
std::vector<std::vector<char>> _gameBoard;
std::vector<char> _gamePieces;
int _boardSize;
};
板.cpp
#include "Board.h"
#include "Players.h"
#include <iostream>
Board::Board(){
}
void Board::createBoard(int boardSize){
for(int i = 0; i < boardSize; i++){
for(int j = 0; j < boardSize; j++){
_gamePieces.push_back(' ');
}
_gameBoard.push_back(_gamePieces);
}
}
void Board::setBoardSize(int players){
std::cout << "How big do you want the game board to be";
if(players == 2){
std::cout << "(3x3 - 15x15(3 = 3x3, 4 = 4x4 etc)): ";
std::cin >> _boardSize;
while(_boardSize < 3 && _boardSize > 15){
std::cout << "Invalid entry, try again: ";
std::cin >> _boardSize;
}
}else if(players == 3){
std::cout << "(4x4 - 15x15(4 = 4x4, 5 = 5x5 etc)): ";
std::cin >> _boardSize;
while(_boardSize < 4 && _boardSize > 15){
std::cout << "Invalid entry, try again: ";
std::cin >> _boardSize;
}
}else if(players == 4){
std::cout << "(5x5 - 15x15(5 = 5x5, 6 = 6x6 etc)): ";
std::cin >> _boardSize;
while(_boardSize < 5 && _boardSize > 15){
std::cout << "Invalid entry, try again: ";
std::cin >> _boardSize;
}
}
std::cout << std::endl;
}
int Board::getBoardSize(){
return _boardSize;
}
void Board::printBoard(){
std::cout << " ";
for(int j = 0; j < _boardSize*2; j++){
if((j%2) == 0)
std::cout << " ";
else
std::cout << (j+1)/2;
}
std::cout << std::endl;
for(int i = 0; i < _boardSize; i++){
std::cout << " ";
for(int j = 0; (j-1) < _boardSize*2; j++){
std::cout << "-";
}
std::cout << std::endl;
std::cout << i+1;
std::cout << "|";
for(int j = 0; j < _boardSize; j++){
std::cout << _gameBoard[i][j];
std::cout << "|";
}
std::cout << std::endl;
}
std::cout << " ";
for(int i = 0; (i-1) < _boardSize*2; i++){
std::cout << "-";
}
std::cout << std::endl << std::endl;
}
void Board::editGameBoard(int players){
Players player;
char playerSymbol;
for(int i = 0; i < players; i++){
std::cout << "Player " << (i+1) << ": Where do you want to go(e.g 1 2)? ";
int x, y;
std::cin >> x >> y;
playerSymbol = player.getPlayerSymbol(i);
_gameBoard[x-1][y-1] = playerSymbol;
printBoard();
}
}
首先,您具体遇到了什么错误?你一行一行地看完代码了吗?此外,什么是Player类,您在代码中使用它,但没有显示它是什么。它是用数据初始化的吗?你有没有验证过x和y变量实际上是在取值?尝试使用int x=0,y=0;养成初始化变量的习惯从来都不是一件坏事。
至于其他答案,为什么我们在C++11中使用"new",而他所做的一切都是完全安全和理智的?我唯一要做的改变是使用std::vector<char>而不是std::vector<std::vector<char>>。您可以使用简单的数学方法轻松找到二维位置。你只需要知道木板的宽度。Position_in_vector=(y*宽度)+x;
编辑:你发布的链接设置了我公司的防火墙,所以我看不到它,请更新你的原始帖子。
我认为您可以创建一个临时向量,使用push_back将playerSymbol
添加到该向量,然后参考您的_gameBoard[x-1][y-1]
并将新创建的向量分配到该位置。
您使用了错误的数据结构。如果要创建具有预定义大小的矩阵,请使用二维阵列。
int** ary = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
ary[i] = new int[colCount];
看看这篇文章:如何使用new在C++中声明2d数组?
它将更具表演性,并将避免动态分配。
Vectors主要用于扩展和收缩数据集合。你的游戏板可能会保持不变,所以固定内存就足够了。这意味着二维阵列可能更适合该任务。如果您需要动态内存,请使用new关键字探索指针作为数组的使用。此外,请发布错误,以便我们可以帮助解释发生了什么。
- 将二维矢量传递给类
- 将值从二维数组输出到文本文件
- 我在二维向量中是否正确分配了内存
- 带结构的二维矢量:如何存储元素
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中的二维整数数组,每行中的元素数量不均匀
- C++ 中动态二维数组的访问冲突
- 在二维向量或数组中可以存储的最大元素数是多少?
- 如何将整数字符串转换为整数的二维向量?
- 二维矢量数据成员
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 需要帮助在c++中编辑二维矢量