Python Forum

Full Version: problem on creating a small game
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
hello, i am making a little card game like hearstone more or less.
but i encounter a difficulty when i try to fight the cards.
I do not understand and therefore cannot resolve the error that python reports to us

#Importation de tous les modules utiles
from random import *
from math import *

#CREATION DES DEFINITIONS

#Tirage au sort pour savoir qui pose la première carte
def quicommence():
    premier=randint (1,2)
    return premier


#Chargement des cartes
def loadCards(nomFichier,sep=','):
    with open(nomFichier,encoding='utf8') as fichier:
        entete = fichier.readline()
        entete = entete[:-1].strip(' ').split(sep)
        jeu = []
        for ligne in fichier:
            carte = {}
            ligne = ligne.strip('\n').split(sep)
            for i in range(len(ligne)):
                    if ligne[i] == '':
                        continue
                    if entete[i] in ['mana','attaque','pv','defense']:
                        carte[entete[i]] = int(ligne[i])
                    else :
                        carte[entete[i]] = ligne[i]
            jeu.append(carte)
        return jeu

cartesCreatures = loadCards("creatures.csv")


#affichage des cartes(worgens)
def displayCard(carte):

    # récupération des différents mots composant le nom
    listeMot = carte['nom'].split(' ')

    # longueur du plus long mot
    m = 0
    for mot in listeMot :
        if len(mot) > m : m = len(mot)

    # constantes de texte
    blanc = ' ' * (m-2)
    rule = '-'*(m+4)
    empty = '|  ' + blanc + '  |'
    masque = '{:^'+str(m+2)+'}' # pour centrer les noms

    # Construction du haut
    haut = '|' + chr(ord('\u26A1')) + str(carte['attaque']) + blanc  + str(carte['defense']) + chr(ord('\u2745')) + '|'

    # Construction du bas
    bas =  '|' + chr(ord('\u2665')) + str(carte['pv']) + blanc  + str(carte['mana']) + chr(ord('\u0271')) + '|'

    # Affichage
    print(rule)
    print(haut)
    print(empty)
    for mot in listeMot :
        print('|' + masque.format(mot) + '|')
    print(empty)
    print(bas)
    print(rule)


#Définition de la pioche qui est aléatoire.
def piochecarte (source, destination, nbcartes):
    for i in range(nbcartes):
        index = randint(0, len(source)-1)
        destination.append(source[index])


#Attribution du nombres de cartes
def nbcartes():
    for i in [jeu]:
        i=64
    for i in [deck1]:
        i=32
    for i in [deck2]:
        i=32


#Création de la valeur de la carte (Worgens)
def valeurdelacarte(carte):
    print ('valeurdelcarte',carte)
    return carte['attaque']*3-carte['defense']


#Gestion des combats
def combatcarte(cartejoueur,carteIa):
    print('combatcarte',cartejoueur,carteIa)
    scorecartejoueur = valeurdelacarte(cartejoueur)
    scorecarteIa = valeurdelacarte(carteIa)
    if  scorecartehumain > scorecarteIa :
        humainscores = humainscores + 1
        print ("vous avez gagné cette manche")
    elif scorecarteIa > scorecartehumain :
        Iascores = Iascores + 1
        print ("vous avez perdu cette manche")
    else :
        print ("vous avez fait égalité")
    return 
    
    
#Définition du tour de jeu de l'humain
def cartejoueur():
    for carte in main1:
        displayCard(carte)
    indexcarte = int(input("votre choix: "))
    while indexcarte < 1 or indexcarte > len(main1) :
        print(indexcarte," choix invalide !")
        indexcarte = int(input("votre choix: "))
    carteajouerhumain = main1[indexcarte - 1 ]
    main1.pop(indexcarte-1)
    print()
    print("vous avez choisi: ")
    displayCard (carteajouerhumain)


#Définition du tour de jeu de l'IA
def carteIa():
    indexcarte = randint(0, len(main2)-1)
    carteajouerIa = main2[indexcarte - 1]
    main2.pop(indexcarte-1)
    displayCard (carteajouerIa)
    


#CREATION DES VARIABLES
tonpere = []
deck1 = []
deck2 = []
main1 = []
main2 = []
humainscores = 0
Iascores = 0


#ORGANISATION DU JEU

print("Pour décider qui pose la première carte nous allons faire un tirage aléatoire, le joueur désigner posera la première carte et commencer le combat")
if quicommence() == 1 :
    print("joueur désigner: Humain")
else :
    print("joueur désigner: Orc")
print()


#Utilisation de la fonction qui permet de prendre 32 cartes aléatoirement pour créer les 2 decks
piochecarte(cartesCreatures,deck1,32)
piochecarte(cartesCreatures,deck2,32)


#Utilisation de a fonction piochecarte permettant de créer les mains avec 3 cartes issues du deck
piochecarte(deck1,main1,3)
piochecarte(deck2,main2,3)



#Affichage des mains et de a carte choisi par l'humain et l'IA
if quicommence() == 1 :
    print("vos carte : ")
    cartejoueur()
    print ()
    print("la carte de l'Orc: ")
    carteIa ()
    print()
else :
    print("la carte de l'Orc: ")
    carteIa ()
    print()
    print("vos carte : ")
    cartejoueur()
    print ()

while humainscores < 10 or  Iascores < 10 :
    combatcarte (cartejoueur,carteIa)
    print('combatcarte',cartejoueur,carteIa)
    print ("votre score est de : ",humainscores)
    print()
    print("le score de l'Orc est de : ",Iascores )
    print()
if humainscore == 10 :
    print ("Vous êtes le grand vainqueur!!!!!!")
else :
    print ("Vous avez perdu! ")
Error:
Traceback (most recent call last): File "C:\Users\yohan\OneDrive\Bureau\projet info\Nouveau dossier\fin.py", line 180, in <module> combatcarte (cartejoueur,carteIa) File "C:\Users\yohan\OneDrive\Bureau\projet info\Nouveau dossier\fin.py", line 95, in combatcarte scorecartejoueur = valeurdelacarte(cartejoueur) File "C:\Users\yohan\OneDrive\Bureau\projet info\Nouveau dossier\fin.py", line 89, in valeurdelacarte return carte['attaque']*3-carte['defense'] TypeError: 'function' object is not subscriptable
i hope could you help me
cordially
In that line (180) you pass the two functions, rather than the values returned by those functions. Probably something more like combatcarte (cartejoueur(),carteIa()) is intended.
thank you but it still doesn't work
Does it help to use int()?

return int(carte['attaque']*3) - int(carte['defense'])
[quote="michael1789" pid='132807' dateline='1607574619']
Does it help to use int()?

return int(carte['attaque']*3) - int(carte['defense'])
[/quote

thank but it doesn't work
I don't have your csv files so can't test myself. What error are you getting, and where?