Mini-game with Python 3.2 does not work - python

from random import randrange
def init_config(m, n):
print("""Crée une configuration pour la configuration initiale""")
config = [[0 for a in range(n)] for b in range(m)]
for k in range(m*n): a, b = k//n, k%n
config[a][b]=k+1
return config
def disp(config, m, n):
print("""Affiche un damier d'une configuration existante avec le format voulu""")
s=t=" +%s\n" % ("---+"*n)
for k in range(n):"%s %s" % (" "if k==0 else "",chr(65+k if k<26 else 71+k)),
for k in range(m*n): i, j=k/n, k%n
s +="%s%s|%03d%s"%(k/n+1 if k%n==0 else ""," "if k%n==0 and k/n<9 else "",config[a][b],"|\n" + t if b == n-1 else "")
return s
def set_treasure (config):
import random
a=random.randrange(0,lin)
b=random.randrange(0,col)
treasure=config[a][b]=0
def main():
print("Entrer les dimensions du damier")
lin=int(input('nombre de lignes : '))
if type (lin)!=int :
print(""" ***ERREUR !***\n le nombre de lignes doit etre un nombre entier""")
lin=int(input('number of lines : '))
elif lin>26:
print(""" ***ERREUR !***\n le nombre de lignes ne doit pas excéder 26 !""")
lin=int(input('nombre de ligne : '))
col=int(input('nombre de colonne: '))
if type (col)!=int :
print(""" ***ERREUR !***\n le nombre de colonnes doit etre un nombre entier""")
col=int(input('nombre de colonne: '))
elif col>38:
print(""" ***ERREUR !***\n le nombre de colonnes ne doit pas excéder 38 !""")
col=int(input('nombre de colonne: '))
n_treasure=int(input('Combien de trésor voulez vous mettre dans le jeux: '))
if type (n_treasure)!=int :
print(""" ***ERREUR !***\n le nombre de trésor doit etre un nombre entier""")
n_treasure=int(input('nombre de trésor que vous avez demander dans le jeux: '))
config=init_config(lin,col)
for k in range (n_treasure):
if set_treasure (config):
board=disp(config, lin, col)
print(board)
for a in range (lin):
for b in range (col):
if config[a][b]==0:
print("Il y a un trésor dans", chr(65+b),a+1)
hello all , I just finished this mini game with python 3.2 but the problem is that the program does not work I do not find the problem, i have TypeError: Win32RawInput() takes at most 2 positional arguments (4 given)

Since you haven't provided any explanation of what the program should actually do and I don't speak French, here's what I think is the problem: In the last line
input("Il y a un trésor dans", chr(65+b),a+1)
you try to display several different types as the input question. But from the context, I think what you really want to do is print these types. Do this by simply typing:
print("Il y a un trésor dans", chr(65+b),a+1)
Perhaps the same goes for fifth-to-last line. It should be
print(board)

if config[a][b]==0:
input("Il y a un trésor dans", chr(65+b),a+1)
So here you are passing four arguments to the built-in function input which takes at most one argument.
input(...)
input([prompt]) -> string
Read a string from standard input. The trailing newline is stripped.
If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.
On Unix, GNU readline is used if enabled. The prompt string, if given,
is printed without a trailing newline before reading.

Related

Find exact string in file works weird

I need to find a string in a text file (here a dictionary).
The string found in the file must be exactly the same as the one I am comparing.
Here is my code and the dictionary:
the code
#!/usr/bin/env python3
import os # pour ouvrir le dictionnaire
def check_if_exist(word,dico):
"""retourne vrai si le mot exsite dans le dictionnaire"""
for line in dico:
#line = line.rstrip('\n')
# on ne peut pas utiliser in pour la condition
# car in fait une comparaison partielle, exemple :
# "pal" in "empaler" ; return True
if word.rstrip('\n') == line.rstrip('\n'):
return True
return False
if __name__ == "__main__":
#file_path = "./dico-french.txt"
file_path = "./dico.txt"
# teste si le fichier existe
if(not os.path.isfile(file_path)):
print("le dictionnaire n'existe pas")
exit(1)
#ouvre le dictionnaire
dico = open(file_path,'r')
print("q pour quitter le jeu.")
mot = input("Premier joueur, quel est votre mot ? ")
# tant que le mot n'existe pas
while(not check_if_exist(mot,dico)):
mot = input("Un autre ? ")
# le mot existe, on passe au joueur suivant
tab = []
tab.append(mot)
mot_old = mot
while mot!='q':
print("\nles mots sont ",tab)
mot = input("Joueur suivant, quel est votre mot ? ")
while(not check_if_exist(mot,dico)):
mot = input("Un autre bis ? ")
tab.append(mot)
mot_old = mot
print("Bye.")
the dict
pal
lape
pale
palie
pallier
pallies
Let me explain you the problem with these examples :
for the fig n°1, the conditions seems to be met, all the words are in the dictionary.
fig n°1:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? pale
les mots sont ['pal', 'pale']
Joueur suivant, quel est votre mot ? palie
les mots sont ['pal', 'pale', 'palie']
Joueur suivant, quel est votre mot ? ^C
for the fig n°2, all the word are in the dictionary, but when I enter a word positioned after the one I am comparing in the dictionary, it does not find it
fig n°2:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? palie
les mots sont ['palie']
Joueur suivant, quel est votre mot ? pal
Un autre bis ? ^C
There is some kind of index that doesn't reset while I leave the function.
On the fig n°3 I try with a word not in the dictionary, this unknown word is not found, so it ask me for another word, and when I enter a known-word it doesn't work.
fig n°3:
q pour quitter le jeu.
Premier joueur, quel est votre mot ? pal
les mots sont ['pal']
Joueur suivant, quel est votre mot ? hgjfdkjhgfj
Un autre bis ? pale
Un autre bis ? ^C
Can someone explain this to me?
EDIT:
Thanks to 'Nir H.', just have to add dico.seek(0) at the beginning of my function

(Python) Caesar Cipher not running [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
I am an absolute beginner, so please forgive my stupidity when it comes to coding.
Ignore the french
min='abcdefghijklmnopqrstuvwxyz'
maj='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def CoderCesar(txt,clef):
crypt='' #string pour message crypté
txt='' #string
for c in txt: #pour chaque caractere
index=min.find(c) #regarder s'il appartient a l'alphabet en minuscule
if index==False: #si ce n'est pas le cas
index=maj.find(c) #vérifier s'il appartient alors a l'alphabet majuscule
if index==False: #si le caractere n'est pas dans l'alphabet,
crypt+=c #le laisser et l'incrémenter tel quel dans le message crypté
else: #si c'est une lettre majuscule
cryptindex=index+clef #le nouvel indice est égal a l'indice de la lettre + plus la clé
cryptindex%=len(maj) #revenir au début de la liste si l'indice dépasse la lettre 'z'
crypt+=maj[cryptindex] # ajouter le caractere au message crypté
else: #si c'est bien une lettre minuscule, faire exactement le meme proces qu'avant, en remplacant la liste majuscule par minuscule
cryptindex=index+clef
cryptindex%=len(min)
crypt+=min[cryptindex]
print("original:",txt)
print("message crypt:",crypt)
CoderCesar(txt='Super! je sais coder ce message',clef=19)
You're re-initializing txt to an empty string at the start of your function, so the string you pass in ("Super ! ...") is overwritten.
Remove the
txt = ""
line.
EDIT: Here's a simplified version of your code that does the trick.
min = "abcdefghijklmnopqrstuvwxyz"
maj = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def caesar_cipher(txt, key):
crypt = ""
for c in txt: # for each character in source...
for charlist in (min, maj): # for each character list...
index = charlist.find(c)
if index == -1:
continue # Character c not found in this list
crypt_index = (index + key) % len(charlist)
crypt += charlist[crypt_index]
break # did encrypt character, break from loop and don't run below else
else: # Did not break from the loop, not a regular character
crypt += c
return crypt
message = "Super! je sais coder ce message"
clef = 25
crypt = caesar_cipher(txt=message, key=clef)
print(message)
print(crypt)
decrypt = caesar_cipher(txt=crypt, key=-clef)
print(decrypt)

Python in Visual Studio - Math doesn't work

I have some problems with the function Math and sqrt in Visual studio, does anyone can say me what i'm doing wrong?
print("Programa de calculo de raiz cuadrada")
numero= int(input("Introduce un numero: "))
intentos=0
while numero<0:
print("no se puede calcular la raiz de un numero negativo")
if intentos==2:
print("Has consumido demasiados intentos, reinicia aplicacion")
break
numero= int(input("Introduce un numero: "))
if numero<0:
intentos=intentos+1
if intentos<3:
solución= math.sqrt(numero) # Here's the problem
print("La raíz cuadrada de" +str(numero) + "es" +str(solución))
Python #VisualStudio
You need import math to be able to use the math function.
It also has an error in the variable named solución, must be solucion.
Try this:
import math
print("Programa de calculo de raiz cuadrada")
numero= int(input("Introduce un numero: "))
intentos=0
while numero<0:
print("no se puede calcular la raiz de un numero negativo")
if intentos==2:
print("Has consumido demasiados intentos, reinicia aplicacion")
break
numero= int(input("Introduce un numero: "))
if numero<0:
intentos=intentos+1
if intentos<3:
solucion= math.sqrt(numero)
print("La raíz cuadrada de " +str(numero) + "es" +str(solucion))

Infinite Loop i don't know why ( DichotomySearch )

so i'm working on a program that search a term by dichotomy. It makes an infinite loop and i don't know why but i know where ( in the elif/else ). So here is my code :
def RechercheDichotomique(liste,x):# Algo pour recherche dichotomique
DebutListe=0
FinListe=len(liste)
while (FinListe-DebutListe)>1:# On ne cherche que si la liste a au moins un terme dedans
ElementCentral=int(len(liste[DebutListe:FinListe])/2)# On prend l'element central de la liste
liste[DebutListe:FinListe]
if liste[ElementCentral]==x:# Si l'element central est x correspondent on renvoie True
return (True)
elif liste[ElementCentral]<x:# Si l'element central est inferieur a x alors on prend la moitie superieure
DebutListe=ElementCentral
FinListe=len(liste)
else:# Sinon on prend la partie inferieure de la liste
DebutListe=0
FinListe=int((FinListe)/2)
if FinListe-DebutListe==1 and liste[ElementCentral]==x:# On verifie qu'il ne reste qu'un terme dans la liste et que le seul qui reste est bien x
return (True)
I know there is plenty ways of doing it more easily but i need to keep the List untouched.
Thanks you already guys!
You have a line in your code:
liste[DebutListe:FinListe]
that doesn't do anything, as the result is not stored. You'll need to reassign this if you want it to work:
liste = liste[DebutListe:FinListe]
Here's an implementation of binary search that more strictly adheres to Python's style guide:
def binary_search(collection, x):
while collection:
center = len(collection) / 2
if collection[center] == x:
return True
elif collection[center] < x:
collection = collection[center + 1:]
else:
collection = collection[:center]
else:
return False

How to correctly parse a tiled map in a text file?

I'm making a RPG with Python and pygame for a school project. In order to create the few maps, I have chosen the Tile Mapping techniques I have seen in some tutorials, using a *.txt file.
However, I have to cut some sprites (trees, houses, ...) into several pieces. The problem is that I'm running out of characters to represent them all!
I also remember that it's possible to take several characters as one (ex : take "100" as one an not as one "1" and two "0"s) and/or to put spaces between characters in the file (e.g. "170 0 2 5 12 48" which is read as six sprites).
But I really don't know how to adapt my program to do this way. I'm pretty sure that I need to modify the way the file is read, but how?
Here's the reading function :
class Niveau:
def __init__(self, fichier):
self.fichier = fichier
self.structure = 0
def generer(self):
"""Méthode permettant de générer le niveau en fonction du fichier.
On crée une liste générale, contenant une liste par ligne à afficher"""
#On ouvre le fichier
with open(self.fichier, "r") as fichier:
structure_niveau = []
#On parcourt les lignes du fichier
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne:
#On ignore les "\n" de fin de ligne
if sprite != '\n':
#On ajoute le sprite à la liste de la ligne
ligne_niveau.append(sprite)
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
#On sauvegarde cette structure
self.structure = structure_niveau
def afficher(self, fenetre):
"""Méthode permettant d'afficher le niveau en fonction
de la liste de structure renvoyée par generer()"""
#Chargement des images (seule celle d'arrivée contient de la transparence)
Rocher = pygame.image.load(image_Rocher).convert()
Buisson = pygame.image.load(image_Buisson).convert()
#On parcourt la liste du niveau
num_ligne = 0
for ligne in self.structure:
#On parcourt les listes de lignes
num_case = 0
for sprite in ligne:
#On calcule la position réelle en pixels
x = (num_case+0.5) * taille_sprite
y = (num_ligne+1) * taille_sprite
if sprite == 'R': #R = Rocher
fenetre.blit(Rocher, (x,y))
if sprite == 'B':
fenetre.blit(Buisson,(x,y))
num_case += 1
num_ligne += 1
I think what you want is str.split():
for ligne in fichier:
ligne_niveau = []
#On parcourt les sprites (lettres) contenus dans le fichier
for sprite in ligne.split(): # note split here
ligne_niveau.append(sprite) # no need to check for line end
#On ajoute la ligne à la liste du niveau
structure_niveau.append(ligne_niveau)
split without any arguments will join all consecutive whitespace (including tabs '\t' and newlines '\n') into a single split. For example:
"\ta 13 b \t22 6e\n".split() == ['a', '13', 'b', '22', '6e']
Note that the "sprites" don't have to be the same length, so there's no need for fill characters like extra 0s or *s. You can also simplify using a list comprehension:
def generer(self):
with open(self.fichier) as fichier:
self.structure = [ligne.split() for ligne in fichier]
Alternatively, consider using a comma-separated value format - Python has a whole module (csv) for that:
a,13,b,22,6e

Categories

Resources