Belote/belote_jeu.py

149 lines
4.1 KiB
Python

# -*- 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