Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
#1

Крестики-нолики: как определить победителя? - C++

08.12.2012, 04:17. Просмотров 1758. Ответов 20
Метки нет (Все метки)

в некоторых местах го*** код, но всё таки. взялся сейчас делать крестики нолики, сделал рамку, а сейчас пытаюсь через переменную типа COORD печатать в нужном месте 'X' или 'О'. ну да, получилось. проверить занято ли там тоже получилось, НО как проверять что там написано, чтобы определить победителя. помогите кто чем может, если не тяжело. ещё нужен искусственный интеллект (алгоритм придумал), но плохо у меня с логикой и сейчас с квадратной головой тяжело соображать(

короче.

- проверить что написано по данных координатам для определения победителя...
- либо помогите это сделать другим нормальным способом
- помогите реализовать это с помощью cin.get() чтобы можно было стрелочками (клавишами) ставить X или О в определённую позицию. буду очень признателен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream> 
#include <windows.h>
 
using namespace std;
 
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); // Дескриптор окна
 
void Frame() // Ф-ия для таблички.
{
    char leftUpCorner = 201;
    char LeftDownCorber = 200;
    char RightUpCorner = 187;
    char RightDownCorner = 188;
    char vertical = 186;
    char horizontLine = 205;
    char middle = 206;
    char leftMiddle = 204;
    char rigthMiddle = 185;
    char downMiddle = 202;
    char upMiddle = 203;
 
    int size = 3;
 
    for(int i = 0; i < size; i++)
    {
        if(i == 0) // Верхушка рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << leftUpCorner << horizontLine << horizontLine;
                else
                    cout << upMiddle << horizontLine << horizontLine;
            }
            cout << RightUpCorner << endl;
        }
        else // Серединки рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << leftMiddle << horizontLine << horizontLine;
                else
                    cout << middle << horizontLine << horizontLine;
            }
            cout << rigthMiddle << endl;
        }
        for(int j = 0; j < size; j++) // Обязательный блок
        {
            cout << vertical << "  ";
        }
        cout << vertical << endl;
 
        if(i == size - 1) // Низ рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << LeftDownCorber << horizontLine << horizontLine;
                else
                    cout << downMiddle << horizontLine << horizontLine;
            }
            cout << RightDownCorner << endl;
        }
 
    }
    cout << endl;
}
 
void Game()
{
    COORD coord;
    cout << "Vvedite coordinaty kyda postavit X (v kakyu yacheiky)? (primer: 1 )\n";
    short input;
    cin >> input;
    if(input == 1)
    {
        coord.X = 1;
        coord.Y = 1;
        SetConsoleCursorPosition(h, coord);
        cout << " X";
        if(coord.X == 1 && coord.Y == 1)
        {
            cout << "####";
        }
        coord.X = 40;
        coord.Y = 13;
        SetConsoleCursorPosition(h, coord);
        cin >> input;
        coord.X = 1;
        coord.Y = 2;
        SetConsoleCursorPosition(h, coord);
        cout << " O";
    }
 
}
 
void main()
{
    Frame(); // Вызов ф-ии для вывода рамки.
    Game();
    CONSOLE_CURSOR_INFO cci; 
    cci.bVisible = 0;
    cci.dwSize = 100;
    SetConsoleCursorInfo(h, &cci);
    Sleep(INFINITE);
}
Добавлено через 2 часа 21 минуту
up up up. помогите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2012, 04:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крестики-нолики: как определить победителя? (C++):

Крестики-нолики, поиск в массиве для выявления победителя - C++
Здравствуйте. Имеем игру крестики-нолики, поле хранится в виде матрицы 10х10, нужно поставить 5 в линию. Необходимо написать функцию,...

Как оптимизировать данный код игры крестики нолики? - C++
Привет всем! Я написал консольную игру &quot;Крестики нолики&quot;. Хочу посоветоваться как можно оптимизировать игру. Вот исходный код: ...

Как создать логическую игру “Крестики-нолики” на консоли функцию winner не могу до делать c++ - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;iomanip&gt; using namespace std; int polya; class o; class x { ...

“Крестики-нолики” - C++
Напишите игру “Крестики-нолики”. Программа выводит игровое поле для двух игроков, проверяет правильность ходов, следит за ситуацией на...

Крестики нолики - C++
Уж слишком запутался даже в такой простом коде: #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; #include &lt;iomanip&gt; ...

Крестики/нолики - C++
Я не понимаю почему не работает, и в этом моя проблема. Буду благодарен любой помощи, а так же любой конструктивной критике по коду. Если...

20
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 12:52 #2
owned, я что-то двумерного массива в коде не заметил. Или Вы прям так что-то считать хотите?)
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 18:37  [ТС] #3
ну ок, вот с массивом. чем его инициализировать....:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream> 
#include <windows.h>
 
using namespace std;
 
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); // Дескриптор окна
 
char Array[3][3];
 
void Frame() // Ф-ия для таблички.
{
    char leftUpCorner = 201;
    char LeftDownCorber = 200;
    char RightUpCorner = 187;
    char RightDownCorner = 188;
    char vertical = 186;
    char horizontLine = 205;
    char middle = 206;
    char leftMiddle = 204;
    char rigthMiddle = 185;
    char downMiddle = 202;
    char upMiddle = 203;
 
    int size = 3;
 
    for(int i = 0; i < size; i++)
    {
        if(i == 0) // Верхушка рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << leftUpCorner << horizontLine << horizontLine;
                else
                    cout << upMiddle << horizontLine << horizontLine;
            }
            cout << RightUpCorner << endl;
        }
        else // Серединки рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << leftMiddle << horizontLine << horizontLine;
                else
                    cout << middle << horizontLine << horizontLine;
            }
            cout << rigthMiddle << endl;
        }
        for(int j = 0; j < size; j++) // Обязательный блок
        {
            cout << vertical << "  ";
        }
        cout << vertical << endl;
 
        if(i == size - 1) // Низ рамки
        {
            for(int j = 0; j < size; j++)
            {
                if(j == 0)
                    cout << LeftDownCorber << horizontLine << horizontLine;
                else
                    cout << downMiddle << horizontLine << horizontLine;
            }
            cout << RightDownCorner << endl;
        }
 
    }
    cout << endl;
}
 
void Game()
{
    COORD coord;
    cout << "Vvedite coordinaty kyda postavit X (v kakyu yacheiky)? (primer: 1 )\n";
    short input;
    cin >> input;
    if(input == 1)
    {
        coord.X = 1;
        coord.Y = 1;
        SetConsoleCursorPosition(h, coord);
        cout << " X";
                coord.X = 40;
        coord.Y = 13;
        SetConsoleCursorPosition(h, coord);
        cin >> input;
        coord.X = 1;
        coord.Y = 2;
        SetConsoleCursorPosition(h, coord);
        cout << " O";
    }
 
}
 
void main()
{
    Frame(); // Вызов ф-ии для вывода рамки.
    Game();
    CONSOLE_CURSOR_INFO cci; 
    cci.bVisible = 0;
    cci.dwSize = 100;
    SetConsoleCursorInfo(h, &cci);
    Sleep(INFINITE);
}
помогите
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 18:44 #4
Не заглядывая в код, могу сказать (т.к. уже имел опыт с крестиками-ноликами))). Есть матрица, которую вполне можно заполнить просто пробелами (в случае, если тип char, можно конечно и любой другой, лучше int, тогда изначально забивать -1, например). Организуем какое-нибудь перемещение по координатам и в зависимости от положения отмечаем в матрице крестики-нолики. При этом подсчитывая ходы. В принципе, можно даже без координат, если по-простому: вводим клетку, в которую хотим записать крестик-нолик, вводим, что хотим туда вставить (опять же крестик-нолик). Ну, и т.д.
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 18:46  [ТС] #5
BumerangSP, можешь пожалуйста скинуть код?
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 18:52 #6
owned, у меня нет кода, я на вскидку сказал. Еще давно в паскале делал.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
08.12.2012, 19:07 #7
Цитата Сообщение от BumerangSP Посмотреть сообщение
Не заглядывая в код, могу сказать (т.к. уже имел опыт с крестиками-ноликами))). Есть матрица, которую вполне можно заполнить просто пробелами (в случае, если тип char, можно конечно и любой другой, лучше int, тогда изначально забивать -1, например).
я уже кому то предлагал 0 это нолик 1 это крестик 10 пустое поле
тогда проверка на три нолика или три крестика допустим первая строка
C++
1
2
3
4
5
6
7
int summ=0;
for(int i=0;i<3;i++)
summ+=pole[0][i];
 if(summ==0)
    // это три нолика
  if(summ==3)
  // это три крестика
проверка на пустые клетки
C++
1
2
3
4
5
6
int summ=0;
for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
    summ+=pole[0][i];
 if(summ<10)
    // нет пустых клеток
можно пустое поле заполнять так
110 120 140
210 220 240
410 420 440
тогда из суммы всегда можно вычислить пустую клетку при помощи флагов
в общем вариантов куча
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 19:15  [ТС] #8
ValeryS, я тебя не сильно понял, покажи пожалуйста на примере

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
можно пустое поле заполнять так
110 120 140
210 220 240
410 420 440
тогда из суммы всегда можно вычислить пустую клетку при помощи флагов
в общем вариантов куча
вот это .
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
08.12.2012, 19:41 #9
Цитата Сообщение от owned Посмотреть сообщение
ValeryS, я тебя не сильно понял,
чавой ты не понял???
обнуление поля
C++
1
2
3
4
5
6
void clearPole()
{
for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
    pole[i][j]=10;
}
поставить крестик
C++
1
2
3
4
void SetCross(int i, int j)
 {
  pole[i][j]=1;
 }
поставить нолик
C++
1
2
3
4
void SetNull(int i, int j)
 {
  pole[i][j]=0;
 }
ну и так далее

Добавлено через 8 минут
Цитата Сообщение от owned Посмотреть сообщение
вот это .
а это просто мысли вслух
я не правильно привел пример возможна кореляция
вот так правильней лучше в шеснадсатеричке
0х0010 0х0020 0х0040
0х0100 0х0200 0х0400
0х1000 0х2000 0х4000
например у нас свободна 1(0х10) третья(0х40) пятая(0х200) и девятая(0х4000) ячейка
тогда сумма будет 0х4250
проверяем первую ячейку
if(summ&0x0010) не равно 0 свободна
вторую
if(summ&0x0020) равно 0 занято
третью
if(summ&0x0040) не равно 0 свободна
и так по всем 9

Добавлено через 5 минут
даже не так
0х0010 0х0020 0х0040
0х0080 0х0100 0х0200
0х0400 0х0800 0х1000
тогда заполнение
C++
1
2
3
4
5
6
void clearPole()
{
for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
    pole[i][j]=0x10<<(i+j*3);
}
Добавлено через 7 минут
проверка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int summ=0;
for(int i=0;i<3;i++)
  for(int j=0;j<3;j++)
    summ+=pole[0][i];
 if(summ&0x1FF==0)
     return -1;// нет пустых клеток
 if(summ&0x0070)// в первой строчке есть пустая клетка
      {
          if(summ&0x0010) 
                   // клетка 1
           if(summ&0x0020) 
                  // клетка 2
           if(summ&0x0040) 
                 // клетка 3
      }
..........................
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 20:23  [ТС] #10
ValeryS, а с таблице как? не получается нормально отобразить... или не там написал.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
08.12.2012, 20:33 #11
Цитата Сообщение от owned Посмотреть сообщение
ValeryS, а с таблице как?
табличку не знаю сам придумай( тем более писать под консоль глупо когда есть графические интерфейсы )
а тестовый вывод вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Draw()
{ 
for(int i=0;i<3;i++)
{
  for(int j=0;j<3;j++)
   {
      switch(pole[i][j]
     {
      case 0:
        printf("0");
        break;
       case 1:
        printf("X");
        break;  
    default:
      printf(" ");
     }
   }
 printf("\n ");
}
}
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:04  [ТС] #12
о, спасибо большое, есть успехи) не выходи из темы пожалуйста, 100% нужна будет ещё помощь. надеюсь на тебя)

Добавлено через 2 часа 5 минут
мне вот это не понятно - что за 10, 1, 0??? как это и где использовать...?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void ClearPole()
{
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            pole[i][j] = 10;
}
 
void SetCross(int i, int j)
{
    pole[i][j] = 1;
}
 
void SetNull(int i, int j)
{
    pole[i][j] = 0;
}
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
08.12.2012, 23:15 #13
Цитата Сообщение от owned Посмотреть сообщение
мне вот это не понятно - что за 10, 1, 0
10 Это пустая ячейка (сейчас вроде не используем там шеснадцатеричные) один из вариантов
1 если в ячейке стоит крестик
0 если в ячейке стоит нолик
Цитата Сообщение от owned Посмотреть сообщение
void SetCross(int i, int j)
{
pole[i][j] = 1;
}
установить крестик в ячейку с координатами i j

Цитата Сообщение от owned Посмотреть сообщение
void SetNull(int i, int j)
то же установить 0
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:19  [ТС] #14
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
08.12.2012, 23:20 #15
Цитата Сообщение от owned Посмотреть сообщение
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
да правильно
0
08.12.2012, 23:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2012, 23:20
Привет! Вот еще темы с ответами:

Крестики-нолики - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; void show_cells(); void make_move(int num); void result(); ...

Крестики-нолики - C++
Добрый вечер. Хочу попробовать написать свои крестики-нолики. Игру еще не дописал, но уже появилась следующая проблема. По идее, если я...

крестики-нолики - C++
Может у кого-то есть шаблон,чтобы расчертить поле в клетку,например 3x3. Покажите пожалуйста))

Крестики-нолики - C++
Доброго времени суток. Решил написать крестики-нолики, но возник какой-то косяк на ровном (и естесно самом неожиданном) месте. Коротко...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru