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

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

Войти
Регистрация
Восстановить пароль
 
Sashaman
Сообщений: n/a
#1

Крестики Нолиики - C++

27.06.2013, 15:36. Просмотров 208. Ответов 0
Метки нет (Все метки)

Помогите пожалуйста с кодом, а точней с алгоритмом, программа без ошибок, но когда побеждают крестики, он говорит, что побеждают нолики(

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <iostream> //Стандартная библиотека ввода-вывода
#include <cstring> //Стандартная библиотека для работы со строками]
#include <stdio.h>
 
using namespace std;
 
 
 
 
 
char PlayerName1[80]; //Переменные для имен игроков
char cells[9] = {'-', '-', '-', '-', '-', '-', '-', '-', '-'}; 
char PlayerName2[80]; //почему они объявлены глобальными вы поймете немного позже
char win='-'; //Символ победы ("-" - ничья, "Х" - первого игрока, "О" - второго)
 
void show_cells();
void make_move(int);
char check();
void result(); 
 
int main (){
   do {
      cout << "Enter the name of the 1st player: ";
      gets(PlayerName1);
      cout << "Enter the name of the 2st player: ";
      gets(PlayerName2);
      cout << "\n";
   } while (!strcmp(PlayerName1, PlayerName2));
 
   show_cells();
 
   for (int move = 1; move <= 9; move++) {
      if (move % 2) make_move(1);
              else make_move(2);               
      show_cells();                          
      if (move >= 5)
 
/*Если номер хода 5 или больше, то проходит проверка на победу (раньше, чем на 5-ом ходе победить нельзя)*/
      {
          win=check(); //Символ победы - это возвращенное значение функции проверки
          if(win!='-') //Если символ победы не "-" (то есть кто-то победил),
             break; //то нету смысла в дальнейших ходах и цикл прерывается
      }
    }
 
    //Цикл закончился и ничто не победил - ничья
    result(); //Функция, которая выводит результат
    system ("pause");
    return 0;
}
 
 
 
//в нем хранятся данные о клеточках ("-" - пустая, "Х" - первого игрока, "О" - второго)
 
void show_cells()  {//функция не имеет возвращающего типа, потому что она просто выводит поле
 
   system("cls"); //системная функция, которая очищает экран для того чтобы выглядело солидно
 
 
 
   cout << "Numbers of cells:\n" << endl;
 
   //Номера клеток для того, чтобы человек знал куда ходить
 
   cout << "-" << 1 << "-" << '|' << "-" << 2 << "-" << '|' << "-" << 3 << "-" << endl;
   cout << "-" << 4 << "-" << '|' << "-" << 5 << "-" << '|' << "-" << 6 << "-" << endl;
   cout << "-" << 7 << "-" << '|' << "-" << 8 << "-" << '|' << "-" << 9 << "-" << "\n" << endl;
   cout << "Current situation (--- is empty):\n" << endl;
 
   //Текущая ситуация на поле (клеточка --- - пуста)
   cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << endl;
   cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << endl;
   cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << "\n" << endl;
}
 
 
void make_move(int num) {
 
/*это функция тоже ничего не возвращает, но у нее есть аргумент - номеригрока, который будет делать ход*/
 
   if (num == 1) cout << PlayerName1;
 
//Если аргумент = 1, то выводится имя первого игрока (то есть он будет ходить)
 
      else cout << PlayerName2;
 
   cout << ", enter a cell's number to make move: ";
 
   int cell;
 
   cin >> cell; //Игрок который ходит должен указать номер клеточки
 
   cout << "\n";
 
   while (cell > 9 || cell < 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X') {
 
//Проверка на валидность (клеточка не занята и ее номер не <1 и не >9
 
       cout << "Enter a CORRECT (1-9) or EMPTY (---) cell's number to make move: ";
 
       cin >> cell; //Если проверка не пройдена, то игрок должен еще раз ввести номер клеточки
 
       cout << "\n";
 
   }
 
 
 
   if (num == 1) cells[cell-1] = 'X'; //Первый игрок играет "крестиками", а второй - "ноликами"
 
      else cells[cell-1] = 'O';
 
   show_cells();
 
   system ("pause");
 
//   return 0;
 
        }
 
 
 
 
 
char check()
 
{
 
   for(int i = 0; i < 3; i++) //Для победы нужны 3 клеточки
 
      if (cells[i*3] == cells[i*3+1] && cells[i*3+1] == cells[i*3+2]) //Комбинации для победы вычисляются по
 
         return cells[i]; //разным формулам, эта - по горизонтали
 
         //0-1-2, 3-4-5 и 6-7-8
 
         //нумерация в массиве начинается с 0
 
      else if (cells[i] == cells[i+3] && cells[i+3] == cells[i+6]) //Вертикальная
 
         return cells[i]; //0-3-6, 1-4-7 и 2-5-8
 
      else if ((cells[2] == cells[4] && cells[4] == cells[6]) || (cells[0] == cells[4] && cells[4] == cells[8]))
 
         return cells[i]; //И по диагонали: 0-4-8 и 2-4-6
 
      return '-'; //Иначе - ничья
 
}
 
 
void result() {
 
   if (win=='X') cout << PlayerName1 << " win! Congratulations! " << PlayerName2 << " is looser! " << endl;
 
   else if (win=='O') cout << PlayerName2 << " win! Congratulations! " << PlayerName1 << " is looser! " << endl;
 
   else cout << "Draw!!!" << endl; //Тут я думаю понятно
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2013, 15:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Крестики Нолиики (C++):

Крестики нолики - C++
Требование к игре: -игра в консольным окне( самое простое ) -игра с компьютером. Нужна самая простая игра. Желательно на си, чтоб...

Крестики нолики - C++
Привет всем! Пишу крестики нолики в консоли и проблема вот в чем: нарисовал само поле, и нужно при вводе координат определенного участка...

Крестики нолики 10 на 10 - C++
Нашел код крестики нолики 4 на 4 но не компилируется, там ошибки почему то в &lt;&lt; хочу сделать из него 10 на 10 Может кто нибудь...

Крестики-нолики - C++
Всем привет и заранее спасибо, кто откликнется. Проблема следующая: игра работает почти корректно, за исключением одной детали: при вызове...

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

Крестики нолики на С - C++
Здраствуйте. Помогите пожалуйста написать игру в консоли. Это крестики нолики поле 3х3. Буду благодарен если поможете и объясните. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2013, 15:36
Привет! Вот еще темы с ответами:

Крестики-нолики - C++
Захотелось написать игру Крестики-нолики но тут возник один вопрос, как будет ходить компютер, если пользоватся rand-ом то компютер будет...

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

Крестики-нолики - C++
Доброго времени суток! Вот, решил для курсовой работы написать игру Крестики-нолики. Но мне требуется маленькая помощь. Подскажите, как...

Крестики-нолики - C++
При запуске выдаёт ошибку error LNK2001: неразрешенный внешний символ &quot;&quot;char __cdecl check(void)&quot; (?check@@YADXZ)&quot; Судя по всему,...


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

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

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