Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Probleme pour mettre un jeu sous parametre graphique

0 votes

J'ai un problème dans mon programme,j'ai fais une partie en mode "terminal" ou il y a eu aucun problème jusqu'où on a voulu le mettre en paramètre graphique ou cela s'affichait seulement quand le jeu est fini or on veut que cela soit tout le temps.
On s'est inspiré d'un programme " squelette" qui permet de passer du mode "terminal" au "graphique"

Voici le programme suivant:

import threading
import random
from scipy import*
from Tkinter import *
import Tkinter
import os
import time
from msvcrt import kbhit,getch
import winsound
import threading

class MyTimer:
    def __init__(self,tempo,target,args=[],kwargs={}):
        self._target=target
        self._args=args
        self._kwargs=kwargs
        self._tempo=tempo

    def _run(self):
        self._timer=threading.Timer(self._tempo,self._run)
        self._timer.start()
        self._target(*self._args,**self._kwargs)

    def start(self):
        self._timer=threading.Timer(self._tempo,self._run)
        self._timer.start()

    def stop(self):
        self._timer.cancel()

def affiche_tableau(x1,y1):
    global scorej1,scorej2
    scorej1=0
    scorej2=0
    os.system("cls")
    for y in range(y1):
        for x in range(x1):
            print t[y,x],
            if t[y,x]==1:
                scsorej1=scorej1+1
            if t[y,x]==2:
                scorej2=scorej2+1
        print
    print
    print "score joueur 1 : ",scorej1
    print "score joueur 2 : ",scorej2

def deplace(x1,y1):
    global joueur
    t[y1,x1]=joueur
    affiche_tableau(10,10)
    touche=getch()

    if touche=="d":
        if t[y1,x1+1]==0:
            t[y1,x1]=0
            x1=x1+1
            t[y1,x1]=joueur
            affiche_tableau(10,10)
        else:
            t[y1,x1]=0
            xs=x1
            ys=y1
            while (t[y1,x1+1]==1) or (t[y1,x1+1]==2):
                x1=x1+1
            if t[y1,x1+1]==0:
                x1=x1+1
                t[y1,x1]=joueur
                affiche_tableau(10,10)
            else:
                x1=xs
                y1=ys
                affiche_tableau(10,10)

    if touche=="q":
        if t[y1,x1-1]==0:
            t[y1,x1]=0
            x1=x1-1
            t[y1,x1]=joueur
            affiche_tableau(10,10)
        else:
            t[y1,x1]=0
            xs=x1
            ys=y1
            while (t[y1,x1-1]==1) or (t[y1,x1-1]==2):
                x1=x1-1
            if t[y1,x1-1]==0:
                x1=x1-1
                t[y1,x1]=joueur
                affiche_tableau(10,10)
            else:
                x1=xs
                y1=ys
                affiche_tableau(10,10)

    if touche=="z":
        if t[y1-1,x1]==0:
            t[y1,x1]=0
            y1=y1-1
            t[y1,x1]=joueur
            affiche_tableau(10,10)
        else:
            t[y1,x1]=0
            xs=x1
            ys=y1
            while (t[y1-1,x1]==1) or (t[y1-1,x1]==2):
                y1=y1-1
            if t[y1-1,x1]==0:
                y1=y1-1
                t[y1,x1]=joueur
                affiche_tableau(10,10)
            else:
                x1=xs
                y1=ys
                affiche_tableau(10,10)

    if touche=="s":
        if t[y1+1,x1]==0:
            t[y1,x1]=0
            y1=y1+1
            t[y1,x1]=joueur
            affiche_tableau(10,10)
        else:
            t[y1,x1]=0
            xs=x1
            ys=y1
            while (t[y1+1,x1]==1) or (t[y1+1,x1]==2):
                y1=y1+1
            if t[y1+1,x1]==0:
                y1=y1+1
                t[y1,x1]=joueur
                affiche_tableau(10,10)
            else:
                x1=xs
                y1=ys
                affiche_tableau(10,10)

    if touche==" ":

        if joueur==7:
            t[y1,x1]=1
            if t[y1,x1+1]==2:
                t[y1,x1+1] =1
            if t[y1,x1-1]==2:
                t[y1,x1-1] =1
            if t[y1+1,x1]==2:
                t[y1+1,x1] =1
            if t[y1-1,x1]==2:
                t[y1-1,x1] =1
            if t[y1+1,x1+1]==2:
                t[y1+1,x1+1] =1
            if t[y1-1,x1-1]==2:
                t[y1-1,x1-1] =1
            if t[y1+1,x1-1]==2:
                t[y1+1,x1-1] =1
            if t[y1-1,x1+1]==2:
                t[y1-1,x1+1] =1

                if x1+1<10:
                    if t[y1,x1+1]==2:
                        t[y1,x1+1] =1

        if joueur==6:
            t[y1,x1]=2
            if t[y1,x1+1]==1:
                t[y1,x1+1] =2
            if t[y1,x1-1]==1:
                t[y1,x1-1] =2
            if t[y1+1,x1]==1:
                t[y1+1,x1] =2
            if t[y1-1,x1]==1:
                t[y1-1,x1] =2
            if t[y1+1,x1+1]==1:
                t[y1+1,x1+1] =2
            if t[y1-1,x1-1]==1:
                t[y1-1,x1-1] =2
            if t[y1+1,x1-1]==1:
                t[y1+1,x1-1] =2
            if t[y1-1,x1+1]==1:
                t[y1-1,x1+1] =2

                if x1+1<10:
                    if t[y1,x1+1]==1:
                        t[y1,x1+1] =2


        affiche_tableau(10,10)
        x1=1
        y1=0
        if joueur==7:
            joueur=6
        else:
            joueur=7
    return x1,y1

def tableau_graphique(xmax,ymax):
    r=9   # facteur d'échelle
    for x, y in zip(range(xmax), range(ymax)):
        if t[y,x]==9:
            #can.create_rectangle(x*20,y*20,x*20+18,y*20+18,fill='blue')
            try:
                pave1=can.create_image(x*20,y*20,image=image_pave1,anchor=NW)
            except Exception,e:
                bidon=1


        if t[y,x]==2 :
            try:
                can.create_oval(x*20,y*20,x*20+2*r,y*20+2*r,fill='cyan')
            except Exception,e:
                bidon=1

        if  t[y,x]==0:
            try:
                can.create_rectangle(x*20,y*20,x*20+2*r,y*20+2*r,fill='green')
            except Exception,e:
                bidon=1

        if t[y,x]==1:
            try:
                can.create_oval(x*20,y*20,x*20+2*r,y*20+2*r,fill='orange')
            except Exception,e:
                bidon=1

def initialiser():
    can.delete(ALL)
    tableau_graphique(10,10)

def lance_timer():
    global timehb,flagtimer
    if flagtimer==0:
        flagtimer=1
        timehb.start()    #Lance le timer 1 seule fois !

# Routine executée par le timer cycliquement :
def gestion(unstr):
    global compteur_hb

    compteur_hb=compteur_hb+1

    if compteur_hb==5:
        can.delete(ALL)
        compteur_hb =0

    # Appeler ici toutes les routines que vous devez exécuter cycliquement :
    animation()

    # Raffraichissement des tableaux (uniquement ici !) :

    tableau_graphique(10,10)

    affiche_tableau(10,10)

def animation():
    joueur=7
    x=1
    y=0
    scorej1=0
    scorej2=0
    go=1
    print
    affiche_tableau(10,10)
    while go==1:
        x,y=deplace(x,y)

def clavier(evt):
    global xp

    if t[y,x]==7:
        try:
            pave1=can.create_image(x*20,y*20,image=image_pave2,anchor=NW)
        except Exception,e:
            bidon=1
demandé 12-Mai-2015 par Crufty (104 points)
edité 12-Mai-2015 par Sam

Quelle est la question ?

Pourrais-tu formater ton code stp ?

Crufty : tu peux éditer ta question même après l'avoir posté si besoin. Là j'ai fais un peu de ménage sinon on pouvait rien lire. Donne nous clairement la question, qu'est-ce que tu veux obtenir, qu'est-ce que tu obtiens à la place, si il y a des messages d'erreurs, etc.

1 Réponse

–3 votes

Le jeu se lance sous mode "terminal" et en mode "graphique" quand la partie se finie or j'ai besoin que cela soit en mode graphique du début a la fin

Voilà la suite du programme vu que c'est limité a 8000 caractère

if t[y,x] == 6:
    try:
        pave1 = can.create_image(x*20, y*20, image=image_pave3, anchor=NW)
    except Exception, e:
        bidon=1 

Rajouter toutes vos routines ici :

-----------------------------------------

INITIALISATION du programme principal :

Initialisez toutes les variables globales et tableau ici :

t=zeros([10,10],int) # t[y,x] y= et x=10
t[4,5] = 1 # Emplacement des 1 et 2 initial
t[4,4] = 2
t[5,4] = 1
t[5,5] = 2

t[0,0] = 9 # Bords du tableau: 9

t[0,2] = 9
t[0,3] = 9
t[0,4] = 9
t[0,5] = 9
t[0,6] = 9
t[0,7] = 9
t[0,8] = 9
t[0,9] = 9
t[1,0] = 9
t[2,0] = 9
t[3,0] = 9
t[4,0] = 9
t[5,0] = 9
t[6,0] = 9
t[7,0] = 9
t[8,0] = 9
t[9,0] = 9
t[1,9] = 9
t[2,9] = 9
t[3,9] = 9
t[4,9] = 9
t[5,9] = 9
t[6,9] = 9
t[7,9] = 9
t[8,9] = 9
t[9,1] = 9
t[9,2] = 9
t[9,3] = 9
t[9,4] = 9
t[9,5] = 9
t[9,6] = 9
t[9,7] = 9
t[9,8] = 9
t[9,9] = 9

joueur=7 # Apparition
x=1
y=0

scorej1=0
scorej2=0

go=1
print
finboucle=0
i
boucle=0
reset1=0

Création du timer pour la gestion routines cycliques :

timehb = MyTimer(0.1, gestion, ["MyTimer"])

Création de la fenetre graphique :

fen = Tk()
imagepave1 = PhotoImage(file='murm2.gif')
image
pave2 = PhotoImage(file='murm2.gif')
image_pave3 = PhotoImage(file='murm2.gif')

can = Canvas(fen, width =198, height =198, bg ='blue')
can.pack(side =TOP, padx =100, pady =100)

b1 = Button(fen, text =' Initialiser ', command =initialiser)
b1.pack(side =LEFT, padx =3, pady =3)

b2 = Button(fen, text =' ... ', command =lance_timer)
b2.pack(side =LEFT, padx =30, pady =3)

b3 = Button(fen, text =' Quitter ', command =fen.quit)
b3.pack(side =LEFT, padx =80, pady =3)

texte=Tkinter.Text(fen, width=70, height=5)
texte.insert(Tkinter.END,'deplacements: z = haut poser: [espace] q = gauche s = bas d = droite ')
texte.pack(side=Tkinter.LEFT)

winsound.PlaySound("boum1.wav", winsound.SND_ASYNC)

impératif pour que tout fonctionne :

fen.bind_all('', clavier)
fen.mainloop()

répondu 12-Mai-2015 par Crufty (104 points)

Crufty, applique toi un peu s'il te plait. Tu viens de poster une réponse à ta propre question, avec encore une fois du texte non formatté. Et tu n'as toujours pas répondu aux commentaires.

Crufty, ça pique grave les yeux ton code. J'ai la conjonctivite là.
C'est normal tu débutes, t'es pressé de faire des trucs cool.
bref :
- laisses tomber tous tes imports, tu dois apprendre les bases EN URGENCE.
- Entraînes toi sur les listes, les dicos , les tuples , les sets.
-Essayes de créer des fichiers, les ouvrir, copier, fermer, y récupérer une variable...
- Découvre les listes en intention ,l'unpacking...
- Puis un peu de POO quand ça ira mieux...

Tu fais fausse route avec une GUI, joues avec IDLE au début, tout simplement !
Mets toi un mini défi :
Tu fais un programmes qui demande le nom, la race,le sexe, le poids de tous les animaux du quartier : tu sauvegardes le résultat dans un fichier, tu tries et tu affiches.

Crufty, plusieurs remarques pour rebondir sur le commentaire de buffalo974.

utilise des boucles. Par exemple, pour le code

t[0,2] = 9
t[0,3] = 9
t[0,4] = 9
t[0,5] = 9
t[0,6] = 9
t[0,7] = 9
t[0,8] = 9
t[0,9] = 9
t[1,0] = 9

Si ton array doit contenir 1000 entrées, tu ne vas pas (et ne veux pas) taper 1000 ligne de code ;)

J'ai tiqué sur les 'except: bidon = 1'.
Utilise 'pass' dans ce cas la, c'est fait pour. (Mais dans la vraie vie tu ne voudra jamais que tes exceptions meurent silencieusement. Le mieux c'est de logger - cf the-most-diabolical-python-antipattern)

Utilise des constantes. Dans ton cas par exemple : 't[0,2] = 9', c'est pas hyper lisible. Défini une constante genre BORDER=9 puis utilise cette constante.

Évite les globals, passe tes variables en paramètre : çà facilite la lecture et tu auras un meilleur contrôle sur les portions de code qui modifient tes variables.

Pour ta question : désolé je ne l'ai pas comprise ;)

Tu connais ton programe, mais nous, non. On ne peut pas forcément prendre le temps de le lire en entier.
Si tu pose ton code d'un seul bloc, a l'arrache et sans formatage ca donne encore moins envie.
Il faut que tu filtre en amont les bouts de code pertinents, que tu donne le max d'infos de contexte et que tu pose une question précise.

Je t'invite a relire la faq

...