Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur dans mon programme

TypeError: __init__() missing 1 required positional argument: 'game'

Sujet résolu
11 avril 2020 à 13:56:14

Bonjour,

Je suis le youtubeur Graven - Développement sur YouTube notamment sa série CRÉER UN JEU PYGAME - PYTHON.

Je suis arrivé à l'épisode Créer un jeu en python (4/10) - Ajout du monstre et gestion des collisions.

Donc voilà mon code :

import pygame
from game import Game
from player import Player
from monster import Monster

pygame.init()

# Générer la fenêtre
pygame.display.set_caption("Shooter")
screen = pygame.display.set_mode((1080, 720))

# Importer et charger l'arrière plan du jeu
background = pygame.image.load("assets/bg.jpg")

# Charger notre jeu
game = Game()

# Charger notre joueur
player = Player() # <--- L'erreur est ICI

running = True

# Boucle tant que running est sur Vrai
while running:

    # Appliquer la fenêtre du jeu
    screen.blit(background, (0, -200))

    # Appliquer l'image de mon joueur
    screen.blit(game.player.image, game.player.rect)

    # Récupérer les projectiles du joueur
    for projectile in game.player.all_projectiles:
        projectile.move()

    # Récupérer les monstres de notre jeu
    for monster in game.all_monsters:
        monster.forward()

    # Appliquer l'ensemble des images de mon groupe projectiles
    game.player.all_projectiles.draw(screen)

    # Appliquer l'ensemble des images de mon groupe de monstres
    game.all_monsters.draw(screen)

    # Vérifier si le joueur souhaite aller à gauche ou à droite
    if game.pressed.get(pygame.K_RIGHT) and game.player.rect.x + game.player.rect.width < screen.get_width():
        game.player.move_right()
    elif game.pressed.get(pygame.K_LEFT) and game.player.rect.x > 0:
        game.player.move_left()

    # Mettre à jour l'écran
    pygame.display.flip()
    # Si le joueur ferme la fenêtre

    for event in pygame.event.get():

        # Vérification que l'event est la fermeture de la fenêtre
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()
            print("Fermeture du jeu !")

        # Détecter Si un joueur lache une touche du clavier
        elif event.type == pygame.KEYDOWN:
            game.pressed[event.key] = True

            # Détecter si la touche espace est enclenchée pour lancer notre projectile
            if event.key == pygame.K_SPACE:
                game.player.launch_projectile()

        elif event.type == pygame.KEYUP:
            game.pressed[event.key] = False


Quand j'execute les autres programmes de mon projet un par un, il n'y a pas d'erreur, mais celui-là, il possède une erreur. (ligne 19)

La voici :

Traceback (most recent call last):
  File "H:/Python/[FR] [YT] Graven - Développement/Shooter/main.py", line 19, in <module>
    player = Player()
TypeError: __init__() missing 1 required positional argument: 'game'

Je ne vois pas où il manque l'argument...

Pouvez-vous m'aider ?

Merci d'avance.

  • Partager sur Facebook
  • Partager sur Twitter

Cordialement, Le fan de programmation, Ugo_75_b

11 avril 2020 à 14:52:26

Sans le code de la classe Player, ça va être difficile de te répondre.
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2020 à 21:43:51

PascalOrtiz a écrit:

Sans le code de la classe Player, ça va être difficile de te répondre.

Oui, c'est vrai.

Voici le code de la classe Player :

import pygame
from projectile import Projectile

# Créer une première classe qui va représenter notre joueur
class Player(pygame.sprite.Sprite):

    def __init__(self, game):
        """

        :rtype: object
        """
        super().__init__()
        self.game = game
        self.health = 100
        self.max_health = 100
        self.attack = 10
        self.velocity = 5
        self.all_projectiles = pygame.sprite.Group()
        self.image = pygame.image.load("assets/player.png")
        self.rect =  self.image.get_rect()
        self.rect.x = 400
        self.rect.y = 500

    def launch_projectile(self):
        # Créer une nouvelle instance de la classe Projectile
        if not self.game.check_collision(self, self.game.all_monsters):
            self.all_projectiles.add(Projectile(self))

    def move_right(self):
        # Si le joueur n'est pas en collision avec un monstre
        self.rect.x += self.velocity

    def move_left(self):
        self.rect.x -= self.velocity

-
Edité par Ugo_75_b 11 avril 2020 à 21:44:29

  • Partager sur Facebook
  • Partager sur Twitter

Cordialement, Le fan de programmation, Ugo_75_b

11 avril 2020 à 23:14:20

Tu vois (ligne 7) que la création d'une instance de la classe Player attend exactement un argument game, donc si tu écris un appel Player() sans argument, tu auras une erreur comme c'est le cas dans la ligne 19 de ton premier code.
  • Partager sur Facebook
  • Partager sur Twitter
12 avril 2020 à 10:08:39

D'accord, merci beaucoup. Je vais essayer tout à l'heure.
  • Partager sur Facebook
  • Partager sur Twitter

Cordialement, Le fan de programmation, Ugo_75_b

Anonyme
24 avril 2020 à 14:12:21

Bonjour.

Je suis le même cours que PascalOrtiz, j'ai donc pratiquement le même code, et donc le même problème.


Si j'ai bien compris, vous nous recommandez d'écrire

player = Player(game)

au lieu de

player = Player()

C'est ce que j'ai fait, et pour moi ça ne marche pas. Si vous avez une autre solution, je suis preneur.


  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2020 à 14:15:11

Message d'erreur ? Code ?

On est pas devin.

  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Anonyme
24 avril 2020 à 14:40:54

Message d'erreur  

Traceback (most recent call last):

  File "main.py", line 14, in <module>

    game = Game()

  File "/Users/simonferre/Desktop/Python/Mon premier jeu Python/game.py", line 11, in __init__

    self.player = Player()

TypeError: __init__() missing 1 required positional argument: 'game'


Code


    Main.py


import pygame
from game import Game
from player import Player
pygame.init()

		
# Je génère la fenêtre du jeu
pygame.display.set_caption("Petit arbre le jeu")
screen = pygame.display.set_mode((1080, 720))

background = pygame.image.load('assets/bg.jpg').convert()

# Charger le jeu
game = Game()
player = Player()

running=True

while running:
	
	# Mettre l'arrière plan. background est l'arrière plan et screen la surface.
	screen.blit(background, (0, -180))
	
	
	# Le joueur
	screen.blit(game.player.image, game.player.rect)
	
	# Récupérer les projectils
	for projectile in game.player.all_projectiles:
		projectile.move()
		
	# Les monstres
	for monster in game.all_monster:
		monster.forward()
	
	# Les projectiles
	game.player.all_projectiles.draw(screen)
	
	# Les monstres
	game.all_monster.draw(screen)
	pygame.display.flip()
	
	# Si il veut aller a droit, a gauche, en bas ou en haut
	if game.pressed.get(pygame.K_d) and game.player.rect.x + game.player.rect.width -40 < screen.get_width():
		game.player.move_right()
	elif game.pressed.get(pygame.K_q) and game.player.rect.x > -40:
		game.player.move_left()
	elif game.pressed.get(pygame.K_s) and game.player.rect.y < 560:
		game.player.move_bas()
	elif game.pressed.get(pygame.K_z) and game.player.rect.y > -40:
		game.player.move_haut()
		

	for event in pygame.event.get():
		# Si fenêtre == fermé
		if event.type == pygame.QUIT:
			running = False
			pygame.quit()
			print("The end")
		# Si on appui sur le clavier
		elif event.type == pygame.KEYDOWN:
			game.pressed[event.key] = True
			
			# Pour tirer
			if event.key == pygame.K_c:
		  		game.player.launch_projectile_right()
		  	
			if event.key == pygame.K_x:
		  		game.player.launch_projectile_left()
		    	
		elif  event.type == pygame.KEYUP:
			game.pressed[event.key] = False
			 
	
	


    player.py

import pygame
from Projectile import Projectile_right
from Projectile import Projectile_left
pygame.init()

# Classe joueur
class Player(pygame.sprite.Sprite):
	
	def __init__(self, game):
		super().__init__()
		self.game = game
		self.health = 100
		self.max_health = 100
		self.attack = 10
		self.velocity = 5
		self.all_projectiles = pygame.sprite.Group()
		self.image = pygame.image.load('assets/player.png')
		self.rect = self.image.get_rect()
		self.rect.x = 300
		self.rect.y = 520
		
	def move_right(self):
		# if collision = False
		if not sel.game.check_collision(self, self.game.all_monsters):
			self.rect.x += self.velocity
		
	def move_left(self):
		self.rect.x -= self.velocity
		
	def move_haut(self):
		self.rect.y -= self.velocity
		
	def move_bas(self):
		self.rect.y += self.velocity
		
	def launch_projectile_right(self):
		self.all_projectiles.add(Projectile_right(self))
		
	def launch_projectile_left(self):
		self.all_projectiles.add(Projectile_left(self))
		


Si tu veut d'autre code, demande moi.


  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2020 à 14:44:51

Donc même problème, mettre l'argument game dans l'instanciation de Player.
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Anonyme
24 avril 2020 à 14:54:26

Ok en fait tu a bien corriger une erreur (merci beaucoup) mais il y avait le même type d'erreur dans game.py

import pygame
pygame.init()
from player import Player
from monster import Monster

# Classe jeu
class Game():
	
	def __init__(self):
		# Générer le joueur
		self.player = Player(game) #ICI (Je l'ai déjà corriger)
		# Groupe de monstres
		self.all_monster = pygame.sprite.Group()
		self.pressed = {}
		self.spawn_monster()
		
	def spawn_monster(self):
		monster = Monster()
		self.all_monster.add(monster)
		
	def check_collision(self, sprit, group):
		return pygame.sprite.spritcollide(sprite, group, False, pygame.sprite.collide_mask)
		
		
	
		

		

Mais maintenant l'erreur est 

Traceback (most recent call last):

  File "main.py", line 14, in <module>

    game = Game()

  File "/Users/simonferre/Desktop/Python/Mon premier jeu Python/game.py", line 11, in __init__

    self.player = Player(game)

NameError: name 'game' is not defined

-
Edité par Anonyme 24 avril 2020 à 14:59:49

  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2020 à 15:04:19

Bah tu vois bien que game n'est pas définie, il faut y placer une instance de game, et dans la classe Game ça se nomme self.
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Anonyme
24 avril 2020 à 15:07:55

C'est à dire ?


Ps: débutant


Avec

class Game(self):

NameError: name 'self' is not defined

-
Edité par Anonyme 24 avril 2020 à 15:10:23

  • Partager sur Facebook
  • Partager sur Twitter
24 avril 2020 à 15:10:34

self.player = Player(self)
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Anonyme
24 avril 2020 à 18:47:42

CestcoolCestcool, content de ne pas être le seul à avoir eu de soucis avec la vidéo :)

-
Edité par Ugo_75_b 24 avril 2020 à 18:47:52

  • Partager sur Facebook
  • Partager sur Twitter

Cordialement, Le fan de programmation, Ugo_75_b

28 mai 2020 à 22:21:05 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


28 mai 2020 à 22:31:42

Ouvre un nouveau sujet, présente ton code dans les balises adaptées et surtout met l'erreur que t'indique l'interpréteur.
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

28 mai 2020 à 22:48:33

C'est bon j'ai créer un nouveau sujet, je l'ai nommé "Erreur python arguments manquants position joueur". J'ai mieux expliquer mon problème la-bas, merci à ceux qui iront voir.

-
Edité par EliotBodart 29 mai 2020 à 0:37:28

  • Partager sur Facebook
  • Partager sur Twitter
10 avril 2021 à 14:25:20

bonjour j'ai un probléme

pouvez vous m'aider

c sur graven la série jeu avec pygame

  • Partager sur Facebook
  • Partager sur Twitter
10 avril 2021 à 14:31:43

@HabibNasser Bonjour, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter