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

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

Восстановить пароль Регистрация
 
Sashaman
Сообщений: n/a
27.06.2013, 15:36     Крестики Нолиики #1
Помогите пожалуйста с кодом, а точней с алгоритмом, программа без ошибок, но когда побеждают крестики, он говорит, что побеждают нолики(

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++
C++ Крестики-нолики
C++ Крестики-нолики
Крестики нолики C++
Крестики нолики C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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