123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- # -*- coding: utf-8 -*-
- N_PLAYERS = 4
- N_TURN = int(32/4)
- # P : pique, C : Coeur, F : Carreau, T : Trèfle
- # 7..9, 0 puis VDRA
- cards =['AP', 'RP', 'DP', 'VP', '0P', '9P', '8P', '7P',
- 'AC', 'RC', 'DC', 'VC', '0C', '9C', '8C', '7C',
- 'AF', 'RF', 'DF', 'VF', '0F', '9F', '8F', '7F',
- 'AT', 'RT', 'DT', 'VT', '0T', '9T', '8T', '7T'
- ]
- points_atout = {'V' : 20, '9' : 14, 'A': 11, '0': 10, 'R': 4, 'D': 3, '8':0, '7':0}
- points_atout_order = {'V' : 20, '9' : 14, 'A': 11, '0': 10, 'R': 4, 'D': 3, '8':1, '7':0}
- points_order = {'A': 11, '0': 10, 'R': 4, 'D': 3, 'V': 2, '9': 1, '8':0.5, '7':0}
- points = {'A': 11, '0': 10, 'R': 4, 'D': 3, 'V': 2, '9': 0, '8':0, '7':0}
- translate = {'A': 'As', 'R' : 'Roi', 'D': 'Dame', 'V': 'Valet', '0': '10', 'P': 'Pique', 'C': 'Coeur', 'T':'Trèfle', 'F':'Carreau'}
- colors = ['P', 'C', 'F', 'T']
- def translator(card):
- s = []
- for c in card:
- if c in translate:
- s.append(translate[c])
- else:
- s.append(c)
- return ' '.join(s)
- def winner(cards, atout):
- """
- Returns id winner (0-3), number of points
- """
- if isinstance(cards, str):
- cardsl = cards.split(',')
- cardss = cards
- else:
- cardss = ''.join(cards)
- cardsl = cards
- if len(cardss)==0:
- return 0, 0
- winner = None
- if atout in cardss:
- for i in range(len(cardsl)):
- if cardsl[i][1] == atout:
- if winner is None or points_atout_order[cardsl[i][0]] > points_atout_order[cardsl[winner][0]]:
- winner = i
- if winner is None:
- couldemandee = cardss[1]
- for i in range(len(cardsl)):
- if cardsl[i][1] == couldemandee:
- if winner is None or points_order[cardsl[i][0]] > points_order[cardsl[winner][0]]:
- winner = i
- pointsr = 0
- for c in cardsl:
- if c[1] == atout:
- pointsr += points_atout[c[0]]
- else:
- pointsr += points[c[0]]
- return winner, pointsr
- def legal_play(played, atout, card, main):
- if card not in cards:
- return False
- if card not in main:
- return False
- if played is None :
- playedl = []
- playeds = ''
- elif isinstance(played, str):
- playedl = played.split(',')
- playeds = played
- else:
- playeds = ''.join(played)
- playedl = played
- if main is None or main=='':
- main = []
- if isinstance(main, str):
- mains = main
- main = main.split(',')
- else:
- mains = ','.join(main)
- # Le premier a jouer fait ce qu'il veut
- if len(playeds)==0:
- return True
- couldemandee =playeds[1]
- # On regarde les atouts pour plus tard:
- maxpose = -1
- for c in playedl:
- if c[1]==atout and points_atout_order[c[0]]>maxpose:
- maxpose = points_atout_order[c[0]]
- peutmonter = False
- has_atout = False
- for m in main: #Peut-on monter ?
- if m[1] == atout:
- has_atout = True
- if points_atout_order[m[0]]>maxpose:
- peutmonter = True
- break
- # Il faut jouer de la couleur demandée
- if couldemandee != atout:
- if couldemandee in mains:
- if card[1]== couldemandee:
- return True
- else:
- return False
- if couldemandee == atout:
- # Il faut jouer atout (si possible)
- if has_atout:
- if card[1] != atout:
- return False
- # Et monter ! (si possible)
- if peutmonter:
- if points_atout_order[card[0]]<=maxpose:
- return False
- # Mais si on a pas, tant pis !
- return True
- # Sinon, mon partenaire est-il maitre ?
- if len(playedl)>=2:
- maitre, xxx = winner(playedl, atout)
- if maitre == len(playedl)-2 :
- # Si oui, jeu libre
- return True
- # Sinon, ai-je de l'atout ?
- if has_atout:
- if card[1] != atout:
- return False
- # Si oui, je dois monter si possible
- if peutmonter:
- if points_atout_order[card[0]] < maxpose:
- return False
- return True
- # Sinon, jeu libre !
- return True
|