Что нового

Как сравнить элементы массивов

eropov

Jury
Сообщения
195
Репутация
25
Скажите, можно ли, сравнить элементы массива по их индексу! (если такое можно реализовать, скажите что можно, тогда я напишу пример по существенней и понятнее)
Есть массив (Для наглядности)
Код:
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"], ["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _
["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]

Приходит массив 1
Код:
Dim $aKolod[1] = ["d6.gif"]

Приходит массив 2
Код:
Dim $aK[8] = ["d7","d8","d9","d1","dJ","dQ","dK","dA"]

Задача состоит в том , что элемент (d6.gif) массива 1 меньше элементf (d7) массива 2 (и вообще все элементы стоят от меньшего к большему d6 < d7 < d8 < d9 < d1 < dJ < dQ < dK < dA) после того как мы найдем (или не найдем) в массиве 2, элемент больше, чем в массиве 1, должно что-то выполниться.
Может у кого то есто другие соображения
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
eropov

{CodeWarn}
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Судя по тому, что никто не ответил на мой вопрос, объясню, что к чему.
Все знают игру в карточного дурака. Есть 36 карт 4 масти по 9 карт.(карты собираются в массив)
Код:
Dim $aKoloda[4][9] =[["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"]
["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"]
["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"]
["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]

Допустим играют 2 человека (я и компьютер)
Компьютер ходит на меня картой с6(6 крести),
У меня имеется 6 карт на руках (допустим таких)
Код:
Dim $aK[8] = ["d7","с8","с9","sJ","sA","hQ"]


Как сделать код таким образом чтобы он понимал, что с6 меньше с8 и еще есть козырь (допустим) hQ который больше 3х мастей включая козырей идущих до дамы (hQ)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
eropov
ну так сравнивай индексы по второй размерности. больший индекс бьет меньший. а вот по поводу козыря, я бы добавил размерность к массиву мастей, в котором последняя размерность случайным образом выбиралась из четырех первых индексов той же размерности. примерно так
Код:
Global $aKoloda[5][9] =[["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"], _
["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"], _
["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _
["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"], _
"NA","NA","NA","NA","NA","NA","NA","NA","NA"]]
$iTrump = Random(0, 3, 1); козырь
For $i = 0 to 8
	$aKoloda[4][$i] = $aKoloda[$iTrump][$i]
Next

Func CardComparison($card1, $card2, $iTrump)
	$aInd1 = GetIndByName($card1)
	$aInd2 = GetIndByName($card2)
	If $aInd1[0] = $iTrump Then ; если первая карта козырь
		If $aInd2[0] = $iTrump Then ; если и вторая карта козырь
			If $aInd1[1] > $aInd2[1] Then ; то сравниваем по второму индексу
				Return 1; card1 > card2
			Else
				Return -1; card1 < card2
			EndIf
		Else
			Return 1; card1 > card2
		EndIf
	Else
		If $aInd1[0] = $aInd2[0] Then ; если масть первой карты совпадает со второй
			If $aInd1[1] > $aInd2[1] Then ; то сравниваем вторые индексы
				Return 1; cardd1 > card2
			Else
				Return -1; card1 < card2
			EndIf
		Else ; в противном случае
			If $aInd2[0] = $iTrump Then ; проверяем не козырь ли вторая карта
				Return -1; card1 < card2
			Else ; если нет, то карты несравнимы
				Return 0; not comparable
			EndIf
		EndIf
	EndIf
EndFunc

Func GetIndByName($card)
	Dim $aInd[2]
	For $i = 0 to 3
		For $j = 0 to 8
			If $aKoloda[$i][$j] = $card Then
				$aInd[0] = $i
				$aInd[1] = $j
				Return $aInd
			EndIf
		Next
	Next
EndFunc
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Kaster, козырь у меня приходит в переменную, может если карту на отбивание не находим, переменную(козырь) по первому символу сравнивать с картами на руках, ищем наименьший козырь на руках и отбиваемся?
Как у тебя работает функция GetIndByName, у меня выдает нули в следствии чего компилятор ругается вот так:
Subscript used with non-Array variable.: на вот эту строчку кода
If $aInd1[0] = $iTrump Then
If $aInd1^ ERROR)
Использую следующий код
Код:
#include <Array.au3>

Global $aKoloda[4][9] =[["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"], _
["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"], _
["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _
["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Dim $iTrump[1] = ["h9"] ;массив с козырем
Dim $card1[1] = ["c9"] ;карта которая пришла нападающим
Dim $card2[6] = ["c8","c1","dJ","sQ","hK","hA"];Карты на руках
$er = CardComparison($card1, $card2, $iTrump)
;_ArrayDisplay($card1)

Func CardComparison($card1, $card2, $iTrump)
    $aInd1 = GetIndByName($card1)
    $aInd2 = GetIndByName($card2)
	MsgBox(1,'',$aInd1)
	_ArrayDisplay($aInd1)
    If $aInd1[0] = $iTrump Then ; если первая карта козырь
        If $aInd2[0] = $iTrump Then ; если и вторая карта козырь
            If $aInd1[1] > $aInd2[1] Then ; то сравниваем по второму индексу
                Return $aInd1; card1 > card2
            Else
                Return $aInd2; card1 < card2
            EndIf
        Else
            Return 1; card1 > card2
        EndIf
    Else
        If $aInd1[0] = $aInd2[0] Then ; если масть первой карты совпадает со второй
            If $aInd1[1] > $aInd2[1] Then ; то сравниваем вторые индексы
                Return 1; cardd1 > card2
            Else
                Return -1; card1 < card2
            EndIf
        Else ; в противном случае
            If $aInd2[0] = $iTrump Then ; проверяем не козырь ли вторая карта
                Return -1; card1 < card2
            Else ; если нет, то карты несравнимы
                Return 0; not comparable
            EndIf
        EndIf
    EndIf
EndFunc

Func GetIndByName($card)
	Dim $aInd[2]
    For $i = 0 to 3
        For $j = 0 to 8
            If $aKoloda[$i][$j] = $card Then
                $aInd[0] = $i
                $aInd[1] = $j
                Return $aInd
            EndIf
        Next
    Next
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
eropov
ты неправильно используешь переменную $iTrump. это должно быть число, которая показывает какая из мастей козырная. от 0 до 3. т.к. козырь как правило выбирается рандомно, я так и сделал. в остальном сравнение полностью реализовано, с учетом всех козырей и мастей. поэтому передай индекс козыря правильно и сравнение будет ли card1 бить card2 сработает как надо
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Значит мне надо загнать массив с козырем в функцию GetIndByName($card) узнать индекс, после загнать индекс в переменную $iTrump. Я правилино тебя понял. :-\
Пробовал как спросил у тебя выше не получилось, сделал на прямую и все равно выдает ошибку в том же месте. Вот код:
Код:
#include <Array.au3>

Global $aKoloda[4][9] =[["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"], _
["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"], _
["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _
["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Dim $iTrump = '3' ;Козырь
Dim $card1[1] = ["c9"] ;карта которая пришла нападающим
Dim $card2[6] = ["c8","c1","dJ","sQ","hK","hA"];Карты на руках
$er = CardComparison($card1, $card2, $iTrump)

Func CardComparison($card1, $card2, $iTrump)
    $aInd1 = GetIndByName($card1)
    $aInd2 = GetIndByName($card2)
	MsgBox(1,'',$aInd1) ;сдесь ноль
	MsgBox(1,'',$aInd2) ;сдесь ноль(Дальше код прирывается)
	;_ArrayDisplay($aInd1)
    If $aInd1[0] = $iTrump Then ; если первая карта козырь
        If $aInd2[0] = $iTrump Then ; если и вторая карта козырь
            If $aInd1[1] > $aInd2[1] Then ; то сравниваем по второму индексу
                Return $aInd1; card1 > card2
            Else
                Return $aInd2; card1 < card2
            EndIf
        Else
            Return 1; card1 > card2
        EndIf
    Else
        If $aInd1[0] = $aInd2[0] Then ; если масть первой карты совпадает со второй
            If $aInd1[1] > $aInd2[1] Then ; то сравниваем вторые индексы
                Return 1; cardd1 > card2
            Else
                Return -1; card1 < card2
            EndIf
        Else ; в противном случае
            If $aInd2[0] = $iTrump Then ; проверяем не козырь ли вторая карта
                Return -1; card1 < card2
            Else ; если нет, то карты несравнимы
                Return 0; not comparable
            EndIf
        EndIf
    EndIf
EndFunc

Func GetIndByName($card)
	Dim $aInd[2]
    For $i = 0 to 3
        For $j = 0 to 8
            If $aKoloda[$i][$j] = $card Then
                $aInd[0] = $i
                $aInd[1] = $j
                Return $aInd
            EndIf
        Next
    Next
EndFunc
Как мне кажется функция GetIndByName работает как то не так?!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
eropov [?]
Значит мне надо загнать массив с козырем в функцию GetIndByName($card) узнать индекс, после загнать индекс в переменную $iTrump. Я правилино тебя понял.
нет. пройдись по коду, он же небольшой. $card это всего лишь карта, то есть типа "d6", "hQ" и т.д., а не массив. $iTrump это число, а не строка, то есть $iTrump = 3 (не '3'). после инициализации всех 36 карт, у каждой карты есть индекс в этом массиве. например, если посмотришь, как ты перечислил карты в определении массива $aKoloda, то к примеру у карты "s1" индекс будет (2, 4), что значит 3-я строка, 5-й ряд. уот этот индекс и возвращает функция GetIndByName. первый индекс означает масть, то есть 0 - d, 1 - c, 2 - s, 3 - h. второй индекс это сама карта. переменные $card1 и $card2 это тоже строки, а не массивы. вобщем все твои проблемы из-за несоблюдения типов.
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
В том то все и дело, Я получаю данные в массив, значит и и обрабатывать надо массив, а изначально массивы это таблицы с объектами
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
eropov [?]
обрабатывать надо массив
ну так, вперед :ok:
там переделать не сложно для тебя, т.к. ты знаешь структуру данных. я лишь попытался дать поверхностную идею сравнения элементов массива с учетом особенности игры в дурака.
 
Верх