Desarrolando un tres en raya

Encuentra personas para llevar adelante tu proyecto, muestra el progreso de esos proyectos y participa en competencias grupales.

Moderador: Dokan

Desarrolando un tres en raya

Notapor algarafa » Sab Ene 24, 2009 11:00 am

Bueno, me gustaría acabar un proyecto, por lo que he decidido hacer un tres en raya para dos juegadores, porque aunque sea un juego sencillo, tiene bastante complicación para mi nivel. Ha continuación hago una lista de lo que creo que necesitaré.
    :arrow: Una matriz que en un principio este llena de el valor None, pero que si el juegador uno en su turno clica en una zona determinada de la pantalla, la casilla correspondiente de la matriz valga 1, y que valga 2 si esto lo hace el jugador 2.
    :arrow: Una función que compruebe en todo momento si alguien ha ganado.
    :arrow: Otra función que dependiendo de los valores de la matriz, ponga una imagen u otra en cada casilla del tablero.
    :arrow: Una función que compruebe donde está el ratón y si alguien ha hecho clic con el botón derecho, y que dependiendo de donde este, le de a la casilla correspondiente valor 1 o 2.
    :arrow: Un menú.

Creo que esto es todo lo que necesito, habrá dos archivos de código fuente, uno con las funciones y otro con el programa principal.
Bueno, mi principal duda es la de gestionar el ratón, si alguien pudiera orientarme un poco... he mirado la web de pygame, pero es que esta en inglés (algún día, los hispanohablantes conquistaremos el mundo jajajaja (risa malvada)).
Muchas gracias y saludos a todos, si me falta algo en la planificación, avisenme. :D
P.D.: Por cierto, había decidido para la ventana un tamaño de 600 x 600.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor lacabra25 » Sab Ene 24, 2009 11:25 am

Por lo que mencionas de Pygame supongo que lo piensas hacer en python, pugame no se si tendra funciones para manejar eventos del raton, pero SDL si que los tiene, por lo que podrias usarla.

Al juego podrias ademas añadirle dos variables que hagan de contador para llevar el recuento de cuantas partidas lleva ganadas el jugador uno y cuantas el jugador dos, y que el que menos partidas lleve ganadas sea el que empieze. En caso de empate que empieze uno aleatoriamente.

Yo hace tiempo hice tambien un tres en raya pero en C con SDL, lo hice para dos jugadores o para un jugador contra una pequeña inteligencia artificial.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Re: Desarrolando un tres en raya

Notapor endaramiz » Sab Ene 24, 2009 5:08 pm

RAGPacho escribió: :arrow: Una función que compruebe donde está el ratón y si alguien ha hecho clic con el botón derecho, y que dependiendo de donde este, le de a la casilla correspondiente valor 1 o 2.

Bueno, mi principal duda es la de gestionar el ratón, si alguien pudiera orientarme un poco...

Yo lo que haría es comprobar los eventos en el main y si se pulsa un botón, pasarle las coordenadas a una función que se encargue de cambiar la matriz (si es necesario). A parte, si es la función la que controla el ratón, se complica un poco lo de los eventos (lo digo por experiencia, aunque también es cierto de que aprendí cosas interesante por ello).
Para obtener las coordenadas, creo que te será útil este ejemplo:
Código: Seleccionar todo
import pygame
from pygame import *


def main():
    screen = pygame.display.set_mode((300,300))

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                # Finaliza el programa si hay un evento de cerrar
                return
            if event.type == MOUSEBUTTONDOWN:
                print event.pos, event.button


if __name__ == '__main__':
    main()

Si tienes alguna duda, avisa. Intenta mirar un poco la documentación, aunque sea por encima o a base de traductor. Porque, por ejemplo, sale una lista de los eventos y la información que dan (MOUSEBUTTONUP pos, button).

Saludos.

PD: lo otro pinta bien, pero ya publicarás tus progreso a ver si encuentro algo para mejorar.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Gracias

Notapor algarafa » Dom Ene 25, 2009 10:20 am

Vale, creo que con este ejemplo ya lo entiendo, lo que podría hacer sería almacenar el valor del botón pulsado y las coordenadas en una variable global, y luego desde una función, consultar la variable global, y dependiendo de eso, hacer uno u otro.
Gracias dvd, te incluiré en los agradecimientos. :D
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor lacabra25 » Dom Ene 25, 2009 1:46 pm

No te recomendaria el usar una variable global a no ser que no te quede otro remedio que usar la variable global, y menos una variable global a la que se accedera por medio de una funcion.
En python la verdad es que no se como seran vistas las variables globales, pero en C es algo que se intenta evitar pues puede dar problemas a la larga al modificar el programa y depurarlo; si puedes, evita las variables globales.
En python no se si se podran definir las variables como static, o de alguna forma analoga, la cuestion seria una variable que conserve su valor en cada llamada a la funcion en la que esta, por ejemplo, llamas por primera vez a la funcion y la variable la defines como 0, le das el valor de ella misma mas uno, la llamas la segunda vez y vale 1....
De ese modo puedes hacer una funcion cuyo unico cometido sea guardar un valor entero y dependiendo de el valor que se le pase como argumento mostrar el valor de la variable retornandolo, o cambiar el valor de la variable.
Por ejemplo, puedes hacer que si le pasas 0 devuelva el valor la funcion, si le pasas 1 ponga la variable a 1 y si le pasas 2 ponga la variable a 2, y asi consecutivamente con los demas numeros, teniendo la funcion para acceder a la variable asi no necesitas que la variable sea global y cuando modifiques el programa todo lo que tenga que ver con esta variable usara esta funcion y solo tendras que modificar esta funcion.

Aviso que no se si python tendra la capacidad de definir variables como stactic, pero si alguien sabe algo de esto que me corija pues no se de python demasiado.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor endaramiz » Dom Ene 25, 2009 2:32 pm

lacabra25 escribió:No te recomendaria el usar una variable global a no ser que no te quede otro remedio que usar la variable global, y menos una variable global a la que se accedera por medio de una funcion.
[...]
Aviso que no se si python tendra la capacidad de definir variables como stactic, pero si alguien sabe algo de esto que me corija pues no se de python demasiado.

Es cierto, en Python también es mejor que no abuses de las variables globales. No se si existe eso de variables static, pero lo que más sencillo me parece es ponerlas como parámetro en la función.
Código: Seleccionar todo
import pygame
from pygame import *

def imprimir(xy, b):
    print 'x: ', xy[0], ' y: ', xy[1], ' but:', b

def main():
    screen = pygame.display.set_mode((300,300))

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                # Finaliza el programa si hay un evento de cerrar
                return
            if event.type == MOUSEBUTTONDOWN:
                imprimir(event.pos, event.button)

if __name__ == '__main__':
    main()


Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Duda sobre el ratón

Notapor algarafa » Mar Ene 27, 2009 6:52 pm

Bueno, ya tengo el escenario el tablero listo, pero tengo un problema con el ratón, he definido las siguientes funciones:
Código: Seleccionar todo
import pygame

# La primera función que definiremos, creara una matriz nula, con
# el número de filas y columnas que le pasemos como argumento.
def crea_matriz_nula(filas, columnas):
   matriz = []
   for i in range(filas):
      matriz.append([None] * columnas)
   return matriz

# La siguiente función, comprueba donde está el ratón y si hay algún
# botón del mismo pulsado.
def comprueba_raton():
   for evento in pygame.event.get():
      if evento.type == MOUSEBUTTONDOWN:
         return valor_raton(evento.pos, evento.button)
      
# Como veis, en la función anterior, se hace una llamada a la función
# valor_raton, definamosla.
def valor_raton(posicion_raton, boton_pulsado):
   return [posicion_raton[0], posicion_raton[1], boton_pulsado]

En teoría si hago variable = comprueba_raton() variable debería valer una lista que fuera: [posicion x, posicion y, boton pulsado], pero cuando imprimo la variable, aparece None. ¿Por qué pasa esto? En teoría, deberia darme la lista :cry:
En fin, gracias a lacabra25 y a dvd, intentaré evitar las variables globales.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Re: Duda sobre el ratón

Notapor hugoruscitti » Mar Ene 27, 2009 8:24 pm

RAGPacho escribió:En teoría si hago variable = comprueba_raton() variable debería valer una lista que fuera: [posicion x, posicion y, boton pulsado], pero cuando imprimo la variable, aparece None. ¿Por qué pasa esto? En teoría, deberia darme la lista :cry:


En realidad no siempre, resulta que la función "comprueba_raton"
puede devolver dos cosas, una lista con los atributos del mouse
o none, si no se presenta ningún evento del mouse.

Cuando termina el ciclo "for" la función tiene que seguir para
ejecutar la sentencia que marqué con asteriscos mas
abajo:

Código: Seleccionar todo
def comprueba_raton():
   for evento in pygame.event.get():
      if evento.type == MOUSEBUTTONDOWN:
         return valor_raton(evento.pos, evento.button)

   # *** siguiente sentencia luego del ciclo.


Cuando python se encuentra terminando una función, y no
hay sentencia return, simplemente retornará None.

Tal vez la forma mas sencilla de lograr lo mismo sea usar
el modulo de pygame "mouse", hay dos funciones que te
pueden servir:

Código: Seleccionar todo
pygame.mouse.get_pressed()
   retorna (button1, button2, button3)

pygame.mouse.get_pos()
   retorna (x, y)


saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Ok!!!

Notapor algarafa » Vie Ene 30, 2009 7:47 pm

Vale gracias, bueno, ahora voy a hacer una función que modifique la matriz dependiendo de donde pulses.
¡Gracias de nuevo a todos!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

¿?

Notapor algarafa » Dom Feb 01, 2009 11:23 am

Bueno, hasta ahora tengo el siguiente código. En teoría, al poner el raton sobre la casilla superior izquierda, se debería cambiar un valor de la matriz, les paso el código, para ver si averiguan porque no funciona, gracias de antemano:
Código: Seleccionar todo
import pygame
from pygame.locals import *

# Vamos a definir las funciones del programa.
# La primera función que definiremos, creara una matriz nula, con
# el número de filas y columnas que le pasemos como parámetro.
def crea_matriz_nula(filas, columnas):
   matriz = []
   for i in range(filas):
      matriz.append([None] * columnas)
   return matriz

# Necesitamos una función que compruebe donde esta el ratón en pantalla
# y que dependiendo de donde este y del boton pulsado modifique la
# matriz.
def modifica_matriz(le_toca_a_jugador1, le_toca_a_jugador2):
   global casillas, matriz
   posicion_raton = pygame.mouse.get_pos()
   boton_pulsado = pygame.mouse.get_pressed()
   raton = [posicion_raton[0], posicion_raton[1], boton_pulsado[0]]
   if raton[0] >= casillas[0].left and raton[0] <= casillas[0].right \
   and raton[1] >= casillas[0].top and raton[1] <= casillas[0].bottom:
      if le_toca_a_jugador1:
         matriz[0][1] = 1

# Vamos a definir algunos aspectos de la pantalla y las matrices que
# que usaremos en el juego.
ancho_pantalla = 600
alto_pantalla = 600
screen = pygame.display.set_mode((ancho_pantalla, alto_pantalla))
pygame.display.set_caption('Tres en raya')
matriz = crea_matriz_nula(3, 3)

# Ahora creemos el escenario, con sus casillas, etc. Para las lineas
# que dividen las distintas casillas, vamos a dejar un espacio sin nada
# colocado en el, porque como el fondo de la pantalla es negro,
# parecerá que hemos dibujado lineas. Cuando veais el resultado,
# entendereis mejor a que me refiero.
tamanyo_casillas = 199
# Ahora, vamos a dar valor a otra variable, para que el escenario quede
# perfecto, probad a darle valor 199 en vez de 200 y vereis a que me
# refiero.
tamanyo_casillas_especial = 200
casillas_color = (255, 255, 255)
casilla1 = pygame.Rect(0, 0, tamanyo_casillas, tamanyo_casillas)
casilla2 = pygame.Rect(200, 0, tamanyo_casillas, tamanyo_casillas)
casilla3 = pygame.Rect(400, 0, tamanyo_casillas_especial, tamanyo_casillas)
casilla4 = pygame.Rect(0, 200, tamanyo_casillas, tamanyo_casillas)
casilla5 = pygame.Rect(200, 200, tamanyo_casillas, tamanyo_casillas)
casilla6 = pygame.Rect(400, 200, tamanyo_casillas_especial, tamanyo_casillas)
casilla7 = pygame.Rect(0, 400, tamanyo_casillas, tamanyo_casillas_especial)
casilla8 = pygame.Rect(200, 400, tamanyo_casillas, tamanyo_casillas_especial)
casilla9 = pygame.Rect(400, 400, tamanyo_casillas_especial, tamanyo_casillas_especial)
casillas = [casilla1, casilla2, casilla3, casilla4, casilla5,\
casilla6, casilla7, casilla8, casilla9]

# Ahora, definiremos algunas variables, como la que determinara a que
# jugador le toca mover, y otras que necesitaremos más adelante.
# Procuro ponerles un nombre descriptivo para no tener que explicarlas
# una a una. Bueno, procedamos.
le_toca_a_jugador1 = True
le_toca_a_jugador2 = False
ha_ganado_jugador1 = False
ha_ganado_jugador2 = False


# Codigo para probar el programa.
while True:
   for i in range(len(casillas)):
      screen.fill(casillas_color, casillas[i])
      pygame.display.flip()
      modifica_matriz(le_toca_a_jugador1, le_toca_a_jugador2)
      for i in range(len(matriz)):
         for j in range(len(matriz[0])):
            print matriz[i][j]
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor endaramiz » Dom Feb 01, 2009 6:35 pm

dvd escribió: He ejecutado el código y sale un 1 cada ocho None's. Que es lo normal, ya que la posición del ratón por defecto es (0, 0).

Es cierto lo que he dicho, pero también he encontrado un error. Si se ejecuta el programa con el puntero del ratón fuera, funciona bien por lo que he dicho (la posición devuelve (0, 0) por defecto). Pero no me funciona bien si, al ejecutarse el programa, el ratón está dentro de la pantalla y NO en el primer cuadrado.
Este error creo que sucede por la manera interna de tratar los eventos de pygame. Aparentemente, lo he conseguido solucionar llamando a "pygame.event.get()". Me parece que tuve un problema similar cuando estaba empezando :)

Prueba a poner esto en el while:
Código: Seleccionar todo
#while True:
salir = False
while not salir:
   for event in pygame.event.get():
      if event.type == QUIT:
         salir = True
   [...]


Saludos.
Última edición por endaramiz el Dom Feb 01, 2009 7:14 pm, editado 1 vez en total
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Ahora me funciona

Notapor algarafa » Dom Feb 01, 2009 6:58 pm

He vuelto a probarlo y ahora si me funciona. Al parecer el problema era que al ejecutarlo desde el botón ejecutar de mi entorno de programación, no funcionaba bien, pero cuando lo he hecho desde la línea de comandos de Debian, me ha ido a la perfección. ¡Siento haber posteado para nada! :oops:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor endaramiz » Dom Feb 01, 2009 7:19 pm

dvd escribió:He ejecutado el código y sale un 1 cada ocho None's. Que es lo normal, ya que la posición del ratón por defecto es (0, 0).


Es cierto lo que he dicho, pero también he encontrado un error. Si se ejecuta el programa con el puntero del ratón fuera, funciona bien por lo que he dicho (la posición devuelve (0, 0) por defecto). Pero no me funciona bien si, al ejecutarse el programa, el ratón está dentro de la pantalla y NO en el primer cuadrado.
Este error creo que sucede por la manera interna de tratar los eventos de pygame. Aparentemente, lo he conseguido solucionar llamando a "pygame.event.get()". Me parece que tuve un problema similar cuando estaba empezando :)

Prueba a poner esto en el while:
Código: Seleccionar todo
#while True:
salir = False
while not salir:
   for event in pygame.event.get():
      if event.type == QUIT:
         salir = True
   [...]


Saludos.

Pd: me he equivocado de botón y he editado mi mensaje anterior. Intentaré arreglarlo.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Nuevo código

Notapor algarafa » Vie Feb 06, 2009 7:05 pm

Hola a todos. He tardado en responder porque no quería hacer el topic demasiado largo, y por eso mismo, para no poner un código larguísimo (270 líneas), os dejo un link de descarga. Os pediría que no lo descargarais más de una o dos veces por persona, porque el hosting es gratuito y te ponen bastantes restricciones de transferencia.
http://informaticafacil.atwebpages.com/ ... aya.tar.gz
Hay algunas partes del código, que se pueden acortar, pero los retoque los voy a dejar para cuando tenga el juego acabado, entonces lo retocaré y sacaré una nueva versión :D
En fin, estoy abierto a sugerencias, me queda por hacer lo siguiente:
    :arrow: Hacer una función que compruebe si alguien ha ganado, y que imprima en pantalla una imagen con mensaje de victoria, y que diga que jugador ha ganado.
    :arrow: Ponerle un menú
    :arrow: Hacer una IA (esto lo dejaré para lo último)

Bueno, eso es todo, aprovecho el post, para felicitar por la reforma del sitio. Y otra cosa, si lees este post Hugo, por favor, no me dejes en ascuas respecto a lo de Shaolin Fury, respondeme en el topic de la sección videojuegos.
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor Juanxo » Sab Feb 07, 2009 3:11 am

Buenas Rafa!! Estaba dando una vuelta por el foro cuando vi tu post. La verdad es que siempre he querido realizar un tres en raya para aprender, asi que como no tenía nada que hacer, te hice algo de trabajo sucio.
En cuanto a lo de mejorar el código, yo hice algunos cambios

en verificar si se ha pulsado una casilla:
Código: Seleccionar todo
def modifica_matriz_y_cierra():
    global casillas, matriz, le_toca_a_jugador1, le_toca_a_jugador2
    posicion_raton = pygame.mouse.get_pos()
    boton_pulsado = None
    for evento in pygame.event.get():
        if evento.type == MOUSEBUTTONDOWN:
            boton_pulsado = evento.button
        if evento.type == pygame.QUIT:
            sys.exit(0)
    raton = [posicion_raton[0], posicion_raton[1], boton_pulsado]
    filas,columnas=3,3
    fila_actual=0
    columna_actual=0
    casilla_actual=0
    for fila in range(filas):
        for columna in range(columnas):
            columna_actual=casilla_actual%3
            casilla_actual=casilla_actual%9
            fila_actual=casilla_actual//3
            if raton[0] >= casillas[casilla_actual].left and raton[0] <= casillas[casilla_actual].right \
            and raton[1] >= casillas[casilla_actual].top and raton[1] <= casillas[casilla_actual].bottom\
            and raton[2] == 1 and matriz[fila_actual][columna_actual] == None:
                if le_toca_a_jugador1:
                    matriz[fila_actual][columna_actual] = 1
                    le_toca_a_jugador1 = False
                    le_toca_a_jugador2 = True
                else:
                    matriz[fila_actual][columna_actual] = 2
                    le_toca_a_jugador2 = False
                    le_toca_a_jugador1 = True
            casilla_actual+=1


Lo que hice fue automatizarla. para ello hice dos bucles for(para recorrer las filas y columnas),jugando con los valores de la casilla, fila y columna(casilla_actual,fila_actual,etc)

En actualiza fichas:
Código: Seleccionar todo
def actualiza_fichas(jugador1,jugador2,matriz):
        columnas=3
        filas=3
        for fila in range(filas):
                for columna in range(columnas):
                        if matriz[fila][columna]==1:
                                screen.blit(jugador1,(200*columna+9,200*fila +9))
                        elif matriz[fila][columna]==2:
                                screen.blit(jugador2,(200*columna+9,200*fila+9))
        pygame.display.flip()

no creo que haga falta comentarios

en cuanto a lo de ganador:

Código: Seleccionar todo
def ganador(matriz,jug):
        victoria=0
        if (matriz[0][0]==jug and matriz[1][0]==jug and matriz[2][0]==jug) or \
        (matriz[0][1]==jug and matriz[1][1]==jug and matriz[2][1]==jug) or \
        (matriz[0][2]==jug and matriz[1][2]==jug and matriz[2][2]==jug) or \
        (matriz[0][0]==jug and matriz[0][1]==jug and matriz[0][2]==jug) or \
        (matriz[1][0]==jug and matriz[1][1]==jug and matriz[1][2]==jug) or \
        (matriz[2][0]==jug and matriz[2][1]==jug and matriz[2][2]==jug) or \
        (matriz[0][0]==jug and matriz[1][1]==jug and matriz[2][2]==jug) or \
        (matriz[0][2]==jug and matriz[1][1]==jug and matriz[2][0]==jug):
                victoria=1
        return victoria


no se me ocurria manera de automatizarlo

por lo tanto, el bucle principal quedaría asi:

Código: Seleccionar todo
while True:
    print '------------------'
    for i in range(len(matriz)):
        print matriz[i]
    print '------------------'
    modifica_matriz_y_cierra()
    actualiza_fichas(jugador1, jugador2, matriz)
    ganador(matriz,1)
    ganador(matriz,2)
    if ganador(matriz,1)==1:
        ha_ganado_jugador1=True
    elif ganador(matriz,2)==1:
        ha_ganado_jugador2=True
    if ha_ganado_jugador1:
        print 'HA GANADO EL JUGADOR 1'
        pygame.time.delay(2000)
        sys.exit()
    if ha_ganado_jugador2:
        print 'HA GANADO EL JUGADOR 2'
        pygame.time.delay(2000)
        sys.exit()


Espero que te ayude y,si no entiendes algo, dimelo

**EDITO:estoy empezando con la IA.En principio lo hago para mi como aprendizaje(puesto que tu interés es aprender,y no hay mejor manera que hacerlo uno mismo, pero si necesitas cualquier ayuda, te la paso)

Buen Trabajo Rafa!!!!
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

¡Gracias Juanxo!

Notapor algarafa » Sab Feb 07, 2009 9:45 am

¡Muchas gracias Juanxo! ¡La verdad es que el código gana mucho más así! Ahora mismo ya lo estoy implementando, es que no quiero hacer copiar y pegar, porque quiero entender el método, para aprender.
Entiendo tanto la función actualiza_fichas como la de que juegador ha ganado. En cambio la de modifica_matria_y_cierra, entiendo la mayoría, puesto que es parecido a lo que yo había ecrito pero automatizado, pero no entiendo muy bien el método que usas para las filas, columnas y casillas, es decir esta parte:
Código: Seleccionar todo
filas,columnas=3,3
    fila_actual=0
    columna_actual=0
    casilla_actual=0
    for fila in range(filas):
        for columna in range(columnas):
            columna_actual=casilla_actual%3
            casilla_actual=casilla_actual%9
            fila_actual=casilla_actual//3

No entiendo muy bien el algoritmo que usas, por el resto te lo agradezco mucho!!! :D
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor Juanxo » Sab Feb 07, 2009 11:02 am

Lo primero, gracias a ti, porque,aunque te haya hecho esto, para mi a veces se me hace un poco pesado hacer proyectos enteros, pero ayudar a gente en cosas puntuales me es mas entretenido, además de que supone un nuevo reto para mi(apenas llevo 3 semanas con python-pygame)

En cuanto al codigo:
Ay dios mio!! porque me complico tanto con tonterias, tienes razon!!!Te apunto el código nuevo:

Código: Seleccionar todo
    filas,columnas=3,3
    casilla=0
    for fila in range(filas):
        for columna in range(columnas):
            if raton[0] >= casillas[casilla].left and raton[0] <= casillas[casilla].right \
            and raton[1] >= casillas[casilla].top and raton[1] <= casillas[casilla].bottom\
            and raton[2] == 1 and matriz[fila][columna] == None:
                if le_toca_a_jugador1:
                    matriz[fila][columna] = 1
                    le_toca_a_jugador1 = False
                    le_toca_a_jugador2 = True
            casilla+=1


Pero ademas,me surge un problemilla:cuando alguien gana,no se dibuja la imagen sobre la casilla que pulso, sino que pasa directamente a pygame.time.delay().Alguien sae como evitarlo??


Por cierto, para lo de la IA, si quieres que sea buena puedes fliparlo para hacerla, porque hay un montón de excepciones.yo de momento hice una que lo primero que intenta es poner en el centro, y si ya esta ocupada, pone al azar xd
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Sab Feb 07, 2009 7:54 pm

Felicidades, tiene buena pinta.
Sería mejor que no utilizases ninguna variable 'global'.
Así funciona, aunque lo que he visto que es lo más normal, es poner el código principal dentro de un main().

Código: Seleccionar todo
            if raton[0] >= casillas[casilla].left and raton[0] <= casillas[casilla].right \
            and raton[1] >= casillas[casilla].top and raton[1] <= casillas[casilla].bottom\
            and raton[2] == 1 and matriz[fila][columna] == None

Creo que cuando empiezas, lo mejor es implementar tú mismo este tipo de cosas. Pero una vez entendido, puedes ahorrarte faena utilizando métodos del rectángulo (http://www.losersjuegos.com.ar/traducciones/pygame/rect#collidepoint)

Juanxo escribió:Pero ademas,me surge un problemilla:cuando alguien gana,no se dibuja la imagen sobre la casilla que pulso, sino que pasa directamente a pygame.time.delay().Alguien sae como evitarlo??

Supongo que será por el orden del bucle. Aunque, para asegurarlo, tendría que ver el código completo.


Juanxo escribió:Por cierto, para lo de la IA, si quieres que sea buena puedes fliparlo para hacerla, porque hay un montón de excepciones.yo de momento hice una que lo primero que intenta es poner en el centro, y si ya esta ocupada, pone al azar xd

Fue el primer programa que hice en Python. Intentar hacerlo y luego lo publico y comparamos(si lo encuentro).

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Juanxo » Sab Feb 07, 2009 8:36 pm

aunque lo que he visto que es lo más normal, es poner el código principal dentro de un main().


yo tambien lo suelo ver así.Serán manías o "defectillos".

Creo que cuando empiezas, lo mejor es implementar tú mismo este tipo de cosas. Pero una vez entendido, puedes ahorrarte faena utilizando métodos del rectángulo


Es que rafa dijo que queria empezar si POO, porque le costaba un poco(como a todo el que empieza).Por eso no lo ha utilizado todavía

Supongo que será por el orden del bucle. Aunque, para asegurarlo, tendría que ver el código completo.


El codigo era: un pygame.display.flip() seguido del time.delay. Yo creo que fallaba porque pasaba directamente al pygame.time.delay, sin apenas pararse en el display.flip().Algo similar me sucedía cuando intentaba poner mas de un sondio seguido en otro juego que hice(el segundo "mataba" al primero)

Fue el primer programa que hice en Python. Intentar hacerlo y luego lo publico y comparamos(si lo encuentro).


busca corre, corre, :D sabes tu( o quien sea) de algún buen tutorial de este tema??

Gracias
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Sab Feb 07, 2009 10:27 pm

Juanxo escribió:busca corre, corre, :D sabes tu( o quien sea) de algún buen tutorial de este tema??

Jeje Bueno yo lo busco, pero primero intentar hacerlo que sinó no tiene gracia.
No se de ningún tutorial. El tema de IA puede ser demasiado complicado. Es más, lo que yo hice creo que ni siquiera se considera IA.


Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Nuevos retoques

Notapor algarafa » Dom Feb 08, 2009 9:19 am

Bueno, aquí os dejo la nueva versión con los retoques de Juanxo. Hay que ejecutarla desde consola, porque el ganador se ve con un mensaje desde consola.
http://informaticafacil.atwebpages.com/ ... ya2.tar.gz
Juanxo escribió:

busca corre, corre, Very Happy sabes tu( o quien sea) de algún buen tutorial de este tema??

Jeje Bueno yo lo busco, pero primero intentar hacerlo que sinó no tiene gracia.
No se de ningún tutorial. El tema de IA puede ser demasiado complicado. Es más, lo que yo hice creo que ni siquiera se considera IA.
Estoy de acuerdo con endaramiz (ya leí tu post exdvd :D hiciste como yo eh, cambio de nick), la IA hay que currarsela, nada de que nos la den hecha, como mucho oientaciones.
Respecto a lo de rectcollide, no lo puse así porque no lo conocía, quizá más tarde lo modifique, pero ahora voy a ver si hago una imagen de victoria para el J1 y el J2, para que se sepa quien gana. Y respecto a lo de poner el programa principal dentro de una función main, tenía pensado hacerlo, pero os explico por que no lo he hecho todavía. Si el menú del juego lo implementamos en el mismo archivo que el juego, cada una de las opciones del menú llamaría a una función, entonces esa función sería un subprograma principal, que sería por ejemplo lo que llevamos hasta ahora, pero la función main sería el menú, no el programa principal. Aunque Juanxo está investigando para hacer el programa en varios archivos. Bueno, pues eso.
¡Saludos!
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor Juanxo » Dom Feb 08, 2009 7:04 pm

Buenas.
Enderamiz, me ofendes con el simple pensamiento de que quiero copiar tu código :P En todo caso, aunque me pasaras tu código, no lo copiaria tal cual, sino que lo reescribiría para por lo menos aprender como va.

En cuanto al juego en si, ahora estoy tratando de implementar un menú, pero me topo con algunos problemillas:
Estoy usando el método desarrollado en la sección de articulos. La parte de juego nuevo lo tngo hecho ya(no es mu dificil tampoco).
La parte de opciones la tengo hecha tambien, pero aquí me surgen dos problemas(si lo llamo desde otro archivo me da error.Mi intención es poder seleccionar entre 2 jugadores o jugador vs com. En caso de que utilizara la sección de opciones desde otro archivo, tendría que definir una variable(nº jugadores, por ejemplo), la cual debería poder ser modificada desde el menu principal.Mi duda es¿Se pueden modificar variables de otros archivos importados?(Ejemplo: opciones.nºjugadores)

Por último, en el menú creditos, me pasa lo mismo que con opciones(no me funciona si lo llamo desde otro archivo)


**Edito:Aunque no quiero que me digas como lo hiciste exactamente(lo de la IA), si me gustaría saber si lo hiciste mediante un estudio de casos, o se puede automatizar de alguna manera
Gracias
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Dom Feb 08, 2009 10:04 pm

Juanxo escribió:En caso de que utilizara la sección de opciones desde otro archivo, tendría que definir una variable(nº jugadores, por ejemplo), la cual debería poder ser modificada desde el menu principal.Mi duda es¿Se pueden modificar variables de otros archivos importados?(Ejemplo: opciones.nºjugadores)

A un archivo lo que se importan son clases y funciones de otros archivos (hasta donde mi conocimiento llega). Cuando importas una clase, lo que haces a continuación es crear una instancia (como una copia). Por lo tanto, sí que puedes modificar sus variables y esas cosas...

Juanxo escribió:Por último, en el menú creditos, me pasa lo mismo que con opciones(no me funciona si lo llamo desde otro archivo)

Tendría que ver todos los archivos para encontrar el error.


Juanxo escribió:Enderamiz, me ofendes con el simple pensamiento de que quiero copiar tu código :P En todo caso, aunque me pasaras tu código, no lo copiaria tal cual, sino que lo reescribiría para por lo menos aprender como va.

**Edito:Aunque no quiero que me digas como lo hiciste exactamente(lo de la IA), si me gustaría saber si lo hiciste mediante un estudio de casos, o se puede automatizar de alguna manera
Gracias
Jeje bueno he estado algo ocupado, pero, cuando tenga tiempo libre, lo busco(estos días será más difícil).
Si no recuerdo mal, lo que hacía la máquina era comprobar si puede colocar en medio, comprobar si puede ganar en un solo turno, comprobar si el humano puede ganar en un solo turno y si no se cumplía ninguno de estos casos, ponía ficha con la esperanza de poder ganar en 2 turnos.
Como ves, es un poco largo pero sencillo de programar. Los algoritmos utilizados no creo que fueran de lo más rápidos... xD

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Geo » Lun Feb 09, 2009 4:55 am

Hace ya algún tiempo hice un "gato" (así conocemos este juego aquí en México) en Visual Basic, era para jugar contra la computadora, no era una IA propiamente dicha (es decir, inteligente :P), lo busco y lo pongo por aquí si a alguien le interesa ;).

Ánimo con el proyecto :).
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

¡Gracias!

Notapor algarafa » Lun Feb 09, 2009 12:57 pm

¡Muchas gracias a todos! Se ve que os ha gustado el proyecto. ahora mismo estoy hablando con un amigo con el que quede que haría los gráficos para mis videojuegos, para que me haga una imagen de victoria para cada jugador. El lo que hace es dibujar las letras a mano, y luego las vamos a escanear y retocar, así no saldría el ganador por consola, si no que imprimiriamos la imagen en pantalla. Tenía pensado que fueran algo así como:
Arriba el texto Ha ganado el... Luego debajo un emoticono feliz a la izquierda y a la derecha la imagen de la ficha del J1 o el J2 dependiendo de cual sea, y que debajo de esta ponga J1 en rojo para el J1 y J2 en azul para el J2 dependiendo de quien haya ganado. Si alguno de vosotros pudiera hacerlas, porque mi amigo no pone mucho ineterés, ya se lo llevo pidiendo desde antes de empezar a programar y todavía no me lo ha hecho.
En fin, pasando a la parte de programación, primero vamso a acabar la parte de 2 jugadores, y luego ya hacemos el menú con los créditos y tal. Yo lo que veo que falta es poco, la imagen que mencionaba antes y un logotipo para el juego, preferiblemente una guitarra, dado que las fichas del juego son el Tux de Linux transformado en dos famosos guitarristas (Angus Young y Slash). Luego también falta una función que mire se hay un empate y luego muestre en pantalla Ha habido un empate... (otra posible imagen).
Bueno, pues eso es todo, agradezco de verdad vuestra ayuda, y si quereis que os ponga como autores en vez de como agradecimientos especiales, estaré encantado. Por cierto endaramiz, en el código fuente, al principio comente quien era el autor del proyecto original, y luego en la parte de agradecimientos especiales, aparece tu nombre real con apellido (espero que no te moleste) y tu nickname antiguo (dvd), ¿quieres que añada endaramiz también?
¡Gracias de nuevo a todos!
P.D.: Hay que buscar una tipografía bonita para el juego. :wink:
http://liberatumundo.wordpress.com/
Avatar de Usuario
algarafa
 
Mensajes: 135
Registrado: Lun Oct 27, 2008 6:12 pm
Ubicación: España

Notapor Juanxo » Lun Feb 09, 2009 9:10 pm

Me alegro de que este llendo tan bien!!Lo de los gráficos es lo de menos yo creo,puesto que se trata de aprendizaje. En cuanto a lo de las letras, vi un artículo en la sección referencias acerca de como hacer letras chulas.

Yo por mi parte, termine el menú y ya conseguí dar a elegir entre 2 jugadores o 1 jugador.Eso si, tuve que usar una global.
En cuanto a lo de dividirlo en archivos,creo que es muy poco codigo como para dividirla en varios archivos(además de que lo de dividir código se está convirtiendo en mi talón de aquiles xD)
Si alguno quiere el code, darme vuestro correo y os envío todo(imagenes y demás)

Un saludo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Re: ¡Gracias!

Notapor endaramiz » Mar Feb 10, 2009 11:43 am

rafahack95 escribió:ahora mismo estoy hablando con un amigo con el que quede que haría los gráficos para mis videojuegos, para que me haga una imagen de victoria para cada jugador. El lo que hace es dibujar las letras a mano, y luego las vamos a escanear y retocar, así no saldría el ganador por consola, si no que imprimiriamos la imagen en pantalla

Colocar un imagen en pantalla es demasiado sencillo. Yo creo que sería más interesante utilizar fuentes.


rafahack95 escribió:Bueno, pues eso es todo, agradezco de verdad vuestra ayuda, y si quereis que os ponga como autores en vez de como agradecimientos especiales, estaré encantado. Por cierto endaramiz, en el código fuente, al principio comente quien era el autor del proyecto original, y luego en la parte de agradecimientos especiales, aparece tu nombre real con apellido (espero que no te moleste) y tu nickname antiguo (dvd), ¿quieres que añada endaramiz también?
¡Gracias de nuevo a todos!

Jeje de nada, da igual, no te preocupes...

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona


Volver a Propuestas de desarrollo y concursos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados