Как сделать выходной файл из матрицы n * n, взяв n от пользователя, с числами, сгенерированными в парах? - PullRequest
0 голосов
/ 09 февраля 2019

В настоящее время у меня есть готовая матрица 6X6 в текстовом файле, подобном этому:

2 6 3 1 0 4
4 2 7 7 2 8
4 7 3 2 5 1
7 6 5 1 1 0
8 4 6 0 0 6
1 3 1 8 3 8

, и я сделал код, который читает из файла, который я сделал.Однако я хочу, чтобы пользователь сделал сетку для себя (то есть 3X3 или 10X10).Который затем записывает в текстовый файл автоматически, как в аналогичном режиме, а затем вместо этого иметь эту запись.Это базовая карточная игра на совпадение памяти, поэтому мне нужно иметь rand (), которая генерирует равные пары, чтобы игра могла быть закончена, когда найдена каждая пара в сетке.Большое спасибо за ваше время!

/*Here are the snippets of my code*/

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <fstream>
#include <string>
#include <numeric>
#include <limits>

using namespace std;  

//global 2d vectors that are associated with the game
vector<vector<int> > game_grid; 
vector<vector<int> > hidden_grid;
vector <vector<int> > guessed;

void initialize_grid() {
ifstream input_file;
input_file.open("grid.txt");
int num;

if (input_file) {
    for (int i = 0; i < 6; ++i) {
        vector<int> row; // game grid
        vector<int> row2; // hidden grid
        vector<int> row3; // guessed grid
        for (int j = 0; j < 6; ++j) {
            if (input_file >> num)
                row.push_back(num);
            row2.push_back(-1);
            row3.push_back(0);
        }
        game_grid.push_back(row);
        hidden_grid.push_back(row2);
        guessed.push_back(row3);
    }
    cout << "Get is ready, Challenger!" << endl << endl;
}
else {
    cout << "Womp. File open failed!";
}
return;
}

void print_grid() {
cout << "Game  grid" << endl;
cout << " -------------------------" << endl;
for (int i = 0; i < 6; ++i) {
    cout << " | ";
    for (int j = 0; j < 6; ++j) {
        cout << game_grid[i][j] << " | ";
    }
    cout << endl << " -------------------------" << endl;
}
cout << endl;
}

void print_hidden_grid(int r1 = -1, int r2 = -1, int c1 = -1, int c2 = -1) {
cout << "Attempt:" << endl;
if (r1 != -1) {
    hidden_grid[r1][c1] = game_grid[r1][c1];
}
if (r2 != -1) {
    hidden_grid[r2][c2] = game_grid[r2][c2];
}
for (int i = 0; i < 6; ++i) {
    cout << " | ";
    for (int j = 0; j < 6; ++j) {
        if (hidden_grid[i][j] > -1)
            cout << hidden_grid[i][j] << " | ";
        else
            cout << "  | ";
    }
    cout << endl << " -------------------------" << endl;
}
cout << endl;

if (r1 != -1) {
    if (game_grid[r1][c1] == game_grid[r2][c2]) {
        guessed[r1][c1] = 1;
        guessed[r2][c2] = 1;
        cout << "You have a match!" << endl << endl;
    }
    else {
        hidden_grid[r1][c1] = -1;
        hidden_grid[r2][c2] = -1;
    }
}
cout << endl << endl;
}

void print_current_grid() {
cout << "Current Grid:" << endl;
cout << " -------------------------" << endl;
for (int i = 0; i < 6; ++i) {
    cout << " | ";
    for (int j = 0; j < 6; ++j) {
        if (hidden_grid[i][j] > -1)
            cout << hidden_grid[i][j] << " | ";
        else
            cout << "  | ";
    }
    cout << endl << " -------------------------" << endl;
}
cout << endl << endl;
}


 .......

1 Ответ

0 голосов
/ 09 февраля 2019

Если я хорошо понимаю, вы хотите автоматически определять размер матрицы при ее чтении?Если да, вы можете сделать что-то подобное в initialize_grid:

void initialize_grid() {
  ifstream input_file;
  input_file.open("grid.txt");
  int num;

  if (input_file) {
    // detect size
    int size = 0;
    string line;

    if (!getline(input_file, line))
      return;

    istringstream iss(line);

    while (iss >> num)
      size += 1;

    input_file.clear();
    input_file.seekg(0);

    for (int i = 0; i < size; ++i) {
      vector<int> row; // game grid
      vector<int> row2; // hidden grid
      vector<int> row3; // guessed grid
      for (int j = 0; j < size; ++j) {
        if (input_file >> num)
          row.push_back(num);
        row2.push_back(-1);
        row3.push_back(0);
      }
      game_grid.push_back(row);
      hidden_grid.push_back(row2);
      guessed.push_back(row3);
    }
    cout << "Get is ready, Challenger!" << endl << endl;
  }
  else {
    cout << "Womp. File open failed!";
  }
}

и в другом месте, где вы замените 6 на game_grid.size() (используя size_t вместо int для вводаиндексы)

...