Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Спойлер:

#include
using namespace std;

void vivod()
{

system("cls");


int m[9] = { '-', '-', '-', '-', '-', '-', '-', '-', '-' };


cout << "--- = free kletka" << endl;


cout << "Pole : " << endl;


cout<< "-" << 1 << "-" << "|" << "-" << 2 << "-" << "|" << "-" << 3 << "-" << endl;


cout << "-" << 4 << "-" << "|" << "-" << 5 << "-" << "|" << "-" << 6 << "-" << endl;


cout << "-" << 7 << "-" << "|" << "-" << 8 << "-" << "|" << "-" << 9 << "-" << endl;


cout << "\n";




cout << "sityacia v igre:" << endl;


cout << "-" << m[0] << "-" << "|" << "-" << m[1] << "-" << "|" << "-" << m[2] << "-" << endl;


cout << "-" << m[3] << "-" << "|" << "-" << m[4] << "-" << "|" << "-" << m[5] << "-" << endl;


cout << "-" << m[6] << "-" << "|" << "-" << m[7] << "-" << "|" << "-" << m[8] << "-" << endl;


cout << "\n";
}

void shag(int hod)
{

int nomer;

if (hod == 1) cout << "igrok 1 hodit" << endl;

else cout << "igrok 2 hodit" << endl;

cout << "vvedite yacheiku " ;

cin >> nomer;

cout << endl;

while (nomer > 9 || nomer < 1 || m[nomer-1] == 'X' || m[nomer - 1] == '0') {


cout << "vvedite CORRECT number" << endl;


cin >> nomer;


cout << endl;

}

if (nomer == 1) m[nomer - 1] = 'X';

else m[nomer - 1] = '0';

}
int main()
{




char p1, p2;


cout << "Vvedite imya pervogo igroka" << endl;


cin >> p1;


cout << "vvedite imeya vtorogo igroka" << endl;


cin >> p2;


vivod();


for (int move = 1; move <= 9; move++)


{



if (move % 2) shag(1);



else shag(2);



vivod();


}
}


в функции SHAG у меня почему-то не читается массив
Он у меня обозначен в маине, но не определяется в функции, как быть ?

ungerfall

Пользователь

Регистрация: 13.07.2014

Сообщения: 27

Рейтинг: 17

ungerfall

Регистрация: 13.07.2014

Сообщения: 27

Рейтинг: 17

Область видимости переменных. m[] не глобален.

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

ungerfall сказал(а):
Область видимости переменных. m[] не глобален.
Нажмите, чтобы раскрыть...

вот не понял сейчас
объясни, пожалуйста, хочу понят ьв чем дело
и как фикс

KennyTHPS

Пользователь

Регистрация: 19.10.2012

Сообщения: 1047

Рейтинг: 653

KennyTHPS

Регистрация: 19.10.2012

Сообщения: 1047

Рейтинг: 653

Зачем спрашивать тут, когда есть киберфорум

sensus

Пользователь

Регистрация: 26.12.2012

Сообщения: 4

Рейтинг: 0

sensus

Регистрация: 26.12.2012

Сообщения: 4

Рейтинг: 0

Сделай массив глобальным в заголовочном файле (h.) Или в shag функции ввели второй параметр - массив

ungerfall

Пользователь

Регистрация: 13.07.2014

Сообщения: 27

Рейтинг: 17

ungerfall

Регистрация: 13.07.2014

Сообщения: 27

Рейтинг: 17

Массив m объявлен внутри локальный области видимости (функция vivod). Для того, чтобы сделать его глобальным, можно объявить за пределами функций (int m[9]).

Belonard

Пользователь

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Belonard

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Jazz529 сказал(а):
вот не понял сейчас
объясни, пожалуйста, хочу понят ьв чем дело
и как фикс
Нажмите, чтобы раскрыть...

Почитай чем отличаются глобальные переменные от локальных.
Массив объявленный внутри одной функции не будет доступен другой, потому что у каждой функции свой участок памяти виден.
Глобальные переменные не рекомендуются для больших проектов, да и в небольших программах тоже могут баги вылезать.
Всё зависит от логики в программе.
Если ты этот массив планируешь заполнять черточками только 1 раз за всю программу, то просто поставь его после using namespace std;

Winterhearted

Пользователь

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Winterhearted

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Этот образчик лютейшего говнокода по своей ущербности может поспорить разве что с советами сделать глобальную переменную вместо того, чтобы передать эту переменную параметром функции.

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Belonard сказал(а):
Почитай чем отличаются глобальные переменные от локальных.
Массив объявленный внутри одной функции не будет доступен другой, потому что у каждой функции свой участок памяти виден.
Глобальные переменные не рекомендуются для больших проектов, да и в небольших программах тоже могут баги вылезать.
Всё зависит от логики в программе.
Если ты этот массив планируешь заполнять черточками только 1 раз за всю программу, то просто поставь его после using namespace std;
Нажмите, чтобы раскрыть...

намеспейс стоит
черточки у меня выводятся , все ок
только я не пойму, что мне надо сделать, что бы работало там
У меня не читается в том моменте, где у идет проверка на валидность клетки, стоит ли там Х или 0
Если я объявляю массив в ИНТ, то тоже ничего
ungerfall сказал(а):
Массив m объявлен внутри локальный области видимости (функция vivod). Для того, чтобы сделать его глобальным, можно объявить за пределами функций (int m[9]).
Нажмите, чтобы раскрыть...

я не понимаю, как

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Winterhearted сказал(а):
Этот образчик лютейшего говнокода по своей ущербности может поспорить разве что с советами сделать глобальную переменную вместо того, чтобы передать эту переменную параметром функции.
Нажмите, чтобы раскрыть...

извини, я только учусь азам. я не мастер

Belonard

Пользователь

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Belonard

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Jazz529 сказал(а):
извини, я только учусь азам. я не мастер
Нажмите, чтобы раскрыть...

лучше напиши идею, что должна делать программа, чтобы я дописал кусок кода

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Belonard сказал(а):
лучше напиши идею, что должна делать программа, чтобы я дописал кусок кода
Нажмите, чтобы раскрыть...

это только зародыш, но я хочу проверять части кода, что бы было без ошибок
игра крестики нолики
та функция отвечает за шаг игрока
то есть, в этой функции, ты вводишь номер клеточки, куда ты хочешь поставить, потом я Вайлом проверяю валидность ее, если все ок - то заменяю массив Х или 0

Winterhearted

Пользователь

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Winterhearted

Регистрация: 25.08.2014

Сообщения: 805

Рейтинг: 358

Jazz529 сказал(а):
я не понимаю, как
Нажмите, чтобы раскрыть...

Jazz529 сказал(а):
извини, я только учусь азам. я не мастер
Нажмите, чтобы раскрыть...

Ну так сначала прочитай что такое "переменная", "область видимости", "время жизни", "декларация", определение". Ты сейчас напоминаешь дотера который хочет играть ранкеды не зная что такое клавиатура и мышь, что с ними делать и куда тыкать. При чем вместо вопроса "Как включать комп, можно ли жмякать на кнопки, и что за эта байдень такая с проводом и двумя кнопками на коврике?" ты спрашиваешь "Что собирать гирокоптеру, чтобы не сильно проседать в лейте против ПЛ-а?"

Archiballt

Пользователь

Регистрация: 01.11.2011

Сообщения: 63

Рейтинг: 23

Archiballt

Регистрация: 01.11.2011

Сообщения: 63

Рейтинг: 23

Jazz529 сказал(а):
в функции SHAG у меня почему-то не читается массив
Он у меня обозначен в маине, но не определяется в функции, как быть ?
Нажмите, чтобы раскрыть...
Твоя функция shag не видит массив(т.к он объявлен у тебя внутри локальной функции vivod ), у тебя есть 2 выхода из данной ситуации: 1) Сделать массив глобальным и ввести его, например после using namespace std; 2)Передавать в твою функцию shag массив : void shag(int hod,int m[9]) и поменять обращении к функции if (move % 2) shag(1,m);
else shag(2,m);

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Archiballt сказал(а):
Твоя функция shag не видит массив(т.к он объявлен у тебя внутри локальной функции vivod ), у тебя есть 2 выхода из данной ситуации: 1) Сделать массив глобальным и ввести его, например после using namespace std; 2)Передавать в твою функцию shag массив : void shag(int hod,int m[9]) и поменять обращении к функции if (move % 2) shag(1,m);
else shag(2,m);
Нажмите, чтобы раскрыть...

аааааааааа, все
я забыл, записывали это, а я только что пересматривал и не увидел, спасибо большое

Hairo

Пользователь

Регистрация: 28.05.2014

Сообщения: 42

Рейтинг: 25

Hairo

Регистрация: 28.05.2014

Сообщения: 42

Рейтинг: 25

Jazz529 сказал(а):
это только зародыш, но я хочу проверять части кода, что бы было без ошибок
игра крестики нолики
та функция отвечает за шаг игрока
то есть, в этой функции, ты вводишь номер клеточки, куда ты хочешь поставить, потом я Вайлом проверяю валидность ее, если все ок - то заменяю массив Х или 0
Нажмите, чтобы раскрыть...

Что-то такую ересь даже на первом курсе не писал. Не совсем понимаю чего ты хочешь, но ты в массив int записываешь переменные типа char, потом ты считываешь переменные типа char и сравниваешь и с типом int.

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Hairo сказал(а):
Что-то такую ересь даже на первом курсе не писал. Не совсем понимаю чего ты хочешь, но ты в массив int записываешь переменные типа char, потом ты считываешь переменные типа char и сравниваешь и с типом int.
Нажмите, чтобы раскрыть...

Спойлер:


#include
using namespace std;
char m[9] = { 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F' };
int win;
void vivod()
{

system("cls");


cout << "-F- = free kletka" << endl;


cout << "Pole : " << endl;


cout<< "-" << 1 << "-" << "|" << "-" << 2 << "-" << "|" << "-" << 3 << "-" << endl;


cout << "-" << 4 << "-" << "|" << "-" << 5 << "-" << "|" << "-" << 6 << "-" << endl;


cout << "-" << 7 << "-" << "|" << "-" << 8 << "-" << "|" << "-" << 9 << "-" << endl;


cout << "\n";



cout << "sityacia v igre:" << endl;


cout << "-" << m[0] << "-" << "|" << "-" << m[1] << "-" << "|" << "-" << m[2] << "-" << endl;


cout << "-" << m[3] << "-" << "|" << "-" << m[4] << "-" << "|" << "-" << m[5] << "-" << endl;


cout << "-" << m[6] << "-" << "|" << "-" << m[7] << "-" << "|" << "-" << m[8] << "-" << endl;


cout << "\n";
}

void shag(int hod)
{

int nomer;

if (hod == 1) cout << "igrok 1 hodit" << endl;

else cout << "igrok 2 hodit" << endl;

cout << "vvedite yacheiku " ;

cin >> nomer;

cout << endl;

while (nomer > 9 || nomer < 1 || m[nomer-1] == 'X' || m[nomer - 1] == '0') {


cout << "vvedite CORRECT number" << endl;


cin >> nomer;


cout << endl;

}

if (nomer == 1) m[nomer - 1] = 'X';

else m[nomer - 1] = '0';

}
char check()
{



for (int i = 0; i < 3; i++) {



if (m == m && m == m)




return m;



else if (m == m && m == m)




return m;



else if ((m[2] == m[4] && m[4] == m[6]) || (m[0] == m[4] && m[4] == m[8]))




return m;



return '-';

}

}

void result()
{

if (win == 'X') cout << "player 1 win!" << endl;

else if (win == '0') cout << "player 2 win!" << endl;

else cout << "nichya" << endl;
}

int main()
{



char win = '-';



char p1, p2;


cout << "Vvedite imya pervogo igroka" << endl;


cin >> p1;


cout << "vvedite imeya vtorogo igroka" << endl;


cin >> p2;


vivod();


for (int move = 1; move <= 9; move++)


{



if (move % 2) shag(1);



else shag(2);



vivod();



if (move >= 5) {




win = check();




if (win != '-')





break;



}


}





result();


}


практически работает, только у меня первый раз Х ставится, а остальнные нули.
и да, я затупил с инт и чар

Belonard

Пользователь

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Belonard

Регистрация: 20.03.2013

Сообщения: 920

Рейтинг: 1194

Jazz529 сказал(а):
это только зародыш, но я хочу проверять части кода, что бы было без ошибок
игра крестики нолики
та функция отвечает за шаг игрока
то есть, в этой функции, ты вводишь номер клеточки, куда ты хочешь поставить, потом я Вайлом проверяю валидность ее, если все ок - то заменяю массив Х или 0
Нажмите, чтобы раскрыть...

Спойлер:


#include
using namespace std;

int m[9] = { 9, 9, 9, 9, 9, 9, 9, 9, 9 };

void vivod()
{
system("cls");

cout << "--- = free kletka" << endl;
cout << "Pole : " << endl;
cout<< "-" << 1 << "-" << "|" << "-" << 2 << "-" << "|" << "-" << 3 << "-" << endl;
cout << "-" << 4 << "-" << "|" << "-" << 5 << "-" << "|" << "-" << 6 << "-" << endl;
cout << "-" << 7 << "-" << "|" << "-" << 8 << "-" << "|" << "-" << 9 << "-" << endl;
cout << "\n";

cout << "sityacia v igre:" << endl;
cout << "-" << m[0] << "-" << "|" << "-" << m[1] << "-" << "|" << "-" << m[2] << "-" << endl;
cout << "-" << m[3] << "-" << "|" << "-" << m[4] << "-" << "|" << "-" << m[5] << "-" << endl;
cout << "-" << m[6] << "-" << "|" << "-" << m[7] << "-" << "|" << "-" << m[8] << "-" << endl;
cout << "\n";
}

void shag(int hod)
{
int nomer;
if (hod == 1) cout << "igrok 1 hodit" << endl;
else cout << "igrok 2 hodit" << endl;
cout << "vvedite yacheiku " << endl;
cin >> nomer;
while (nomer > 8 || nomer < 0 || m[nomer-1] == 'X' || m[nomer - 1] == 'O') {
cout << "vvedite CORRECT number" << endl;
cin >> nomer;
}
if (nomer == 1) m[nomer - 1] = 1;
else m[nomer - 1] = 0;

}
int main()
{

char p1, p2;
cout << "Vvedite imya pervogo igroka" << endl;
cin >> p1;
cout << "vvedite imeya vtorogo igroka" << endl;
cin >> p2;

vivod();

for (int move = 1; move <= 9; move++)
{
if (move % 2) shag(1);
else shag(2);
vivod();
}


system("pause");
return 0;
}



Ну вот смотри, у тебя имена игроков, считываются как char(т.е. длинной всего 1 символ), по



Если создаешь массив int, то и клади int в ячейки, иначе символ '0' будет туда записываться как число в кодировке системы(48)

В том, что я выше в спойлер положил пустые ячейки забил девятками, если ходит первый, то кладём 1 (X), иначе 0 (O)


еще исправление
if (nomer== 1) m[nomer - 1] = 1;
->
if (hod== 1) m[nomer - 1] = 1;

nomer это номер ячейки, а проверять нужно номер игрока, т.е. hod

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Belonard сказал(а):
Спойлер:


#include
using namespace std;

int m[9] = { 9, 9, 9, 9, 9, 9, 9, 9, 9 };

void vivod()
{
system("cls");

cout << "--- = free kletka" << endl;
cout << "Pole : " << endl;
cout<< "-" << 1 << "-" << "|" << "-" << 2 << "-" << "|" << "-" << 3 << "-" << endl;
cout << "-" << 4 << "-" << "|" << "-" << 5 << "-" << "|" << "-" << 6 << "-" << endl;
cout << "-" << 7 << "-" << "|" << "-" << 8 << "-" << "|" << "-" << 9 << "-" << endl;
cout << "\n";

cout << "sityacia v igre:" << endl;
cout << "-" << m[0] << "-" << "|" << "-" << m[1] << "-" << "|" << "-" << m[2] << "-" << endl;
cout << "-" << m[3] << "-" << "|" << "-" << m[4] << "-" << "|" << "-" << m[5] << "-" << endl;
cout << "-" << m[6] << "-" << "|" << "-" << m[7] << "-" << "|" << "-" << m[8] << "-" << endl;
cout << "\n";
}

void shag(int hod)
{
int nomer;
if (hod == 1) cout << "igrok 1 hodit" << endl;
else cout << "igrok 2 hodit" << endl;
cout << "vvedite yacheiku " << endl;
cin >> nomer;
while (nomer > 8 || nomer < 0 || m[nomer-1] == 'X' || m[nomer - 1] == 'O') {
cout << "vvedite CORRECT number" << endl;
cin >> nomer;
}
if (nomer == 1) m[nomer - 1] = 1;
else m[nomer - 1] = 0;

}
int main()
{

char p1, p2;
cout << "Vvedite imya pervogo igroka" << endl;
cin >> p1;
cout << "vvedite imeya vtorogo igroka" << endl;
cin >> p2;

vivod();

for (int move = 1; move <= 9; move++)
{
if (move % 2) shag(1);
else shag(2);
vivod();
}


system("pause");
return 0;
}



Ну вот смотри, у тебя имена игроков, считываются как char(т.е. длинной всего 1 символ)



Если создаешь массив int, то и клади int в ячейки, иначе символ '0' будет туда записываться как число в кодировке системы(48)

В том, что я выше в спойлер положил пустые ячейки забил девятками, если ходит первый, то кладём 1 (X), иначе 0 (O)


еще исправление
if (nomer== 1) m[nomer - 1] = 1;
->
if (nomer== 1) m[nomer - 1] = 1;

nomer это номер ячейки, а проверять нужно номер игрока, т.е. hod
Нажмите, чтобы раскрыть...

дада ) эт я нашел
Я фикшу проблемы
теперь все ок, только с проверкой что-то мутно
выводит ничь, когда должно победу, ищу ошибки
спасибо тебе, братишка

aladike

Пользователь

Регистрация: 15.02.2012

Сообщения: 859

Рейтинг: 267

aladike

Регистрация: 15.02.2012

Сообщения: 859

Рейтинг: 267

для меня вы хакеры высшей пробы :hmm:

DarkHost

Пользователь

Регистрация: 15.08.2012

Сообщения: 1824

Рейтинг: 654

DarkHost

Регистрация: 15.08.2012

Сообщения: 1824

Рейтинг: 654

Winterhearted сказал(а):
Этот образчик лютейшего говнокода по своей ущербности может поспорить разве что с советами сделать глобальную переменную вместо того, чтобы передать эту переменную параметром функции.
Нажмите, чтобы раскрыть...

Ну прям "про", даже знаешь такие страшные слова?! :haha:

Jazz529

Пользователь

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

Jazz529

Регистрация: 23.01.2012

Сообщения: 708

Рейтинг: 429

Нарушения: 91

ребзи, я изучаю это с полного нуля около пары месяцев )
для меня это нечто великое )
так что плз, все с чего-то начинают.

minato73

Почетный пользователь

Регистрация: 01.07.2012

Сообщения: 16326

Рейтинг: 14860

minato73

Регистрация: 01.07.2012

Сообщения: 16326

Рейтинг: 14860

img
если честно, лучше на киберфоруме спросить, я там зачетную работу по с++ выполнил)

doppelganger_

Пользователь

Регистрация: 24.06.2014

Сообщения: 3463

Рейтинг: 1619

doppelganger_

Регистрация: 24.06.2014

Сообщения: 3463

Рейтинг: 1619

без шуток, грациос, мистер Андерсон