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

Бред в крестиках ноликах - C++

Восстановить пароль Регистрация
 
Andryuxa
Заблокирован
25.07.2012, 19:28     Бред в крестиках ноликах #1
Проблема. Написал цикдические крестики нолики ( в конце игры спрашивает хотите сыгарть еще или нет?) и после этого происходит какой то бред. Конкретнее скопируйте код и уидите сами. После 5-6 повторения все приходит в норму. Вот сам код:

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char r;
char q='y';
char n1 [20], n2 [20];
char t[9] = {'_', '_', '_', '_', '_', '_', '_', '_', '_'};
int x;
int h;
void game();
void names();
void table();
void win();
void qq();
int endgame();
void playagain();
int main()
{
   cout<<"   X-O Game by Andrew_Grey\n";
   while (q='y')
   {
   cout<<"Do you want read rules? (y = 'Yes, I want!',  n = 'No, I know how play!' )\n";
   metka:
   cin>>r;
   switch (r)
   {
          case 'y':
               cout<<" RULES:\n";
               system("pause");
               system ("cls");
               goto metka2;
               break;
          case 'n':
               system ("cls");
               goto metka2;
               break;
          default:
               cout<<" Error!\n";
               goto metka;
               break;
   }
   metka2:
   playagain();
   names();
   game();
}
return 0;
}
void names()
{
     cout<<"Enter player's names (Please, make sure names are different)\n";
do
     {
     cout<<"\nEnter first player's name: ";
     gets(n1);
     gets(n1);
     cout<<"\n";
     cout<<"\nEnter second player's name: ";
     gets(n2);
     cout<<"\n";
     if (!strcmp(n1, n2)) cout<<"\nPlease, enter different names\n";
     }
while (!strcmp(n1, n2));
cout<<"Let's go!";
system ("pause");
system ("cls");
}
void game ()
{
     cout<<"Game has been started!!!\n";
     goto metka3;
     while (x<1 || x>9 || t[x-1]=='X' || t[x-1]=='O' || h>9)
     {
           metka3:
           table ();
           cout<<"Player "<<n1<<" is choosing place: ";
           cin>>x;
           if (x<1 || x>9)
           {
           cout<<"Error! Please choosing true places!\n";
           goto metka3;
           }
           if (t[x-1]=='X' || t[x-1]=='O') 
           {
           cout<<"Error! Please make sure place hasn't been taken!";
           goto metka3;
           }
           t[x-1]='X';
           h=h+1;
           system ("cls");
           qq();
           metka4:
           table ();
           cout<<"Player "<<n2<<" is choosing place: ";
           cin>>x;
           if (x<1 || x>9)
           {
           cout<<"Error! Please choosing true places!\n";
           goto metka4;
           }
           if (t[x-1]=='X' || t[x-1]=='O') 
           {
           cout<<"Error! Please make sure place hasn't been taken!";
           goto metka4;
           }
           t[x-1]='O';
           h=h+1;
           system ("cls");
           qq();
     }
}
void table ()
{
      cout<<"                                    "<<n1<<" VS "<<n2<<"\n";
      cout << t[0] << '|' << t[1] << '|' << t[2]  << endl;
      cout << t[3] << '|' << t[4] << '|' << t[5]  << endl;
      cout << t[6] << '|' << t[7] << '|' << t[8]  << "\n" << endl;
}   
void win()
{
     table();
     if(t[0]==t[1] && t[1]==t[2] && t[2]=='X' || t[3]==t[4] && t[4]==t[5] && t[5]=='X' ||t[6]==t[7] && t[8]==t[7] && t[8]=='X' ||t[0]==t[3] && t[3]==t[6] && t[6]=='X' ||t[1]==t[4] && t[4]==t[7] && t[7]=='X' ||t[5]==t[2] && t[8]==t[5] && t[8]=='X' ||t[2]==t[4] && t[6]==t[4] && t[6]=='X' ||t[0]==t[4] && t[4]==t[8] && t[8]=='X' )
     {
                   cout<<"\nPlayer "<<n1<<" win!\n";
                   endgame();
     }
     else
     {
         if (t[0]==t[1] && t[1]==t[2] && t[2]=='O' || t[3]==t[4] && t[4]==t[5] && t[5]=='O' ||t[6]==t[7] && t[8]==t[7] && t[8]=='O' ||t[0]==t[3] && t[3]==t[6] && t[6]=='O' ||t[1]==t[4] && t[4]==t[7] && t[7]=='O' ||t[5]==t[2] && t[8]==t[5] && t[8]=='O' ||t[2]==t[4] && t[6]==t[4] && t[6]=='O' ||t[0]==t[4] && t[4]==t[8] && t[8]=='O' )
         {
                   cout<<"\nPlayer "<<n2<<" win!\n";
                   endgame();
         }
         else
         {
             if (h==9)
             {
             cout<<"\nDraw!\n";
             endgame();
             }                
         }
     }
}
int endgame()
{
   cout<<" Do you want play again??? (y = 'Yes, we want!', n = 'No, next time')\n";
   cin>>q;
   switch (q)
   {
          case 'y':
               system ("cls");
               playagain();
               break;
          case 'n':
               return 0;
               break;
          default:
               cout<<" Error!\n";
               cin>>q;
               break;
   }
}
void qq()
{
     switch (h)
           {
                  case 4:
                       win();
                       break;
                  case 5:
                       win();
                       break;
                  case 6:
                       win();
                       break;
                  case 7:
                       win();
                       break;
                  case 8:
                       win();
                       break;
                  case 9:
                       win();
                       break;
           }
}
void playagain()
{
     h=0;
     t[0]='_'; t[1]='_'; t[2]='_'; t[3]='_'; t[4]='_'; t[5]='_'; t[6]='_'; t[7]='_'; t[8]='_'; t[9]='_'; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2012, 19:28     Бред в крестиках ноликах
Посмотрите здесь:

C++ не использовать do/while ? бред !
проверка на IF что за бред C++
C++ бред в результате
C++ какой то бред!
Бред со счетом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
25.07.2012, 19:38     Бред в крестиках ноликах #2
Поставь теги, пожалуйста, ато в сплошном коде без табуляций пытаться разобраться как-то совсем не хочется, ровно как и ставить их
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2012, 06:09     Бред в крестиках ноликах #3
Цитата Сообщение от Andryuxa Посмотреть сообщение
t[0]='_'; t[1]='_'; t[2]='_'; t[3]='_'; t[4]='_'; t[5]='_'; t[6]='_'; t[7]='_'; t[8]='_'; t[9]='_';
Причина может быть и не в этом, но char t[9]. Максимальный индекс 8. И как выглядит бред?
Andryuxa
Заблокирован
26.07.2012, 19:15  [ТС]     Бред в крестиках ноликах #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Причина может быть и не в этом, но char t[9]. Максимальный индекс 8. И как выглядит бред?
Почему макс индек 8? Бред заключается в следующем:
Нельзя изменять имена ( то есть void names () даже не запускается)
После следующего цикла игра продолжается с того момента на котором закончилось в предъидущем цикле.( вот это я скорее всего знаю как исправить)
Ну и немного по мелочам

Добавлено через 41 секунду
Цитата Сообщение от nexen Посмотреть сообщение
Поставь теги, пожалуйста, ато в сплошном коде без табуляций пытаться разобраться как-то совсем не хочется, ровно как и ставить их
Как ставить теги? )))
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
26.07.2012, 20:22     Бред в крестиках ноликах #5
Первая ошибка
while (q='y')
всегда присваивает переменной q значение 'y',
поэтому условие всегда истинно.
Может быть надо
while (q=='y')

Второе.
Не смешивайте ввод из <iostream> и <stdio.h>
C++
1
2
3
4
5
6
    cin.getline(n1,19);
     //gets(n1);
     cout<<"\n";
     cout<<"\nEnter second player's name: ";
      cin.getline(n1,19);
    //gets(n2);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 01:30     Бред в крестиках ноликах #6
Цитата Сообщение от Andryuxa Посмотреть сообщение
Почему макс индек 8?
Потому что объявлен массив на 9 элементов char t[9](строка 8 кода, и там всё правильно), а в этой строке вы сколько значений присваиваете?
t[0]='_'; t[1]='_'; t[2]='_'; t[3]='_'; t[4]='_'; t[5]='_'; t[6]='_'; t[7]='_'; t[8]='_'; t[9]='_';
Посчитайте.
Andryuxa
Заблокирован
27.07.2012, 13:45  [ТС]     Бред в крестиках ноликах #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что объявлен массив на 9 элементов char t[9](строка 8 кода, и там всё правильно), а в этой строке вы сколько значений присваиваете? Посчитайте.
Ой точно спасибо!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 14:40     Бред в крестиках ноликах
Еще ссылки по теме:

Почему выводит бред C++
Бред при декомпиляции C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.07.2012, 14:40     Бред в крестиках ноликах #8
Цитата Сообщение от Andryuxa Посмотреть сообщение
Почему макс индек 8?
А ты сосчитай. 1-й - index=0, 2-й - index=2. 3-й - index=2, 4-й - index=3, 5-й -index=4, 6-й - index=5, 7-й - index=6, 8-й - index=7, 9-й - index=8. Всё. С индексом равным 9 будет уже 10-й, а согласно декларации их сего 9.
Yandex
Объявления
27.07.2012, 14:40     Бред в крестиках ноликах
Ответ Создать тему
Опции темы

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