Проблемы судоку в игровом дизайне C ++ - PullRequest
1 голос
/ 02 января 2012

У меня есть (еще один) вопрос о символах. Спасибо тем, кто помог мне с этим раньше. На данный момент я пытаюсь сделать в основном 4 вещи в программе. То есть:

  1. Создайте двумерный массив 9x9 и заполните его подчеркиванием.

  2. Запросить строку / столбец, а затем число, которое пользователь желает ввести в эту строку / столбец столько раз, сколько пользователь хочет.

  3. Заменить указанные пробелы указанными номерами.

  4. Вывести весь массив символов 9x9 на художественную доску судоку ASCII.

(Решение придет позже.)

Моя проблема в том, что когда я ввожу строку / столбец и число, которое я хочу ввести в эту строку / столбец, черта, которая была первоначально в этом месте, исчезает, но введенное мной число не появляется на своем месте.

Вот код на данный момент:

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

int main () {

//Builds 9x9 char array.
char dash[9][9];
for (int array=0; array<9; array++) {
    for (int array2=0; array2<9; array2++) {
        dash[array][array2]='_';
    }
}

cout << "Input the row #, then the column #, then the number that you wish to fill that spot." << endl;
cout << "Remember that a Sudoku board is 9x9." << endl;
cout << "When you wish to finish input and solve, type all 0's and press enter." << endl;

int rowb;
char row[99];
int columnb;
char column[99];
int numb;
char num[99];

//Inputs the row/column and number to go into specified row/column.
int control=0;
while (rowb!=0){
    control++;
    cout << "Row: ";
    cin >> rowb;
    cout << "Column: ";
    cin >> columnb;
    cout << "Number: ";
    cin >> numb;
    row[control]=rowb-1;
    column[control]=columnb-1;
    num[control]=numb;
}

int length;
length=strlen(row);
//Replaces the _'s in the specified rows/columns and replaces them with the integer the user specified. This is where I think I'm having the problem.
for (control=0; control<length; control++) {
    dash[row[control]][column[control]]=num[control];
}

//Builds the Sudoko board and outputs the full 9x9 array.
cout << "╔═══════════╦═══════════╦═══════════╗" << endl;
for (int count=0; count<3; count++) {
    for (int count2=0; count2<3; count2++) {
        cout << "║_" << dash[count][count2*3] << "_|_" << dash[count][count2*3+1] << "_|_" << dash[count][count2*3+2] << "_";   
    }
        cout << "║" << endl;
}
cout << "╠═══════════╬═══════════╬═══════════╣" << endl;
for (int count=3; count<6; count++) {
    for (int count2=0; count2<3; count2++) {
        cout << "║_" << dash[count][count2*3] << "_|_" << dash[count][count2*3+1] << "_|_" << dash[count][count2*3+2] << "_";   
    }
    cout << "║" << endl;
}
cout << "╠═══════════╬═══════════╬═══════════╣" << endl;
for (int count=6; count<9; count++) {
    for (int count2=0; count2<3; count2++) {
        cout << "║_" << dash[count][count2*3] << "_|_" << dash[count][count2*3+1] << "_|_" << dash[count][count2*3+2] << "_";   
    }
    cout << "║" << endl;
}
cout << "╚═══════════╩═══════════╩═══════════╝" << endl;
return 0;
}

Ответы [ 2 ]

1 голос
/ 02 января 2012

Существует проблема с назначением номера, введенного в цикл.

//Replaces the _'s in the specified rows/columns and replaces them with the integer the user specified. This is where I think I'm having the problem.
for (control=0; control<length; control++) {
    dash[row[control]][column[control]]=num[control]; //<<<--- Assignment issue.
}

Вы присваиваете целочисленное значение в массиве символов, поэтому при отображении вы получите соответствующий символ для значения ascii , а не целое число. Попробуйте изменить назначение следующим образом:

//Replaces the _'s in the specified rows/columns and replaces them with the integer the user specified. This is where I think I'm having the problem.
for (control=0; control<length; control++) {
    dash[row[control]][column[control]]=num[control] + '0'; // Convert to ascii value of the integer, but will fail if not b/w 0 & 9.
}

Также рекомендуется проверить, находится ли введенное число между 1 и 9, если вы решите использовать вышеуказанное наблюдение.
Пожалуйста, добавьте проверки для строки и столбца, введенных в качестве вводимых значений, которые не являются ч / б 1 и 9, приведут к неопределенному поведению из-за доступа к внешним элементам массива, если введенные значения не ч / б 1 и 9.
Также, как упоминал Бенджамин Линдли, обновите strlen код.
Надеюсь, это поможет!

0 голосов
/ 02 января 2012
length=strlen(row);

Это неопределенное поведение, потому что строка [0] никогда не инициализировалась, и вы никогда не завершаете строку нулем.

char row[99];
...
int control=0;
while (rowb!=0){
    control++;
    ...
    row[control]=rowb-1;
    ...

Обратите внимание, что при первом прохождении цикла управление равно 1. Итак, вы устанавливаете значение строки [1], а не строки [0]. Переместить приращение в конец цикла. Могут быть и другие проблемы, но именно они являются основной причиной поведения, которое вы видите.

Кроме того, чтобы strlen работал, вам нужно завершить строку нулем.

И, наконец, вы делаете ту же ошибку, что и в в этом вопросе и в этом вопросе . Почему ты, похоже, не понимаешь этого? Символы отображаются иначе, чем целые. Следующий код не будет отображать число 1:

char c = 1;
std::cout << c;

Посмотрите на ответы на эти два других вопроса.

...