Un RPG (Kivy)

par wlaidet

Il ne s’agit que de la structure du jeu. Le projet n’est pas terminé.

Vous trouverez dans cet article :

  • des images d’écrans du jeu
  • le code source (Python Kivy)

Choix du personnage :

choix du personnage

Le monde :

Monde

Un combat :

Un combat

Le code source :

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
import random
from kivy.uix.image import Image
import time
from kivy.core.window import Window

class perso():
    def __init__(self,nom,Arme,agilite,force,magie,inteligence,precision,classe,Armure):
        self.arme=Arme
        self.Prenom=nom
        self.vie=100
        self.A=agilite
        self.F=force
        self.M=magie
        self.I=inteligence
        self.P=precision
        self.pos=[1,1]
        self.classe=classe
        self.armure=Armure
       
class monstre():
    def __init__(self,pv,dgs,arma):
        self.vie=pv
        self.dgs=dgs
        self.arm=arma
       
class MenuScreen(Screen):
        def build(self):
            self.name='Menu'
            Menu_Layout=menu()#On creer le contenu
            Menu_Layout.build()
            self.add_widget(Menu_Layout)#On ajoute le contenu dans l'ecran
            sm.add_widget(self)#On ajoute l'ecran menu dans le ScreenManager
   

class menu(FloatLayout):
    def build(self):
        self.Img1=Image(source='index.jpeg',allow_stretch=True,keep_ratio=False)
        self.add_widget(self.Img1)
        self.spacing=20
        self.Play()
       
    def Play(self):
        Layout=GridLayout(cols=1,size_hint_y=1,padding=250)
        self.bouttonPlay=Button(text='Play',background_normal="index.jpeg")
        self.bouttonPlay.bind(on_press=self.Vers_choix_perso)
        Layout.add_widget(self.bouttonPlay)
        self.add_widget(Layout)
   
    def Vers_choix_perso(self,instance):
       
        sm.current='Choix'
       
class ChoixScreen(Screen):
    def build(self):
       
        self.Img1=Image(source='fond_ecran.jpeg',allow_stretch=True,keep_ratio=False)
        self.add_widget(self.Img1)
        #Le nom de l'ecran
        self.name='Choix'
        #On cree le contenu:
        Choix_Layout = FloatLayout()
       
        Grille=GridLayout(rows=2,padding=100,spacing=50)
        self.Bouton_Barbar=Button(text='Chevalier',background_normal="index2.jpeg")
        self.Bouton_Barbar.bind(on_press=self.Vers_Game)
        Grille.add_widget(self.Bouton_Barbar)
       
        #On cree un premier bouton:
        self.Bouton_Niveau1=Button(text='Archer',background_normal="index2.jpeg")
        self.Bouton_Niveau1.bind(on_press=self.Vers_Game)
        #On ajoute le bouton dans l'affichage:
        Grille.add_widget(self.Bouton_Niveau1)
        #On cree un deuxieme bouton:  Menu
        self.Bouton_Niveau2=Button(text='Mage',background_normal="mage.jpeg")
        self.Bouton_Niveau2.bind(on_press=self.Vers_Game)
        #On ajoute le bouton dans l'affichage:
        Grille.add_widget(self.Bouton_Niveau2)
        #on cree un troisieme bouton
        self.Bouton_Niveau3=Button(text='voleur',background_normal="assasin.jpeg")
        self.Bouton_Niveau3.bind(on_press=self.Vers_Game)
        #On ajoute le bouton dans l'affichage:
        Grille.add_widget(self.Bouton_Niveau3)
       
        Choix_Layout.add_widget(Grille)
       
        #On ajoute le Layout dans l'ecran de menu
        self.add_widget(Choix_Layout)
        #On ajoute l'ecran menu dans le ScreenManager:
        sm.add_widget(self)

   
    def Vers_Game(self,instance):
       
        if instance.text=='Chevalier':
            self.perso=perso("jackie","hache",50,75,45,25,30,'Chevalier',25)
        if instance.text=='Archer':
            self.perso=perso("legolas","arc",50,35,45,45,75,'Archer',15)
        if instance.text=='voleur':
            self.perso=perso("bilbon","dagues",75,45,45,55,35,'voleur',14)
        if instance.text=='Mage':
            self.perso=perso("gandalf","baton de sorcier",30,25,45,60,50,'Mage',20)
           
   
        Game=GameScreen()#On definit l'ecran jeu
        Game.build(self.perso)#On le construit
       
        sm.current='Game'


class CombatScreen(Screen):
    def build(self,perso):
        self.name='Combat'
        Combat_Layout=combat()#On creer le contenu
        Combat_Layout.build(perso)
        self.add_widget(Combat_Layout)#On ajoute le contenu dans l'ecran
        sm.add_widget(self)#On ajoute l'ecran menu dans le ScreenManager
       
class combat(FloatLayout):
    def build(self,perso):
        self.spacing=20
        self.creation_monstre()
        self.perso=perso
        self.r=0
        self.battle()

    def creation_monstre(self):    
           
        Monstre=random.randint(1,2)
        print(Monstre)
        if Monstre==1:
            self.monstre=monstre(100,18,'epee')
        if Monstre==2:
            self.monstre=monstre(100,20,'arc')
       
    def battle(self):
         
        Layoutp=FloatLayout(size_hint_y=0.5,padding=50,spacing=20,pos_hint={'x':.0, 'y':.30})
        toto=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
        self.texttest=Label(text=toto,font_size=30, color=[1,0,0,1],pos_hint={'x':.20, 'y':.50})
        Layoutp.add_widget(self.texttest)
       
        self.imagemonstre=Image(source="la mere a zoran.jpeg",allow_stretch=True,keep_ratio=False)
        Layoutp.add_widget(self.imagemonstre)
       
       
        LayoutC=GridLayout(cols=3,size_hint_y=0.2,padding=50,spacing=20)
        self.bouttonattaque=Button(text='attaque',size_hint_x=.20)
        self.bouttonattaque.bind(on_press=self.Attaque)
        LayoutC.add_widget(self.bouttonattaque)
       
        self.bouttonultime=Button(text='special',size_hint_x=.20)
        self.bouttonultime.bind(on_press=self.Ultime)
        LayoutC.add_widget(self.bouttonultime)
       
        self.bouttonretour=Button(text='Fuite',size_hint_x=.20)
        self.bouttonretour.bind(on_press=self.fuite)
        LayoutC.add_widget(self.bouttonretour)
       
        self.add_widget(Layoutp)
        self.add_widget(LayoutC)  
       
           
               
   
    def Vers_ecran_du_jeu(self,instance):
        sm.current='Game'
        sm.remove_widget(sm.get_screen(name='Combat'))
       
    def fuite(self,instance):
        if self.r==0:
            f=random.randint(1,3)
       
            if f==1:
                self.Vers_ecran_du_jeu("coucou")
            else:
                self.perso.vie-=5
                self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
                self.r+=1
        else:
            pass
   
    def Ultime(self,instance):
       
        if self.perso.M>20:
            self.Ultime_attak()
        else:
            pass
   
    def Ultime_attak(self):
        if self.perso.classe=='Archer':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='voleur':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='Mage':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='Chevalier':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.vie<0:
            self.perso.life-=1
            self.perso.vie=50
            self.Vers_ecran_du_jeu("coucou")
       
        if self.monstre.vie<0:
            self.Vers_ecran_du_jeu("coucou")
       
       
    def Attaque(self,instance):
        if self.perso.classe=='Archer':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.perso.classe=='voleur':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.perso.classe=='Mage':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")    
       
        if self.perso.classe=='Chevalier':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.perso.vie<0:
            self.perso.life-=1
            self.perso.vie=50
            self.Vers_ecran_du_jeu("coucou")
           
        if self.monstre.vie<0:
            self.Vers_ecran_du_jeu("coucou")
           
    def degat_monstre(self,instance):        
        self.perso.vie=self.perso.vie-(self.monstre.dgs-self.perso.armure/2.5)
        self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
       
class combat(FloatLayout):
    def build(self,perso):
        self.spacing=20
        self.creation_monstre()
        self.perso=perso
        self.battle()

    def creation_monstre(self):    
           
        Monstre=random.randint(1,2)
        print(Monstre)
        if Monstre==1:
            self.monstre=monstre(100,18,'epee')
        if Monstre==2:
            self.monstre=monstre(100,20,'arc')
       
    def battle(self):
         
        Layoutp=FloatLayout(size_hint_y=0.5,padding=50,spacing=20,pos_hint={'x':.0, 'y':.30})
        toto=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
        self.texttest=Label(text=toto,font_size=30, color=[1,0,0,1],pos_hint={'x':.20, 'y':.50})
        Layoutp.add_widget(self.texttest)
       
        self.imagemonstre=Image(source="monstre.jpg",allow_stretch=True,keep_ratio=False)
        self.add_widget(self.imagemonstre)
       
       
        LayoutC=GridLayout(cols=3,size_hint_y=0.2,padding=50,spacing=20)
        self.bouttonattaque=Button(text='attaque',size_hint_x=.20,background_normal="mur.jpeg")
        self.bouttonattaque.bind(on_press=self.Attaque)
        LayoutC.add_widget(self.bouttonattaque)
       
        self.bouttonultime=Button(text='special',size_hint_x=.20,background_normal="mur.jpeg")
        self.bouttonultime.bind(on_press=self.Ultime)
        LayoutC.add_widget(self.bouttonultime)
       
        self.bouttonretour=Button(text='Fuite',size_hint_x=.20,background_normal="mur.jpeg")
        self.bouttonretour.bind(on_press=self.fuite)
        LayoutC.add_widget(self.bouttonretour)
       
        self.add_widget(Layoutp)
        self.add_widget(LayoutC)  
       
           
               
   
    def Vers_ecran_du_jeu(self,instance):
        sm.current='Game'
        sm.remove_widget(sm.get_screen(name='Combat'))
       
    def fuite(self,instance):
        f=random.randint(1,3)
        if f==1:
            self.Vers_ecran_du_jeu("coucou")
        else:
            self.perso.vie-=5
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
   
    def Ultime(self,instance):
       
        if self.perso.M>20:
            self.Ultime_attak()
        else:
            pass
   
    def Ultime_attak(self):
        if self.perso.classe=='Archer':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='voleur':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='Mage':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.perso.classe=='Chevalier':
            self.perso.M-=20
            degatsperso=60
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
       
        if self.monstre.vie<0:
            self.Vers_ecran_du_jeu("coucou")
       
    def Attaque(self,instance):
        if self.perso.classe=='Archer':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.perso.classe=='voleur':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.perso.classe=='Mage':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")    
       
        if self.perso.classe=='Chevalier':
            degatsperso=random.randint(25,35)
            self.monstre.vie-=degatsperso
            self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))
            self.degat_monstre("coucou")
           
        if self.monstre.vie<0:
            self.Vers_ecran_du_jeu("coucou")
           
    def degat_monstre(self,instance):        
        self.perso.vie=self.perso.vie-(self.monstre.dgs-self.perso.armure/2.5)
        self.texttest.text=("vie: " + str(self.monstre.vie) + "  " + str(self.perso.vie) + " degat: " + str(self.monstre.dgs) + " arme: " + str(self.monstre.arm))

class GameScreen(Screen):#Le deuxieme ecran : Game
    def build(self,perso):
        self.name='Game'
        Game_Layout=Ecran_du_Jeu()#On creer le contenu
        Game_Layout.build(perso)
        self.add_widget(Game_Layout)#On ajoute le contenu dans l'ecran
        sm.add_widget(self)#On ajoute l'ecran menu dans le ScreenManager  
       
       
class Ecran_du_Jeu(BoxLayout):
    def build(self,perso):
        self.orientation='vertical'
        self.spacing=20
        self.perso=perso
        self.texte()
        self.image()
        self.bas()
        self.size=Window.size
       
       
   
    def texte(self):
        Layout1=GridLayout(cols=2,size_hint_y=0.1,padding=5)
        parole="coucou"
        self.parole=Label(text=parole,font_size=30, color=[1,0,0,1])
        Layout1.add_widget(self.parole)
        self.reponse=''
        self.champreponse = TextInput(text=self.reponse,font_size=30)
        Layout1.add_widget(self.champreponse)
        self.add_widget(Layout1)
       
       
    def image(self):
        self.Layout2=GridLayout(cols=1,size_hint_y=0.5,spacing=5)
        self.fond=Image(source="carrefour_alpha.jpg",allow_stretch=True,keep_ratio=False)
        self.Layout2.add_widget(self.fond)
        self.add_widget(self.Layout2)
       
    def bas(self):

        Layout3=FloatLayout(size_hint_y=0.1,spacing=5)
        stat=("vie: "+ str(self.perso.vie) + " magie: " + " arme: " + str(self.perso.arme))
        self.stat=Label(text=stat,font_size=20, color=[1,0,0,1])
        Layout3.add_widget(self.stat)
       
        self.Bouton_Nord=Button(text="N",size_hint=(.2, .3),pos_hint={'x':.70, 'y':.80})
   
        self.Bouton_Nord.bind(on_press=self.Nord)
   
        self.Bouton_Ouest=Button(text="O",size_hint=(.2, .3),pos_hint={'x':.60, 'y':.50})
   
        self.Bouton_Ouest.bind(on_press=self.Ouest)
   
        self.Bouton_Est=Button(text="E",size_hint=(.2, .3),pos_hint={'x':.80, 'y':.50})
   
        self.Bouton_Est.bind(on_press=self.Est)
   
        self.Bouton_Sud=Button(text="S",size_hint=(.2, .3),pos_hint={'x':.70, 'y':.20})
   
        self.Bouton_Sud.bind(on_press=self.Sud)
   
    #On place les boutons dans le FloatLayout avec les positions et tailles:
   
        Layout3.add_widget(self.Bouton_Nord)
        Layout3.add_widget(self.Bouton_Ouest)
        Layout3.add_widget(self.Bouton_Est)
        Layout3.add_widget(self.Bouton_Sud)
   
        #Le tableau du jeu:
        self.tab=[[0,0,0],[0,0,0],[0,0,0]]
       
        self.add_widget(Layout3)
       
    def Nord(self,instance):
       
        self.perso.pos[0]-=1
         
        if  self.perso.pos[0] < 0:
               self.perso.pos[0] = 0
        else:
            r = random.randint(1,5)#Test si combat
            if r == 1:
                self.Vers_combat()
           
        self.Changement_images()
   
    def Sud(self,instance):
       
        self.perso.pos[0]+=1
       
        if  self.perso.pos[0] > 2:
            self.perso.pos[0] = 2
        else:
            r = random.randint(1,5)#Test si combat
            if r == 1:
                self.Vers_combat()

        self.Changement_images()
       
    def Ouest(self,instance):
       
        self.perso.pos[1]-=1
       
        if  self.perso.pos[1] < 0:
            self.perso.pos[1] = 0
        else:
            r = random.randint(1,5)#Test si combat
            if r == 1:
                self.Vers_combat()
               
        self.Changement_images()
       
    def Est(self,instance):
       
        self.perso.pos[1]+=1
       
        if  self.perso.pos[1] > 2:
            self.perso.pos[1] = 2
        else:
            r = random.randint(1,5)#Test si combat
            if r == 1:
                self.Vers_combat()
 
        self.Changement_images()
       
    def Vers_combat(self):
        Combat=CombatScreen()
        Combat.build(self.perso)
        sm.current='Combat'
 
    def Changement_images(self):
        if self.perso.pos==[0,0]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="00.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)    
   
        if self.perso.pos==[0,1]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="01.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)  
             
        if self.perso.pos==[0,2]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="02.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)    
           
        if self.perso.pos==[1,0]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="10.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)  
           
        if self.perso.pos==[1,1]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="11.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)
           
           
        if self.perso.pos==[1,2]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="12.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)    
           
        if self.perso.pos==[2,0]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="20.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)    
           
        if self.perso.pos==[2,1]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="21.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)  
           
        if self.perso.pos==[2,2]:
            self.Layout2.remove_widget(self.fond)
            self.fond=Image(source="22.jpg",allow_stretch=True,keep_ratio=False)
            self.Layout2.add_widget(self.fond)
           
sm = ScreenManager()        
       
class App(App):

    def build(self):
        Menu=MenuScreen()#On definit l'ecran menu
        Menu.build()#On le construit
        Choix=ChoixScreen()#On definit l'ecran menu
        Choix.build()
        sm.current="Menu"
       
        return sm
       
if __name__ == '__main__':
    App().run()

Télécharger