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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2012, 19:06   #1
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию Сравнение переменных типа char

Добрый день. Пишу консольные крестики и нолики
Делаю функцию, которая проверяет наличие победителя. Возникла проблема с сравнением.
То есть если в ряд Х то функция останавливает игру, и выводит соответсвующее сообщение. Это понятно как бы)))
Но, мое ветвление почему напрочь пропускает такие случаи. то есть даже если игрок выграл, игра продолжается. Может я неверно сравниваю? Подскажите пожалуйста.

Код:
if(    (status[1-1]==status[2-1] && status[2-1]==status[3-1]) ||
		(status[1-1]==status[5-1] && status[5-1]==status[9-1]) ||
		(status[1-1]==status[4-1] && status[4-1]==status[7-1]) ||
		(status[4-1]==status[5-1] && status[5-1]==status[6-1]) ||
		(status[7-1]==status[5-1] && status[5-1]==status[3-1]) ||
		(status[7-1]==status[8-1] && status[8-1]==status[9-1]) ||
		(status[2-1]==status[5-1] && status[5-1]==status[8-1]) ||
		(status[3-1]==status[6-1] && status[6-1]==status[9-1])	)
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 06.08.2012, 20:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может стоит пересмотреть способ проверки?
Например если известны координаты хода (x,y) то:
Код:
bool winner(int x,int y){
 for(int i=0;i<3 &&  status[i][y]!=status[x][y],i++) return false;
 for(int i=0;i<3 &&  status[x][i]!=status[x][y],i++) return false;
 if(x==y) for(int i=0;i<3 &&  status[i][i]!=status[x][y],i++) return false;
 if((3-x)==y) for(int i=0;i<3 &&  status[i][i]!=status[3-x][y],i++) return false;

 return true;
}
Т.е. смысл в проходах по параллелям и меридианам с диагоналями карты и выяснениям все ли символы на пути совпадают с поставленным.
Код не проверял, писал с потолка, но думаю как идея он подходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.08.2012, 20:41   #3
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Спасибо за идею. Буду переделывать тогда под двухмерный массив. А вообще, к примеру есть такое объявление:
Код:
char ch1='y';
char ch2='y';
то сравнение их производится также, как и сравнение чисел?
Код:
if(ch1==ch2)
{
....
}
так?
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 06.08.2012, 21:13   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В общем то да.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.08.2012, 00:32   #5
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

есть массив

Код:
#define SIZE 3
test[SIZE][SIZE];
как через цикл проверить совпадение столбцов, строк и диагонали? ничего не додумаю. вручную прописывать все случаи(их 7) можно, но глуповато. а если поменять SIZE на 9 к примеру, то их еще больше. вообщем..нуждаюсь в мыслях.
Код:
for(int i = 0; i < SIZE; i++)
   for(int j = 0; j < SIZE; j++)
   {
      if( test[i][j]==test[i][j+1] && test[i][j+1+1] )
   }
это скажем для столбцов, и то не верно я делаю. так как когда j будет равным 1 уже будет ошибка( test[i][3] не существует, массив 3х3)

вообщем, прошу ваших мыслей..

просто ваш код Stilet мне не много не понятен..) никогда не использовал в цикле фор более 1ого условия продолжения цикла..
Я могу, Я хочу, Я буду!

Последний раз редактировалось Stilet; 07.08.2012 в 07:44.
ArmanPrestige вне форума Ответить с цитированием
Старый 07.08.2012, 08:53   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Начните с того, что сформулирайте подробно свою задачу - что именно вам надо сравнить и с чем и какво должен быть результат. Придумав описание алгоритма погоняйте его вручную на предмет проверки а там глядиш и код прояснится как написать...
waleri вне форума Ответить с цитированием
Старый 07.08.2012, 13:23   #7
lexrova871
Новичок
Джуниор
 
Регистрация: 07.08.2012
Сообщений: 1
Сообщение

Вообще я полагаю нужны будут еще символы для обозначения незаполненных элементов.
Попробуй так:

Код:

bool w(char s[3][3])
{
	//строки
	if((s[0][0] == s[0][1] && s[0][0] == s[0][2] && s[0][0] != 0) ||	
	   (s[1][0] == s[1][1] && s[1][0] == s[1][2] && s[1][0] != 0) || 	
	   (s[2][0] == s[2][1] && s[2][0] == s[2][2] && s[2][0] != 0)) 	return true;
	//столбцы
	if((s[0][0] == s[1][0] && s[0][0] == s[2][0] && s[0][0] != 0) ||	
	  (s[0][1] == s[1][1] && s[0][1] == s[2][1] && s[0][1] != 0) ||	
	  (s[0][2] == s[1][2] && s[0][2] == s[2][2] && s[0][2] != 0))	return true;
	//диагональ
	if((s[0][0] == s[1][1] && s[0][0] == s[2][2] && s[0][0] != 0 ) ||	
	  (s[0][2] == s[1][1] && s[0][2] == s[2][0] && s[0][2] != 0 ))	return true;

	return false;
}

...

char status[3][3] = { { 'O', 'O', 0 },
			     { 'X', 'X', 'X'},
			     { 0, 0, 0 } };
if(w(status))
{
   printf("winner!");
}
здесь символом 'O' - игровой ноль, 0 - незаполненный элемент

Последний раз редактировалось lexrova871; 07.08.2012 в 13:26.
lexrova871 вне форума Ответить с цитированием
Старый 07.08.2012, 14:37   #8
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Это все понятно. Это можно написать вручную, если небольшая матрица. А если матрица из N строк и N столбцов? В ручную все писать опять таки? Переформулирую вопрос.:
Цитата:
Есть матрица размером N на N. Как проверить, одинаковы ли элементы матрицы по столбцу, по строке и диагоналям.
Должен ведь существовать какой-то алгоритм. В принципе как меняются индексы я понял. Чтобы по строке прогнать, мы первый индекс не меняем, а инкремментируем только второй(который указывает на столбец). Чтобы прогнать по столбцу, то наоборот. Я просто не знаю как это запихнуть в цикл, и как в теле цикла проводить проверку.
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 07.08.2012, 14:52   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

for (int col=0; col < SIZE; ++col) if (array[const][col] == cond) { ... }
waleri вне форума Ответить с цитированием
Старый 07.08.2012, 15:44   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
как через цикл проверить совпадение столбцов, строк и диагонали? ничего не додумаю. вручную прописывать все случаи(их 7) можно, но глуповато. а если поменять SIZE на 9 к примеру, то их еще больше. вообщем..нуждаюсь в мыслях.
не уверен что понял Вас, но если понял:
Код:
for( int i = 0; i < n; ++i ) {
    if( 0 == a[ i ][ 0 ] )
        continue; 
    for( int j = 1; j < n; ++j ) 
        if( a[ i ][ j ] != a[ i ][ 0 ] )
            break;
    if( j != n )
        continue;
    //в i-той строке все элементы одинаковы и не равны нулю
}
Код:
for( int i = 0; i < n; ++i ) {
    if( 0 == a[ 0 ][ i ] )
        continue; 
    for( int j = 1; j < n; ++j ) 
        if( a[ j ][ i ] != a[ 0 ][ i ] )
            break;
    if( j != n )
        continue;
    //в i-том столбцевсе элементы одинаковы и не равны нулю
    
}
Код:
if( 0 != a[ 0 ][ 0 ] )
    for( i = 1; i < n; ++i ) 
        if( a[ i ][ i ] != a[ 0 ][ 0 ] )
            break;
if( i == n )
    //на главной диагонали все элементы равны и...
Код:
int t = n - 1
if( 0 != a[ 0 ][ t ] )
    for( i = 1; i < n; ++i ) 
        if( a[ i ][ t - i ] != a[ 0 ][ t ] )
            break;
if( i == n )
    //на побочной диагонали все элементы равны и...
код не проверял, писал без подсветки в браузере, МБ опечатался

Цитата:
а если поменять SIZE на 9 к примеру, то их еще больше. вообщем..нуждаюсь в мыслях.
на поле 9х9 должны быть другие правила игры, там обычно требуется собрать 5 крестиков или ноликов в ряд

Последний раз редактировалось rrrFer; 07.08.2012 в 15:50. Причина: теги QUOTE вместо CODE( опечатка)
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
Сравнение значения char.C++ jasul Помощь студентам 4 28.10.2011 13:25
Сравнение переменных snikers987 PHP 26 12.02.2011 01:01
Сравнение объектных переменных NomadV Microsoft Office Word 1 09.04.2010 16:44
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35