Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76

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

08.12.2012, 04:17. Показов 6526. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2012, 04:17
Ответы с готовыми решениями:

Крестики-нолики: как написать код для того, чтобы программа могла объявить победителя?
И да, поле 5 на 5. Сам код: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;Windows.h&gt; using namespace std; void...

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

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

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

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
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.12.2012, 18:44
Не заглядывая в код, могу сказать (т.к. уже имел опыт с крестиками-ноликами))). Есть матрица, которую вполне можно заполнить просто пробелами (в случае, если тип char, можно конечно и любой другой, лучше int, тогда изначально забивать -1, например). Организуем какое-нибудь перемещение по координатам и в зависимости от положения отмечаем в матрице крестики-нолики. При этом подсчитывая ходы. В принципе, можно даже без координат, если по-простому: вводим клетку, в которую хотим записать крестик-нолик, вводим, что хотим туда вставить (опять же крестик-нолик). Ну, и т.д.
0
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 18:46  [ТС]
BumerangSP, можешь пожалуйста скинуть код?
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
08.12.2012, 18:52
owned, у меня нет кода, я на вскидку сказал. Еще давно в паскале делал.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 19:07
Цитата Сообщение от 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
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 19:15  [ТС]
ValeryS, я тебя не сильно понял, покажи пожалуйста на примере

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
можно пустое поле заполнять так
110 120 140
210 220 240
410 420 440
тогда из суммы всегда можно вычислить пустую клетку при помощи флагов
в общем вариантов куча
вот это .
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 19:41
Цитата Сообщение от 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
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 20:23  [ТС]
ValeryS, а с таблице как? не получается нормально отобразить... или не там написал.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 20:33
Цитата Сообщение от 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
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:04  [ТС]
о, спасибо большое, есть успехи) не выходи из темы пожалуйста, 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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 23:15
Цитата Сообщение от 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
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:19  [ТС]
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 23:20
Цитата Сообщение от owned Посмотреть сообщение
а в кейсах 1 - крестик, 0 - нолик, остальное пустое место. я правильно понял?
да правильно
0
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:26  [ТС]
я хочу сделать так, чтобы клавишами выбирать куда поставить X, как это сделать или не стоит?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 23:28
Цитата Сообщение от owned Посмотреть сообщение
я хочу сделать так, чтобы клавишами выбирать куда поставить X, как это сделать или не стоит?
если ты в ДОСе(Консоль) собираешься писать то можно, но геморно
лучше отладить алгоритм и оболочку написать в Графическом интерфейсе(Виндос?)
0
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
08.12.2012, 23:29  [ТС]
только в консольном режиме
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
08.12.2012, 23:31
Цитата Сообщение от owned Посмотреть сообщение
только в консольном режиме
и думаешь много игроков у тебя будет?
0
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
09.12.2012, 20:51  [ТС]
это экзаменационная работа по си

Добавлено через 21 час 18 минут
up, help please
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2012, 20:51
Помогаю со студенческими работами здесь

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

Крестики нолики
Доброго времени суток, недавно, я решил написать программу Крестики нолики, опираясь на свои знания в С++, но при компиляции кода...

Крестики-нолики
Пишу крестики нолики, получается смесь ООП и говнокода:senor: Вот собственно код: #include &quot;Pole.h&quot; void...

крестики нолики
Я дошел до проверки или кто-то выиграл и тут мне немного не понравилось.Для того чтобы проверить есть ли победитель, я сравниваю элементы...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru