Что нового

Как рассчитать комбинацию в конце игры в дурака

eropov

Jury
Сообщения
195
Репутация
25
Добрый день!
Помогите, пожалуйста, сделать функцию. Есть игра в карты. точнее в карточного дурака (на двоих). Допусти, играем в дурака до тех пор, пока не уйдет колода, когда остались только карты на руках (у двух игроков) нужно чтобы функция рассчитывала правильную комбинацию.
Есть массив колоды карт
Код:
;Создаем массив колоды
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 $Kozr[1] = ["s6"] ;Козырь
Dim $Karti 1[2] = ["dK", "hA"] ;Карта 1 игрока
Dim $Karti 2[2] = [ "d6", "sK"] ;Карты 2 игрока

Начнем с простого есть два игрока у них по 2 карты, допустим если ходит игрок 2,то получится 2 варианта:
1)Т.к. у первого игрока нет козырей, ходим "sK"(король пики) что приведет к тому, что игроку 1 придется взять карту, после ходим "d6" (шестерка бубей).
2)Можно сходить "d6" (шестерка бубей), тогда игроку 1 придется отбиваться "dK" (король бубей), т.к. у игрока есть король , то подкидываем "sK"(короля пики)
Нужно создать функцию которая будет рассчитывать правильную комбинацию для выигрыша.
Вот код. Возвращает массив парных комбинаций карт двух игроков и параметры вида 0,-1,1,-2,2,-3,3(для понимания этих параметров смотреть в функцию CardSravn)
Код:
#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 $Kozr[1] = ["s6"] ;Козырь
Dim $Pole[2] = ["dK", "hA"] ;карты 1 игрока
Dim $Karti[2] = [ "d6", "sK"] ;карты 2 игрока
Dim $aArray[UBound($Pole) * UBound($Karti)][3]


_Otbiv1($aArray, $Kozr, $Pole, $Karti)
_ArrayDisplay($aArray)


Func _Otbiv1(ByRef $aArray, $Kozr, $Pole, $Karti)
	Local $sPole, $sKarti, $indPole, $af = 0
	For $i = 0 To UBound($Pole)-1
		$sPole = $Pole[$i]
		;$indPole = GetIndByName($Pole[$i])
		For $j = 0 To UBound($Karti)-1
			$sKarti = $Karti[$j]
			;$indKarti = GetIndByName($Karti[$j])
			$CS = CardSravn($sPole, $sKarti, $Kozr)
			$aArray[$af][0] = $sPole ;& $indPole[0] & $indPole[1]
			$aArray[$af][1] = $sKarti ;& $indKarti[0] & $indKarti[1]
			$aArray[$af][2] = $CS
			$af += 1
		Next
	Next
Return $aArray
EndFunc ;==>_Otbiv1

Func CardSravn($sPole, $sKarti, $iTrump)
	;Dim $Karti
	Local $aInd1[2], $aInd2[2]
	$aInd1 = GetIndByName($sPole);Попадают карты с поля в виде строк (1карта)
	$aInd2 = GetIndByName($sKarti);Попадают карты на руках в виде строк (1карта)
	$iTrump = GetIndByKoz(_ArrayToString($iTrump, "|")); приходит массив с козырем ____ Попадает козырная карта в виде строки
	;MsgBox(1,"$aInd1",$aInd1)
	;_ArrayDisplay($aInd1)
	If $aInd1[0] = $iTrump Then ; если первая карта козырь
		If $aInd2[0] = $iTrump Then ; если и вторая карта козырь
			If $aInd1[1] > $aInd2[1] Then ; то сравниваем по второму индексу
				Return -3; 1 карта козырь > 2 карта козырь
			Else
				Return 3; 1 карта козырь < 2 карта козырь
			EndIf
		Else
			Return -2; 1 карта козырь > 2 карта простая
		EndIf
	Else
		If $aInd1[0] = $aInd2[0] Then ; если масть первой карты совпадает со второй
			If $aInd1[1] > $aInd2[1] Then ; то сравниваем вторые индексы
				Return -1; 1 карта простая > 2 карта простая
			Else
				Return 1; 1 карта простая < 2 карта простая
			EndIf
		Else ; в противном случае
			If $aInd2[0] = $iTrump Then ; проверяем не козырь ли вторая карта
				Return 2; 1 карта простая < 2 карта козырь
			Else ; если нет, то карты несравнимы
				Return 0; not comparable
			EndIf
		EndIf
	EndIf
EndFunc   ;==>CardSravn

Func GetIndByName($card)
	Local $aInd[2]
	Local $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"]]
	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

Func GetIndByKoz($card)
	Dim $aInd[2]
	Local $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"]]
	For $i = 0 To 3
		For $j = 0 To 8
			If $aKoloda[$i][$j] = $card Then
				$aInd[0] = $i
				$aInd[1] = $j
				Return $aInd[0]
			EndIf
		Next
	Next
EndFunc   ;==>GetIndByKoz
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: Как рассчитать правильную комбинацию

[warn]За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Как рассчитать правильную комбинацию" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор раздела.[/warn]









Но вообще, вопрос мало к AutoIt относится. Скорее к самой игре.

Наиболее простой вариант (и самый медленный) - это просто перебор всех вариантов.
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
SyDR
Тему изменил. Мне любой вариант пойдет, было бы от чего отталкиваться.
Прошло больше суток, а ни у кого ни каких вариантов. Может нейросеть использовать???? :D
 

SyDr

Сидра
Сообщения
651
Репутация
158
Знаешь что такое графы? Если нет, посмотри определение. Пригодится.

Так вот, текущее состояние - это вершина графа, а возможный ход - ребро. И с учётом того, что ходы не могут приводить к одному и тому же состоянию игрового поля - это ещё и ацикличный граф. Короче, это дерево :smile:

Твоя задача на текущем ходе перебрать все возможные варианты и выбрать среди них наилучший. На второй картинке решена эта задача для твоего примера: всего можно сыграть 7 различных игр, 3 из которых приводят к выигрышу второго игрока и 2 - к выигрышу 1. При этом правая ветка ведёт только к выигрышу только 2 игрока. Вот она там нам и нужна.

1.png
2.png
 
Верх