Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 01:26   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию Крестики нолики

Всем доброй ночи.
Нужна помощь.
Подскажите как в этом коде сделать проверку, типа если в ячейке массива уже записан какой либо символ (крестик или нолик) то нажав заполнить эту ячейку снова пользователю должно выдаться сообщение о том что в заполненной ячейке уже нельзя рисовать, и чтоб предостовлялось право выбрать другую ячейку, до тех пор пока он не выберет свободную.
Что то этот пункт не могу реализовать...
Код:
#include<iostream>
#include<time.h>
#include<windows.h>
#include<iomanip>
#include<conio.h>

using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
		
int field[9]={1,2,3,4,5,6,7,8,9};
int cell,select;
int player=1;
char name1[30];
char name2[30];
bool win=false;
// x=11;
// o=10;
cout<<"Выберите режим игры:"<<endl;
cout<<"1: Игрок vs Игрок"<<endl;
cout<<"2: Игрок vs Компьютер"<<endl;
cin>>select;
if(select==1){
cout<<"Выберите режим сложности"<<endl;
cout<<"1: Легко(поле 3х3)"<<endl;
cout<<"2: Нормально(поле 4х4)"<<endl;
cin>>select;
if(select==1){

cout<<"Введите имя первого игрока (только латинские буквы)"<<endl;
cin>>name1;
cout<<"Введите имя второго игрока (только латинские буквы)"<<endl;
cin>>name2;
do{system("cls");
cout<<"ХОДИТ ИГРОК "<<player<<endl<<endl;
for(int i=1;i<=9;i++)
{
	switch(field[i-1])
	{
	case 10:cout<<"O  ";break;
	case 11:cout<<"X  ";break;
	
	
	default:cout<<field[i-1]<<"  ";
	}
		if(i%3==0)
			{
				cout<<endl<<endl;
			}
		
}
cout<<endl<<endl;

do{
cout<<"Введите координату "<<endl;
cin>>cell;
  }
while(cell<1||cell>9);

field[cell-1]=(player==1)?11:10;
player=(player==1)?2:1;

	
			if(field[0]==11 && field[3]==11 && field[6]==11){
				win=true;
				player=1;
				cout<<"Победа на стороне игрока "<<name1;


		}//else 
				if(field[0]==10 && field[3]==10 && field[6]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
	
		
		}//else 
				if(field[1]==11 && field[4]==11 && field[7]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[1]==10 && field[4]==10 && field[7]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[2]==11 && field[5]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[2]==10 && field[5]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[0]==11 && field[1]==11 && field[2]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[0]==10 && field[1]==10 && field[2]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[3]==11 && field[4]==11 && field[5]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[3]==10 && field[4]==10 && field[5]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[6]==11 && field[7]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[6]==10 && field[7]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[0]==11 && field[4]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[0]==10 && field[4]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[2]==11 && field[4]==11 && field[6]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[2]==10 && field[4]==10 && field[6]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}
				if(win==true){

				cout<<"\nВыберите один из пунктов"<<endl;
				cout<<"1: Новая игра"<<endl;
				cout<<"2: Выход"<<endl;
				cin>>select;
				if(select==1){
				
					win=false;
					field[0]=1;
					field[1]=2;
					field[2]=3;
					field[3]=4;
					field[4]=5;
					field[5]=6;
					field[6]=7;
					field[7]=8;
					field[8]=9;

					
				}
				if(select==2){
					win=true;
				}
				}


		


}while(!win);
revaldo666 вне форума Ответить с цитированием
Старый 20.01.2011, 03:52   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Вы же на C++ пишете, так используйте ООП. Или хотя бы на фукции всё разбейте. Код не читабелен.
Твой код у меня не компилируется, так что помочь не смогу.

Примерно так надо проверять на победу:

Код:
bool testForWin(int x,int y)
{
   if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
   if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
   if(((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
   return 0;
}
Это проверка на победу после изменения поля. x и y -- координаты изменённого поля. Достаточно проверить по горизонтали, вертикали и диагоналям от этого поля.


Вот тут более-менее адекватное решение: http://forum.codenet.ru/showthread.php?t=33070
Или вот лапидарное на C: http://www.cyberforum.ru/post52887.html

И зачем представлять, казалось бы, настолько двухмерную вещь как поле 3x3 в виде одномерного массива?

У тебя индусов в родне не было? Твой код можно сократить более, чем в 9000 раз.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Stilet; 20.01.2011 в 07:52.
Obey-Kun вне форума Ответить с цитированием
Старый 20.01.2011, 09:59   #3
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
Вы же на C++ пишете, так используйте ООП. Или хотя бы на фукции всё разбейте. Код не читабелен.
Твой код у меня не компилируется, так что помочь не смогу.

Примерно так надо проверять на победу:

Код:
bool testForWin(int x,int y)
{
   if((a[y][0] == a[y][1]) && (a[y][1] == a[y][2]) && (a[y][0] != 0)) return 1;
   if((a[0][x] == a[1][x]) && (a[1][x] == a[2][x]) && (a[0][x] != 0)) return 1;
   if(((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]) && (a[0][0] != 0) || ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]) && a[0][2] != 0))) return 1;
   return 0;
}
Это проверка на победу после изменения поля. x и y -- координаты изменённого поля. Достаточно проверить по горизонтали, вертикали и диагоналям от этого поля.


Вот тут более-менее адекватное решение: http://forum.codenet.ru/showthread.php?t=33070
Или вот лапидарное на C: http://www.cyberforum.ru/post52887.html

И зачем представлять, казалось бы, настолько двухмерную вещь как поле 3x3 в виде одномерного массива?

У тебя индусов в родне не было? Твой код можно сократить более, чем в 9000 раз.
спасибо!


Да знаю я что это "быдло кодом" написано, но можно сказатьт только начал си изучать.
revaldo666 вне форума Ответить с цитированием
Старый 20.01.2011, 10:09   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

вот рабочий код
Код:
#include<iostream>
#include<time.h>
#include<windows.h>
#include<iomanip>
#include<conio.h>

using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
		
int field[9]={1,2,3,4,5,6,7,8,9};
int cell,select;
int player=1;
char name1[30];
char name2[30];
bool win=false;
// x=11;
// o=10;
cout<<"Выберите режим игры:"<<endl;
cout<<"1: Игрок vs Игрок"<<endl;
cout<<"2: Игрок vs Компьютер"<<endl;
cin>>select;
if(select==1){
cout<<"Выберите режим сложности"<<endl;
cout<<"1: Легко(поле 3х3)"<<endl;
cout<<"2: Нормально(поле 4х4)"<<endl;
cin>>select;
if(select==1){

cout<<"Введите имя первого игрока (только латинские буквы)"<<endl;
cin>>name1;
cout<<"Введите имя второго игрока (только латинские буквы)"<<endl;
cin>>name2;
do{system("cls");
cout<<"ХОДИТ ИГРОК "<<player<<endl<<endl;
for(int i=1;i<=9;i++)
{
	switch(field[i-1])
	{
	case 10:cout<<"O  ";break;
	case 11:cout<<"X  ";break;
	
	
	default:cout<<field[i-1]<<"  ";
	}
		if(i%3==0)
			{
				cout<<endl<<endl;
			}
		
}
cout<<endl<<endl;

do{
cout<<"Введите координату "<<endl;
cin>>cell;
  }
while(cell<1||cell>9);

field[cell-1]=(player==1)?11:10;
player=(player==1)?2:1;

	
			if(field[0]==11 && field[3]==11 && field[6]==11){
				win=true;
				player=1;
				cout<<"Победа на стороне игрока "<<name1;


		}//else 
				if(field[0]==10 && field[3]==10 && field[6]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
	
		
		}//else 
				if(field[1]==11 && field[4]==11 && field[7]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[1]==10 && field[4]==10 && field[7]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[2]==11 && field[5]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[2]==10 && field[5]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[0]==11 && field[1]==11 && field[2]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[0]==10 && field[1]==10 && field[2]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[3]==11 && field[4]==11 && field[5]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[3]==10 && field[4]==10 && field[5]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[6]==11 && field[7]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[6]==10 && field[7]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[0]==11 && field[4]==11 && field[8]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[0]==10 && field[4]==10 && field[8]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}//else
				if(field[2]==11 && field[4]==11 && field[6]==11){
					win=true;
					player=1;
					cout<<"Победа на стороне игрока "<<name1;
		}//else
				if(field[2]==10 && field[4]==10 && field[6]==10){
					win=true;
					player=2;
					cout<<"Победа на стороне игрока "<<name2;
		}
				if(win==true){

				cout<<"\nВыберите один из пунктов"<<endl;
				cout<<"1: Новая игра"<<endl;
				cout<<"2: Выход"<<endl;
				cin>>select;
				if(select==1){
				
					win=false;
					field[0]=1;
					field[1]=2;
					field[2]=3;
					field[3]=4;
					field[4]=5;
					field[5]=6;
					field[6]=7;
					field[7]=8;
					field[8]=9;

					
				}
				if(select==2){
					win=true;
				}
				}


		


}while(!win);
	
}
cin.get();
return 0;
}
revaldo666 вне форума Ответить с цитированием
Старый 20.01.2011, 11:40   #5
EddieG
Пользователь
 
Регистрация: 18.09.2010
Сообщений: 42
По умолчанию

еще } в конце.
хорошие крестики нолики написал!
Допущение несогласованных и логически несовместимых представлений - часть человеческого мышления.
EddieG вне форума Ответить с цитированием
Старый 20.01.2011, 11:59   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
но можно сказатьт только начал си изучать.
так си или си-плюс-плюс?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 20.01.2011, 15:02   #7
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
так си или си-плюс-плюс?
С++ всётаки)))
revaldo666 вне форума Ответить с цитированием
Старый 20.01.2011, 15:02   #8
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Цитата:
Сообщение от EddieG Посмотреть сообщение
еще } в конце.
хорошие крестики нолики написал!
спасибо...но там ещё есть кусок кода....он только в пост не влазиет))
revaldo666 вне форума Ответить с цитированием
Старый 20.01.2011, 17:02   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

используй pastebin, например http://pastebin.mozilla-russia.org/
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Крестики нолики Anonim69 JavaScript, Ajax 8 08.12.2010 06:00
крестики-нолики {PatRioT} Паскаль, Turbo Pascal, PascalABC.NET 4 14.05.2009 13:24
КРЕСТИКИ-НОЛИКИ((( magadan Паскаль, Turbo Pascal, PascalABC.NET 8 02.05.2009 22:16
Крестики-Нолики. oblachko Помощь студентам 5 23.01.2009 19:32
Крестики нолики Gorbunov Общие вопросы C/C++ 5 22.01.2009 16:04