需要帮助在c++中编辑二维矢量

Need help editing 2d vectors in c++

本文关键字:二维 编辑 帮助 c++      更新时间:2023-10-16

我目前正在用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关键字探索指针作为数组的使用。此外,请发布错误,以便我们可以帮助解释发生了什么。