2016-02-15 3 views
0

Я пытаюсь создать игру tic tac toe с использованием матрицы, и она работает нормально, если у меня есть пользователь, который вводит каждую позицию как [0] [0] или [1] [2] и т. Д. Однако я хочу, чтобы пользователь мог вводить «a, b, c» и «1, 2, 3», но когда я пытаюсь изменить входные значения и ввести букву в консоль, я получаю:convert cin after input

Необработанное исключение в 0x01294C54 в ConsoleApplication3.exe: 0xC0000005: Место считывания нарушения доступа 0x345D4330.

Есть ли способ изменить входные значения пользователя без этого?

Вот первая часть кода, и проблема заключается в функции ввода.

#include <iostream> 
#include <ctime> 
using namespace std; 

char matrix[3][3] = { '-', '-', '-', '-', '-', '-', '-', '-', '-' }; 

void Draw() 
{ 
    cout << " a b c" << endl; 
    int row=1; 
    for (int i = 0; i < 3; i++) 
    { 
     cout << row << " "; 
     for (int j = 0; j < 3; j++) 
     { 
      cout << matrix[i][j] << " "; 
     } 
     cout <<endl; 
     row++; 
    } 
} 

void Input() 
{ 
    int pos1, pos2; 
    cout << "Pick a place to put your X" << endl; 
    cin >> pos1 >> pos2; 
    if (pos1 == 'a') 
     pos1 = '0'; 
    if (pos1 == 'b') 
     pos1 = '1'; 
    if (pos1 == 'c') 
     pos1 = '2'; 
    if (pos2 == '1') 
     pos2 = '0'; 
    if (pos2 == '2') 
     pos2 = '1'; 
    if (pos2 == '3') 
     pos2 = '2'; 

    if (matrix[pos1][pos2] != 'O' && matrix[pos1][pos2] != 'X') 
    { 
     matrix[pos1][pos2] = 'X'; 
    } 
} 
+1

Где вы управляетесь с запятой разделителей, и как вы думаете, чтение 'a' в' int' будет работать? Неудачное извлечение потока оставит 'pos1' и' pos2' неинициализированными в коде pre-C++ 11. Это может происходить здесь. – LogicStuff

+1

Кроме того, если вы меняете 'pos1' и' pos2' на 'char',' '0'' не' 0', а '48',' '1'' не' 1', а '49', и т. д. Это доступ за пределами допустимого диапазона. – LogicStuff

ответ

0

Вы получаете доступ к matrix с использованием индексов. Допустимыми индексами для доступа matrix являются matrix[0][0] до matrix[2][2]. Для доступа к матрице вы используете символ '0', '1' и '2'. Числовое значение тех, если система использует кодирование ASCII, являются 48, 49 и 50.

Кроме того, если переменная имеет тип int и вы используете:

cin >> pos1; 

программа не будет читать правильно введите a. Вы должны использовать:

char pos1; 
cin >> pos1; 

принять a как действительный вход.

Вот модифицированная версия вашей функции:

void Input() 
{ 
    char c1, c2; 
    int pos1, pos2; 

    cout << "Pick a place to put your X" << endl; 
    cin >> c1 >> c2; 

    if (c1 == 'a') 
     pos1 = 0; 
    else if (c1 == 'b') 
     pos1 = 1; 
    else if (c1 == 'c') 
     pos1 = 2; 
    else 
    { 
     // Error do something 
    } 

    if (c2 == '1') 
     pos2 = 0; 
    else if (c2 == '2') 
     pos2 = 1; 
    else if (c2 == '3') 
     pos2 = 2; 
    else 
    { 
     // Error do something 
    } 

    if (matrix[pos1][pos2] != 'O' && matrix[pos1][pos2] != 'X') 
    { 
     matrix[pos1][pos2] = 'X'; 
    } 
} 
Смежные вопросы