Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 04:17     Крестики-нолики: как определить победителя? #1
в некоторых местах го*** код, но всё таки. взялся сейчас делать крестики нолики, сделал рамку, а сейчас пытаюсь через переменную типа 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. помогите пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2012, 04:17     Крестики-нолики: как определить победителя?
Посмотрите здесь:

C++ Крестики-нолики
C++ Крестики Нолики
C++ крестики нолики
C++ Крестики-нолики
C++ Крестики нолики
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 12:52     Крестики-нолики: как определить победителя? #2
owned, я что-то двумерного массива в коде не заметил. Или Вы прям так что-то считать хотите?)
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);
}
помогите
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 18:44     Крестики-нолики: как определить победителя? #4
Не заглядывая в код, могу сказать (т.к. уже имел опыт с крестиками-ноликами))). Есть матрица, которую вполне можно заполнить просто пробелами (в случае, если тип char, можно конечно и любой другой, лучше int, тогда изначально забивать -1, например). Организуем какое-нибудь перемещение по координатам и в зависимости от положения отмечаем в матрице крестики-нолики. При этом подсчитывая ходы. В принципе, можно даже без координат, если по-простому: вводим клетку, в которую хотим записать крестик-нолик, вводим, что хотим туда вставить (опять же крестик-нолик). Ну, и т.д.
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 18:46  [ТС]     Крестики-нолики: как определить победителя? #5
BumerangSP, можешь пожалуйста скинуть код?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.12.2012, 18:52     Крестики-нолики: как определить победителя? #6
owned, у меня нет кода, я на вскидку сказал. Еще давно в паскале делал.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
тогда из суммы всегда можно вычислить пустую клетку при помощи флагов
в общем вариантов куча
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
тогда из суммы всегда можно вычислить пустую клетку при помощи флагов
в общем вариантов куча
вот это .
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
      }
..........................
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 20:23  [ТС]     Крестики-нолики: как определить победителя? #10
ValeryS, а с таблице как? не получается нормально отобразить... или не там написал.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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 ");
}
}
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;
}
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:19  [ТС]     Крестики-нолики: как определить победителя? #14
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
08.12.2012, 23:20     Крестики-нолики: как определить победителя? #15
Цитата Сообщение от owned Посмотреть сообщение
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
да правильно
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:26  [ТС]     Крестики-нолики: как определить победителя? #16
я хочу сделать так, чтобы клавишами выбирать куда поставить X, как это сделать или не стоит?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
08.12.2012, 23:28     Крестики-нолики: как определить победителя? #17
Цитата Сообщение от owned Посмотреть сообщение
я хочу сделать так, чтобы клавишами выбирать куда поставить X, как это сделать или не стоит?
если ты в ДОСе(Консоль) собираешься писать то можно, но геморно
лучше отладить алгоритм и оболочку написать в Графическом интерфейсе(Виндос?)
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:29  [ТС]     Крестики-нолики: как определить победителя? #18
только в консольном режиме
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
08.12.2012, 23:31     Крестики-нолики: как определить победителя? #19
Цитата Сообщение от owned Посмотреть сообщение
только в консольном режиме
и думаешь много игроков у тебя будет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2012, 20:51     Крестики-нолики: как определить победителя?
Еще ссылки по теме:

C++ Как оптимизировать данный код игры крестики нолики?
C++ Крестики-нолики, поиск в массиве для выявления победителя
C++ Крестики нолики

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

Или воспользуйтесь поиском по форуму:
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
09.12.2012, 20:51  [ТС]     Крестики-нолики: как определить победителя? #20
это экзаменационная работа по си

Добавлено через 21 час 18 минут
up, help please
Yandex
Объявления
09.12.2012, 20:51     Крестики-нолики: как определить победителя?
Ответ Создать тему
Опции темы

Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru