• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

BlodyGrl

Mastermind

6 mensagens neste tópico

Pois bem após tentado fazer o Tic-Tac-Toe sem sucesso. :vergonha: Tentei descobrir algo mais simples e após várias procuras finalmente encontrei o Mastermind (para quem não sabe o que é...http://en.wikipedia.org/wiki/Mastermind_(board_game)  ) só que em vez de ser com cores seria com números.

Só que tenho pequenos problemas. É que dependendo do input que lhe dou o programa funciona ou não mas por mais que tente não consigo descobrir o erro. -_-' Será que alguém me pode ajudar a identificá-lo,pf?

Agradecida. :)

def acertou(s,t):
    sitio=0
    fora=0
    aux=0
    aux2=0
    lista=[]
    lista2=[]
    for i in range(len(s)):
            if s[i]==t[i]:
                sitio+=1
            else:
                aux=ocorrencias_2(s,s[i])
                if [s[i],aux] not in lista:
                    lista+=[[s[i],aux]]
                aux2=ocorrencias_2(t,t[i])
                if [t[i],aux2] not in lista2:
                    lista2+=[[t[i],aux2]]
    for i in range(len(lista2)):
        for j in range(len(lista)):
            if lista2[i][0]==lista[j][0]:
                lista[j][1]=lista2[i][1]
#    print str(lista)+"       "+str(lista2)
    for i in range(len(lista)):
#        print lista[i],lista2
        if lista[i] not in lista2:
            lista.pop(i)
    for i in range(len(lista)):
        fora+=lista[i][1]
    return sitio,fora
            

def ocorrencias_2(txt,c):
    aux=0
    for i in range(len(txt)):
        if txt[i]==c:
            aux+=1
    return aux


def joga(pinos,cores):
    s=""
    while len(s)!=pinos:
        a=int(random.random()*cores)
        if a!=0:
            s+=str(a)
#    print s
    t=raw_input()
    acertou(s,t)
    while acertou(s,t)!=(pinos,0):
        print acertou(s,t)
        t=raw_input()
    print pinos,0

Os comentários foram os meus testes para perceber o erro (mas sem sucesso.  :)).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto, aquele problema (estúpido) -_-' ficou resolvido.

Mas agora tenho outro. Que é quando os números repetidos já estão na posição correcta porque os vais contar como se não estivessem.

Exemplo:

Tenho que acertar em "2121" e dei-lhe a sequência "2211".

A resposta dele é (2,4) visto que 2 algarismos já estão no lugar e 4 deles fora do lugar (porque ele não está a subtrair os inseridos no local correcto aos fora).

Jé tentei fazer pop (mas depois vai-me dar o erro que me estava a dar interiormente.

Já tentei fazer mudança do nº já colocado no local correcto para 0 (visto que nunca vou usar este nº no jogo).

Já tentei fazer por splits mas dá-me o mesmo erro que no pop.

Enfim... Sem mais ideias para resolver o meu problema por isso deixo aqui o programa com esperança que vocês me ajudem. (Pelo menos digam que não percebem ou que não querem por ser simples demais ou algo do género mas respondam-me por favor! :'(

def acertou(s,t):
    sitio=0
    fora=0
    aux=0
    aux2=0
    lista=[]
    lista2=[]
    for i in range(len(s)):
            if s[i]==t[i]:
                sitio+=1
            else:
                aux=ocorrencias_2(s,s[i])
                if [s[i],aux] not in lista:
                    lista+=[[s[i],aux]]
                aux2=ocorrencias_2(t,t[i])
                if [t[i],aux2] not in lista2:
                    lista2+=[[t[i],aux2]]
    for i in range(len(lista2)):
        for j in range(len(lista)):
            if lista2[i][0]==lista[j][0]:
                lista[j][1]=lista2[i][1]
    lista_aux=[]
    for i in range(len(lista)):
        if lista[i] in lista2:
            lista_aux+=[lista[i]]
    lista=lista_aux
    for i in range(len(lista)):
        fora+=lista[i][1]
    return sitio,fora

#Fazer uma modificaçao no acertou...
#Subtrair os já certos aos que estão de fora para não acontecer o caso do (2,4).

def ocorrencias_2(txt,c):
    aux=0
    for i in range(len(txt)):
        if txt[i]==c:
            aux+=1
    return aux

import random

def joga(pinos,cores):
    s=""
    while len(s)!=pinos:
        a=int(random.random()*(cores))
        if a!=0:
            s+=str(a)
    t=raw_input()
    acertou(s,t)
    while acertou(s,t)!=(pinos,0):
        print acertou(s,t)
        t=raw_input()
    print (pinos,0)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o input que dás ao programa? Os argumentos s, t que estão na função são o quê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O input que dou foi o exemplo que dei do "2211" e "2121".

O s é o segredo, e o t é a tentiva feita...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Blodygirl....Sinceramente perdi-me no teu codigo...talvez por causa do sono....

Há mt tempo que não jogava mastermind....ja nem me lembrava das regras...:S

Fiz aqui um mastermind, não tá muito elaborado...mas tentei fazer de uma maneira que compreendesses +/- o codigo....

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random

#Constrói uma sequencia secreta aleatoria
def gera_seq():
cpu_seq=[]

for i in range(0,4):
	cpu_seq.append(random.randint(1,6))

return cpu_seq

def mastermind():
jogadas = 1
cpu_seq = gera_seq() #Vamos pedir uma sequencia secreta

while jogadas != 21: #Acho que o maximo sao 20 jogadas!?
	certo_local = 0 #Certo Local é um acerto na cor e no local correcto
	certo_cor = 0 #Certo na Cor mas nao no local

	print "\nJogada nº " , jogadas #Numero de Jogadas
	seq = raw_input("Sequencia com numeros de 1 a 6 (ex. 1,6,3,4): ") #Vamos introduzir a nossa tentativa
	seq  = seq.split(',') #Vamos Construir uma lista com a sequencia

	for i in range(0,4): #Percorremos os 4 numeros de Sequencia
		if int(seq[i]) in cpu_seq: #Está na Sequencia do Secreta?
			if int(seq[i]) == cpu_seq[i]: #Está na posição Correcta?
				certo_local = certo_local + 1 
			else: #Então apenas está na sequencia
				certo_cor = certo_cor + 1 

	if certo_local == 4: # Certo Local é um acerto na cor e no local correcto....4? Entao descobrimos a sequencia secreta 
		print "Parabens! Adivinhou a sequencia!  "
		break

	print "No local correcto:", certo_local , "|","Na sequencia:" ,certo_cor

	jogadas = jogadas +1 

if jogadas > 20: #Oh! Ultrapassamos o numero de jogadas permitidas 
	print "Perdeu! A sequencia correcta era" , cpu_seq[0] , cpu_seq[1] , cpu_seq[2] , cpu_seq[3] , "!"

mastermind()

Acho que é assim que se joga!? Se não for...acaba tu... :P

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agradeço-te muito mas eu gostaria mesmo era de emendar o meu... Se calhar o que também te confundiu foram os nomes das variáveis. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora