Применение входных пределов внутри для l oop, определяющих массив символов (Ti c Ta c Toe) - PullRequest
0 голосов
/ 26 января 2020

Вот мой исходный код - с помощью которого пользователь может сыграть Ti c Ta c Toe, указав, в каком месте массива char они хотят добавить ноль или крестик -

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
   char a[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};
   cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
   cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
   cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;

   int x, y;

   for (int i = 0; i < 5; i ++)
   {
       cout << "Input x: ";
       cin >> x;
       cout << "Input y: ";
       cin >> y;

       system("clear");

       a[x-1][y-1] =  'X';

       cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
       cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
       cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;

       cout << "Input x: ";
       cin >> x;
       cout << "Input y: ";
       cin >> y;

       system("clear");

       a[x-1][y-1] =  'O';

       cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
       cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
       cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;
   }
}

. чтобы избежать ввода пользователем индекса массива, который находится за пределами [1,3], я пытаюсь реализовать условие if

if(x <= 0 && x > 3)
{
    cout << "Wrong! Enter again. Input x: ";
    cin >> x;
}

Это не работает. Поскольку for для l oop повторяется по 5 раз для X и O, либо выход застревает на этапе «Input X», либо просто выходит после 5 «Input X».

Вот что я попробовал - что закончилось взяв 5 X входов и затем просто выйдя -

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
   char a[3][3] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}};
   cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
   cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
   cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;

   int x, y;

   for (int i = 0; i < 5; i ++)
   {
       cout << "Input x: ";
       cin >> x;
       if(x <= 0 && x > 3)
       {
           cout << "Wrong! Enter again. Input x: ";
           cin >> x;
           continue;
       }
       else
       {
           continue;
       }

       cout << "Input y: ";
       cin >> y;
       if(y <= 0 && y > 3)
       {
           cout << "Wrong! Enter again. Input y: ";
           cin >> y;
           continue;
       }
       else
       {
           continue;
       }


       /*
       if(x <= 0 && x > 3)
       {
           cout << "Wrong! Enter again. Input x: ";
           cin >> x;
       }

       if(y <= 0 && y > 3)
       {
           cout << "Wrong! Enter again. Input y: ";
           cin >> y;
       }
       */

       system("clear");

       a[x-1][y-1] =  'X';

       cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
       cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
       cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;

       cout << "Input x: ";
       cin >> x;
       if(x <= 0 && x > 3)
       {
           cout << "Wrong! Enter again. Input x: ";
           cin >> x;
           continue;
       }
       else
       {
           continue;
       }


       cout << "Input y: ";
       cin >> y;
       if(y <= 0 && y > 3)
       {
           cout << "Wrong! Enter again. Input y: ";
           cin >> y;
           continue;
       }
       else
       {
           continue;
       }


       /*
       if(x <= 0 && x > 3)
       {
           cout << "Wrong! Enter again. Input x: ";
           cin >> x;
       }

       if(y <= 0 && y > 3)
       {
           cout << "Wrong! Enter again. Input y: ";
           cin >> y;
       }
       */
       system("clear");

       a[x-1][y-1] =  'O';

       cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << endl << endl << endl;
       cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << endl << endl << endl;
       cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << endl << endl << endl;
   }
}

Почему я не могу просто иметь оператор if после ввода, в котором он проверяет, находится ли он вне границ, и, если он есть, он может спросить пользователь снова, а затем продолжить? - Это то, что я пытаюсь реализовать.

Ответы [ 2 ]

0 голосов
/ 26 января 2020

Почему я не могу просто иметь оператор if после ввода, в котором он проверяет, находится ли он вне границ, и если это так, он может снова спросить пользователя и затем продолжить?

if оператор проверяет правильность ввода пользователя, но он не будет повторяться, пока ввод не будет действительным. Вам нужно иметь loop, который будет работать до тех пор, пока пользователь не введет правильный код.

Что-то вроде ниже,

#include <iostream>

bool isGameCompleat(char a[3][3])
{
   /*check for all combination for the board for game complete*/
    if ((a[0][0] == a[0][1] && a[0][0] == a[0][2]) ||
        (a[1][0] == a[1][1] && a[1][0] == a[1][2]) ||
        (a[2][0] == a[2][1] && a[2][0] == a[2][2]) ||
        (a[0][0] == a[1][0] && a[0][0] == a[2][0]) ||
        (a[0][1] == a[1][1] && a[0][1] == a[2][1]) ||
        (a[0][3] == a[1][3] && a[0][3] == a[2][3]) ||
        (a[0][0] == a[1][1] && a[0][0] == a[2][2]) ||
        (a[0][3] == a[1][1] && a[0][3] == a[2][0]))
        return true;
    return false;
}

void printBoard(char a[3][3])
{
    std::cout << (char)a[0][0] << "    " << (char)a[0][1] << "    " << (char)a[0][2] << "\n\n\n";
    std::cout << (char)a[1][0] << "    " << (char)a[1][1] << "    " << (char)a[1][2] << "\n\n\n";
    std::cout << (char)a[2][0] << "    " << (char)a[2][1] << "    " << (char)a[2][2] << "\n\n\n";
}

int main()
{
    char a[3][3] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'} };

    int x, y;

    printBoard(a);

    for (int i = 0; (i < 9); i++)
    {
        int p;
        if ((i & 1) == 0) {
            std::cout << "X Turn ";
        }
        else {
            std::cout << "O Turn ";
        }

        std::cout << "Enter the position ";
        std::cin >> p;  

        /*derived  row and column from 0 to 9 position*/
        x = (p / 3);
        y = (p%3) -1;

        /*Validity check for input if wrong request for new input
         * out of range check and non-repeated tile is selected
         */
        while (p < 0 || p > 9 || (a[x][y] =='X') || (a[x][y]=='O'))
        {   
            std::cout << "Wrong! Enter again: ";
            std::cin >> p;
            x = (p / 3);
            y = (p%3) -1;
        }

        if ((i & 1) == 0) {
            a[x][y] = 'X';
        }
        else {
            a[x][y] = 'O';
        }

        system("clear");
        printBoard(a);

        if (isGameCompleat(a))
        {
            std::cout <<(  (i & 1) ? "O" : "X") << " wins";
            break;
        }
        else if (i == 8)
        {
            std::cout << "Game is draw";
        }           
    }
}
0 голосов
/ 26 января 2020

Я думаю, что правильным оператором будет || вместо &&.

Используя &&, вы предлагаете, чтобы ОБА x <= 0 И x> 3 ДОЛЖНЫ происходить одновременно, чтобы оператор IF был принят!

Это поможет попытаться прочитать ваше высказывание вслух на английском языке sh, поможет вам лучше понять его:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...