1

Тема: Хрестики нолики

Допоможіть,  переробити цей код, як зробити не повторения ходів, щоб б наприклад позиція 1:1 я не міг 2 раза вводить.


#include "pch.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
void print_field(char field[3][3]);
 
int main()
{
    int p1, p2;
    char xo;
    int k;
    char xi = 'X', oi = '0';
    char field[3][3];
 
    for (size_t i = 0; i < 9; i++)
        field[i / 3][i % 3] = ' ';
 
    for (int i = 0; i < 9; i++)
    {
 
        cout << " i Position: ";
        cin >> p1; cout << '\n'; 
        cout << " j Position: ";
        cin >> p2; cout << '\n';
        cout << endl;
        while (p1 > 3 || p2 > 3)
        {
            cout << "Error position" << endl;
            cout << " i Position: ";
            cin >> p1; cout << '\n';
            cout << " j Position: ";
            cin >> p2; cout << '\n';
        }
        cout << " 1 - Enter X and 2 - Entrer O:   ";
        cin >> k;
        cout << '\n';
        switch (k)
        { 
            case 1:
                xo = 'X';
                    break;
            case 2:
                xo = 'O';
                    break;
        }
        field[p1][p2] = xo;
        print_field(field);
        
    }
 
 
    print_field(field);
 
    system("cls");
 
    print_field(field);
 
 
 
    return 0;
}
 
void print_field(char field[3][3])
{
    char a[14] = { 218,196,196,196,194,196,196,196,194,196,196,196,191,'\0' };
    //char a1[14] = { 179, 32, 179, 32, 179, 32, 179 };
    char a2[14] = { 195,196,196,196,197,196,196,196,197,196,196,196,180,'\0' };
    char a3[14] = { 192,196,196,196,193,196,196,196,193,196,196,196,217,'\0' };
 
    cout << a << '\n';
 
    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[0][i] << ' ';
    cout << (char)179 << '\n';
 
    cout << a2 << '\n';
 
    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[1][i] << ' ';
    cout << (char)179 << '\n';
 
    cout << a2 << '\n';
 
    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[2][i] << ' ';
    cout << (char)179 << '\n';
 
    cout << a3 << '\n';
}

2

Re: Хрестики нолики

 while (p1 > 3 || p2 > 3)

Ось тут додайте умову, що там не пробіл.
І ще - що менше за 0.

3

Re: Хрестики нолики

koala написав:
 while (p1 > 3 || p2 > 3)

Ось тут додайте умову, що там не пробіл.
І ще - що менше за 0.

тобто хо != ' ';        так?

4

Re: Хрестики нолики

Це ваш код?

5

Re: Хрестики нолики

koala написав:

Це ваш код?

Да мій.

6

Re: Хрестики нолики

І ви мене питаєте, в якій змінній те поле, куди ви збираєтеся записати новий символ?

7

Re: Хрестики нолики

koala написав:
 while (p1 > 3 || p2 > 3)

Ось тут додайте умову, що там не пробіл.
І ще - що менше за 0.


А що менше за нуль?

8

Re: Хрестики нолики

Те, що більше за 3.

9 Востаннє редагувалося FakiNyan (18.02.2019 21:32:09)

Re: Хрестики нолики

мо довжина нуль?
upd: nvm

10

Re: Хрестики нолики

у мене ошибка

Ошибка    C4700    использована неинициализированная локальная переменная "xo"

хоча я її ініціалізував

11

Re: Хрестики нолики

Вибачте, ви про той самий код чи вже про код зі змінами? Якщо друге - то телепатією тут ніхто не володіє, викладайте новий код.

12 Востаннє редагувалося koala (18.02.2019 22:03:05)

Re: Хрестики нолики

І постарайтеся уникати болгарської. Це україномовний форум.
А за російську можуть узагалі забанити.

13

Re: Хрестики нолики

У мене просто С++ на русскому не знаю як на українську.

14

Re: Хрестики нолики

краще відразу на англійську, так легше помилки гуглити

15

Re: Хрестики нолики

koala написав:

Вибачте, ви про той самий код чи вже про код зі змінами? Якщо друге - то телепатією тут ніхто не володіє, викладайте новий код.

той що на початку.

16

Re: Хрестики нолики

Мені порекомендували

do {
    cout << " Enter i = ";
    cin >> i;
    if(field[i / 3][i % 3] != ' ')
        cout << " Error ! " << endl;

} while(field[i / 3][i % 3] != ' ');

Я зрозумів його замість мого

cout << " i Position: ";
cin >> p1; cout << '\n';

17 Востаннє редагувалося Shelleex (19.02.2019 17:24:27)

Re: Хрестики нолики

#include "pch.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

void print_field(char field[3][3]);

int main()
{
    int p1, p2;
    
    int k;
    char xi = 'X', oi = '0';
    char field[3][3];

    for (size_t i = 0; i < 9; i++)
        field[i / 3][i % 3] = ' ';

    for (int i = 0; i < 50; i++)
    {
        
        cout << " i Position: ";
        cin >> p1; cout << '\n';
        cout << " j Position: ";
        cin >> p2; cout << '\n';
        cout << endl;
        while (p1 > 3 || p2 > 3 || field[p1][p2] != ' ')
        {
            cout << "Error position";
            cout << '\n';
            cout << " i Position: ";
            cin >> p1; cout << '\n';
            cout << " j Position: ";
            cin >> p2; cout << '\n';
        }
        cout << " 1 - Enter X and 2 - Entrer O:   ";
        cin >> k;
        cout << '\n';
        
            switch (k)
        {
        case 1:
            field[p1][p2] = xi;
            break;
        case 2:
            field[p1][p2] = oi;
            break;
        }
        system("cls");
        print_field(field);


        if ((field[0][1] == xi && field[0][2] == xi && field[0][0] == xi))
        {
            cout << " X WIN! "; cout << '\n'; 
            break;
        }
        if ((field[0][1] == oi && field[0][2] == oi && field[0][0] == oi))
        {
            cout << " O WIN! "; cout << '\n';
            break;
        }
        if ((field[1][1] == xi && field[1][2] == xi && field[1][0] == xi))
        {
            cout << " X WIN! "; cout << '\n';
            break;
        }
        if ((field[1][1] == oi && field[1][2] == oi && field[1][0] == oi))
        {
            cout << " O WIN! "; cout << '\n';
            break;
        }
        if ((field[2][1] == xi && field[2][2] == xi && field[2][0] == xi))
        {
            cout << " X WIN! "; cout << '\n';
            break;
        }
        if ((field[0][1] == oi && field[2][2] == oi && field[2][0] == oi))
        {
            cout << " O WIN! "; cout << '\n';
            break;
        }
        
    }


    print_field(field);

    system("cls");

    print_field(field);



    return 0;
}

void print_field(char field[3][3])
{
    char a[14] = { 218,196,196,196,194,196,196,196,194,196,196,196,191,'\0' };
    //char a1[14] = { 179, 32, 179, 32, 179, 32, 179 };
    char a2[14] = { 195,196,196,196,197,196,196,196,197,196,196,196,180,'\0' };
    char a3[14] = { 192,196,196,196,193,196,196,196,193,196,196,196,217,'\0' };

    cout << a << '\n';

    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[0][i] << ' ';
    cout << (char)179 << '\n';

    cout << a2 << '\n';

    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[1][i] << ' ';
    cout << (char)179 << '\n';

    cout << a2 << '\n';

    for (size_t i = 0; i < 3; i++)
        cout << (char)179 << ' ' << field[2][i] << ' ';
    cout << (char)179 << '\n';

    cout << a3 << '\n';
}

Допоможіть зробити, так що б писало хто переміг а то воно виходить із цикла а не пише.

18

Re: Хрестики нолики

1. Винесіть перевірки в окрему функцію, яка повертатиме 'X','0' чи ' ' (якщо ні те, ні інше).
2. Подумайте, як можна зробити з перевірки field[0][1] == xi && field[0][2] == xi && field[0][0] == xi цикл.
3. Подумайте, які іще лінії ви не перевіряли і чи не можна їх теж накрити циклами.