Snake en Python

Fermé
Synerz Messages postés 1233 Date d'inscription mercredi 5 juin 2013 Statut Membre Dernière intervention 27 décembre 2017 - Modifié par Synerz le 17/11/2016 à 19:23
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 - 6 mai 2017 à 18:13
Bonjour,

Je dois effectuer un jeu snake pour les cours et j'aimerai un peu t'aide sans me donner les réponses clairement sinon cela n'a pas d’intérêt.

Voici mon code :

#! /usr/bin/env python3
# -*- coding: utf8 -*-

# imports ####################################################################

import sys
import curses
import random


# screen handling ############################################################

def init_screen():
    screen = curses.initscr()
    screen.keypad(1)
    
    def excepthook(*args):
        cleanup(screen)
        return sys.__excepthook__(*args)
    sys.excepthook = excepthook
    
    curses.noecho()
    curses.halfdelay(2)
    curses.curs_set(0)
    
    return screen


def display(screen, snake, food):

    screen.clear()
    screen.border()
    for l, c in snake:
        screen.addstr(l, c, "O")
    for food_l, food_c in food:
 screen.addstr(food_l,food_c, "X")
    screen.refresh()


def cleanup(screen):
    screen.keypad(0)
    curses.nocbreak()
    curses.echo()
    curses.endwin()

def inside(screen, snake) :
    lmax, cmax = screen.getmaxyx()
# Position de la tête
    l, c = snake[-1]
    snakes = snake
    del snakes[-1]
    if 0 < l < lmax-1 and 0 < c < cmax-1 :
        return False
     if l,c in snake:
  return True
 else:
  return False  
    else:
        return True
 
def create_food (food, snake, screen):
 
 if food == snake[-1]:
  food_lmax, food_cmax = screen.getmaxyx()
  food_c = random.randint(1,food_cmax-1)
  food_l = random.randint(1,food_lmax-1)
  del food
  food += [(food_l,food_c)]
 return food 

# main program ###############################################################

def main():
    screen = init_screen()

    food_l = 20
    food_c = 100 
    food = []
    food += [(food_l,food_c)]

    l = 50
    c = 8
    direc = "right"

    snake = [(50,2),(50,3),(50,4),(50,5),(50,6),(50,7),(50,8)]
        

    while True:
        k = screen.getch()
        if k == ord('q'):
            break
        elif k == curses.KEY_LEFT:
            if direc == "right":
                direc = "up"
            elif direc == "up":
                direc = "left"
            elif direc == "left":
                direc = "down"
            elif direc == "down":
                direc = "right"
        elif k == curses.KEY_RIGHT:
            if direc == "right":
                direc = "down"
            elif direc == "down":
                direc = "left"
            elif direc == "left":
                direc = "up"
            elif direc == "up":
                direc = "right"

        if direc == "right" :
            c = c+1
        elif direc == "left" :
            c = c-1
        elif direc == "up" :
            l = l-1
        elif direc == "down" :
            l = l+1
#Supprime le bout de la gueue pour le deplacmeent 
        del snake[0]
        snake += [(l,c)]
 
 create_food (food, snake, screen)

        if inside(screen, snake):
            print "Game Over"
     break 
     
        else:
            display(screen, snake, food)
     snake += [(l,c)]
        
    cleanup(screen)



if __name__ == "__main__":
    sys.exit(main())


Question 1 : J'ai une erreur à la ligne 54 qui est
if l,c in snake:
je ne vois pas ou il y a une erreur à ce niveau la

Question 2 : Ma fonction create_food -> But voulu quand l'emplacement de la food est égal à la tête du serpent je veux supprimer la valeur dans food et lui en donner une nouvelle aléatoirement.

Question 3 : A la fin je fais un
   if inside(screen, snake):
            print "Game Over"
     break 
en gros la fonction inside fait que si le serpent touche un mur ou lui même ça écrit Game Over mais sans le break plein de Game Over sont écriés à l'écran ( normal vu que j'appelle la fonction dans un while) et si je break comme la je ne vois pas le texte. En gros J'aimerait qu'il affiche game over au milieu de l'écran et que le jeu ce qui quand j'appuie sur n'importe quelle touche.

Voilà merci d'avance et j'insiste je veux juste des éclaircissements par les réponses
Un peu d'aide contre un topic résolu !

1 réponse

Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
6 mai 2017 à 18:13
Bonjour,

Alors désolé je n'ai pas d'ordi pour tester là desuite.

Pour ta question 1 : essaye peut-être
if (l,c) in snake
car ce que tu veux c'est voir si le couple est dans ton tableau.

Pour la question 3 : dans le if tu peux juste faire un break pour sortir de la boucle et après ta boucle while tu fais ton
print "Game Over"
comme ça ton programme break, sort de la boucle et exécute la ligne suivante qui sera le print. (mais lis la suite de mon message avant de faire des modifs, le fait qu'il ne t'affiche pas Game Over vient d'ailleurs)

A la ligne 123 c'est normal qu'il n'y ait pas d'indentation (ou c'est juste un problème de copié collé) ?

Ensuite ton programme n'ira jamais dans le
else
de la ligne 129 car il tombera systématiquement sur ton
break
(c'est d'ailleurs pour ça qu'il ne doit pas t'afficher le Game Over, il break même sans passer dans le if, problème d'indentation, le break doit être au même niveau que le print).


Voilà un premier jet de réflexion n'hésite pas si tu comprends pas un trucs ou si tu as d'autres questions ou besoin d'éclaircissement sur ce que je t'ai dit
0