martes, 27 de octubre de 2015

#Gato#

#Gato#


Autor: Javier Araneda
Competencia: Tecnologías de la información (Nivel 2)
Asignatura: Desarrollo de aplicaciones cliente servidor.

Palabras clave: python, programación, ip, juego,gato,puertos,port.


Descripción de la actividad:  

Este trabajo fue un trabajo de en python, no recuerdo exactamente que trabajo fue, El punto es que teníamos que hacer un gato. python. El profe nos dio de "esqueleto" con la estructura del gato:


    print "                    "
    print "     1   2   3      "
    print "   +---+---+---+    "
    print "1  | %c | %c | %c | " % (M[0], M[1], M[2])
    print "   +---+---+---+    "
    print "2  | %c | %c | %c | " % (M[3], M[4], M[5])    
    print "   +---+---+---+    "
    print "3  | %c | %c | %c | " % (M[6], M[7], M[8])
    print "   +---+---+---+    "
    print "                    "


El objetivo es mediante sockets establecer la conexión desde el "cliente" al servidor" y poder jugar gato. El cliente envía las coordenadas donde quiere colocar su marca, y luego el servidor envía una respuesta. Toda la información "grafica" se muestra en el lado del cliente mientras que . Cuando se cumple el criterio de "Ganar" o "Empatar" el servidor lo analiza y envía un mensaje saludando al ganador y termina la conexión




Y al final el código de fuente termino siendo esto:


Cliente: 

 import socket ,os
    def Jugada():

        while True:    

            tablero()  

            f = raw_input("fila   : ")
            
            try:
                f=int(f)
            except ValueError:
                tablero()            
                f = raw_input("fila   : ")
                
        
            if f<=3:
                break
            

        while True:    
            tablero() 
            c = raw_input("Colmna   : ")
            
            try:
                c=int(c)
            except ValueError:
                tablero()            
                print "fila    :",f
                c = raw_input("Columna   : ")
                
            
            if c<=3:
            
                break    
                
        return 3*(int(f)-1) + (int(c)-1)

    def tablero():
        os.system("cls")
        print "                    "
        print "     1   2   3      "
        print "   +---+---+---+    "
        print "1  | %c | %c | %c | " % (M[0], M[1], M[2])
        print "   +---+---+---+    "
        print "2  | %c | %c | %c | " % (M[3], M[4], M[5])    
        print "   +---+---+---+    "
        print "3  | %c | %c | %c | " % (M[6], M[7], M[8])
        print "   +---+---+---+    "
        print "                    "

        
    M = ['#','#','#','#','#','#','#','#','#']
    end=False
    #Crear un socket para la conexion con el servidor. Puede dejarlse sin parametros
    #o se puede escribir    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s = socket.socket()
     
    #los parametros de metodo connect son el numero IP del servidor y el numero del puerto
    s.connect(("localhost", 9999))
    s.send("juguemos")

     
    #Creamos un bucle para mantener la conexion
    while True:
        
        p=Jugada()
        while True:
            
            if M[p]!='X' and M[p]!='O':
                    
                    
                    break
            else:
                tablero()
                p=Jugada()
          
        M[p] = 'X'
        tablero()
        s.send(str(p))        
                     
            
            
        while True:
            if (M[0]=="X" and M[1]=="X" and M[2]=="X"):
                print "\n\nGane"
                end=True
                break
            elif (M[3]=="X" and M[4]=="X" and M[5]=="X"):
                print "\nGane"
                end=True
                break
            elif (M[6]=="X" and M[7]=="X" and M[8]=="X"):
                print "\nGane"
                end=True
                break
            elif (M[0]=="X" and M[3]=="X" and M[6]=="X"):
                print "\nGane"
                end=True
                break
            elif (M[1]=="X" and M[4]=="X" and M[7]=="X"):
                print "\nGane"
                end=True
                break
            elif (M[2]=="X" and M[5]=="X" and M[8]=="X"):
                print "\nGane"
                end=True
                break
            elif (M[0]=="X" and M[4]=="X" and M[8]=="X"):
                print "\nGane"
                end=True
                break        
            elif (M[2]=="X" and M[4]=="X" and M[6]=="X"):
                print "\nGane"
                end=True
                break
            else:
                break
        
        
        if end==True:
            break
        
        p = int(s.recv(2))
        print "indice recibido = ", p, "\n"
        M[p] = 'O'
        
        while True:
            if (M[0]=="O" and M[1]=="O" and M[2]=="O"):
                print "\n\nPerdi"
                break
            elif (M[3]=="O" and M[4]=="O" and M[5]=="O"):
                print "\nPerdi"
                break
            elif (M[6]=="O" and M[7]=="O" and M[8]=="O"):
                print "\nPerdi"
                break
            elif (M[0]=="O" and M[3]=="O" and M[6]=="O"):
                print "\nPerdi"
                break
            elif (M[1]=="O" and M[4]=="O" and M[7]=="O"):
                print "\nPerdi"
                break
            elif (M[2]=="O" and M[5]=="O" and M[8]=="O"):
                print "\nPerdi"
                break
            elif (M[0]=="O" and M[4]=="O" and M[8]=="O"):
                print "\nPerdi"
                break        
            elif (M[2]=="O" and M[4]=="O" and M[6]=="O"):
                print "\nPerdi"
                break
            else:
                break
            
    print "\nel juego ha terminado"
    #s.close()
----------------

Servidor: 

import socket
from random import randrange

M = ['#','#','#','#','#','#','#','#','#']

# Crear un socket para que el servidor acepte conexiones de clientes
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# El metodo bind() identifica el puerto de escucha y la IP desde donde el servidor
# aceptara conexiones (dejamos esa IP en blanco para que acepte de cualquiera)
s.bind(("", 9999))

print "\n\nservidor esperando un contendor\n\n"

# el metodo listen() acepta tantas conexiones como el valor que le pasemos (1 en este caso)
s.listen(1)

# Crear un socket para escuchar al cliente. Al aceptar una conexion se obtiene la tupla add
# que contiene IP:puerto que identifica la IP del cliente y su puierto
sc, addr = s.accept()
mensaje = sc.recv(10)
if mensaje=="juguemos":
    print "jugando con cliente ", addr[0]
   
apagar = False      
while True:
    # El metodo recv recibe tantos bytes como le indiquemos
    p = int(sc.recv(2))
    print "indice recibido = ", p
   
    if p==9:
        break
           
    M[p] = 'X'
   
    while True:
        if (M[0]=="X" and M[1]=="X" and M[2]=="X"):
            print "\n\nPerdi"
            apagar=True
            break
        elif (M[3]=="X" and M[4]=="X" and M[5]=="X"):
            print "\nPerdi"
            apagar=True
            break
        elif (M[6]=="X" and M[7]=="X" and M[8]=="X"):
            print "\nPerdi"
            apagar=True
            break
        elif (M[0]=="X" and M[3]=="X" and M[6]=="X"):
            print "\nPerdi"
            apagar=True
            break
        elif (M[1]=="X" and M[4]=="X" and M[7]=="X"):
            print "\nPerdi"
            apagar=True
            break
        elif (M[2]=="X" and M[5]=="X" and M[8]=="X"):
            print "\nPerdi"
            apagar=True
            break
        elif (M[0]=="X" and M[4]=="X" and M[8]=="X"):
            print "\nPerdi"
            apagar=True
            break      
        elif (M[2]=="X" and M[4]=="X" and M[6]=="X"):
            print "\nPerdi"
            apagar=True
            break
        else:
            break  
    if apagar==True:
        break

   
    while True:
        k = randrange(0, 9)
        if M[k] == '#':
            M[k] = 'O'
            break

    print "indice enviado = ", k, "\n"
    # El servidor le responde al cliente
    sc.send(str(k))
   
    while True:
        if (M[0]=="O" and M[1]=="O" and M[2]=="O"):
            print "\n\nGane"
            apagar=True
            break
        elif (M[3]=="O" and M[4]=="O" and M[5]=="O"):
            print "\nGane"
            apagar=True
            break
        elif (M[6]=="O" and M[7]=="O" and M[8]=="O"):
            print "\nGane"
            apagar=True
            break
        elif (M[0]=="O" and M[3]=="O" and M[6]=="O"):
            print "\nGane"
            apagar=True
            break
        elif (M[1]=="O" and M[4]=="O" and M[7]=="O"):
            print "\nGane"
            apagar=True
            break
        elif (M[2]=="O" and M[5]=="O" and M[8]=="O"):
            print "\nGane"
            apagar=True
            break
        elif (M[0]=="O" and M[4]=="O" and M[8]=="O"):
            print "\nGane"
            apagar=True
            break      
        elif (M[2]=="O" and M[4]=="O" and M[6]=="O"):
            print "\nGane"
            apagar=True
            break      
        else:
            break
   
    if apagar==True:
        break
print "\n\nel juego ha terminado"

#Cerramos la instancia del socket cliente y servidor
sc.close()
s.close()
.

Conclusión:


Los sockets brindan la posibilidad de conectarse entre 2 computadores a distancia, Solo con la dirección IP y un puerto de conexión. Esto permite hacer varios tipos de trabajo a distancia, también facilita un montón el envió de información atravesar de los programas.

  

lunes, 26 de octubre de 2015

Caja Rotadora

Caja Rotadora


Autor: Javier Araneda
Competencia: Desarrollo de Software (Nivel 2)
Asignatura: Programación II

Palabras clave: python, programación, visualPython, trabajo practico,Rotación.


Descripción de la actividad:  

Este trabajo fue es laboratorio 5 de programación, con el profe Caro, usando la librería de VISUAL, para python. Se nos pidió crear un objeto caja de color rojo(con visual), el cual tenia estar  sobre una linea y que con los botones X,Y,Z,A se cambiara la rotación en ese eje. con la letra A se invertía el giro. También cuando la caja caga diera una vuelta completa(360 grados) tenia que cambiar de color rojo a azul. Simple.





Solución:

Lo primero que hice fue investigar sobre la librería visualPython, la librería permite crear ciertos objetos, los cuales tienen una representación gráfica en 3d, cada objeto tiene, características(color, posición, angulo), así que con eso ya tenia la mitad difícil del trabajo hecha, como hacer que el objeto gire en los ángulos. Solo faltaba ver como hacer que reconociera los inputs (X,Y,Z,A). Para mi sorpresa visualPython tiene una función scene.kb.getkey(): , la cual captura la letra que se esta presionando  en el momento. y la devuelve como una variable.Ya lo tenia todo.



Y al final el código de fuente termino siendo esto:


# -*- coding: utf-8 -*-
"""
Created on Tue Jun 02 09:42:34 2015

@author: Javier
"""

from visual import *
import math

suelo=box(pos=(0,0,0),size=(100,1,30),color=color.green) #La linea
box=box(pos=(0,30,10),size=(50,30,20),color=color.red)  #La caja.
angulo=1
ax=(1,0,0)
giro=0

cColor=True

while True:            
    
    rate(60)
    if cColor:
        if giro==360 or giro==-360  :
            box.color=color.blue
            cColor=False
            giro=0        
    else:
        if giro==360 or giro==-360  :
            box.color=color.red
            cColor=True
            giro=0        
    box.rotate(angle=math.radians(angulo),axis=ax) #Hace rotar al objeto.
    
    if scene.kb.keys:
        k=scene.kb.getkey() # Caputra del teclado
        if k=='y':
            ax=(1,0,0)        
        if k=='x':
            ax=(0,1,0)        
        if k=='z':
            ax=(0,0,1)        
        if k=='a':
          if angulo>0:
              angulo=(-1)
              giro=0        
          else:
              angulo=(1)
              giro=0        
    if angulo>0:
        giro=giro-1
    else:
        giro=giro+1

    print giro

Como se puede ver, es un programa corto, pero preciso,  la función OBJETO.rotate() hace todo el trabajo, solo hay que entregarle los ángulos que que rotar y el eje. 

----------------

Programa Funcionando. 




Reflexión:


Esta es la magia de las librerías, No hay necesidad de reinventar la rueda, las librerías son herramientas capases de ayudarnos con las miles de funciones que las componen. Son herramientas poderosas a las cuales hay que sacarles provecho, Creo que no hay que tener miedo a usarlas ya que para algo las crearon.


  

martes, 6 de octubre de 2015

Cajero Automatico

Cajero Automático


Autor: Javier Araneda
Competencia: Desarrollo de Software (Nivel 1)
Asignatura: Programación I

Palabras clave: python, programación, cajero, trabajo practico.


Descripción de la actividad:  

Este fue el primer trabajo practico que  nos pidieron hacer en la asignatura de Programación I.

Fue 'desarrollado' en Python, un lenguaje de Alto nivel.

Se nos pidió hacer un código que simulara el funcionamiento de un cajero automático que cumpliera con las 4 operaciones básicas de una cuenta en el banco: Giros, Depósitos, Consultas de saldo y traspaso de dinero entre cuentas. Ademas el programa no debía terminar cuando se ejecutara la operación, el usuario decidía cuantas operaciones hacer y cuando acabar las operaciones (cerrar el programa).




Solución:

Lo primero que hice fue escribir un "pseudocodigo", y fue algo como esto:

Iniciar programa ­­>Ingresar Contraseña>3 Intentos para insertar la contraseña

>Ingresar tipo de cuenta ­­> Seleccionar la operación­­­ > Terminar consulta ­­­>
Preguntar si desea otra operación ­­­­> Verdadero ­­­­­> se repite desde “Ingresar cuenta”
>Falso ­­­­> se acaba el programa


Y al final el código de fuente termino siendo esto:



# -*- coding: utf-8 -*-
import random
usuario="19.076.372-2"
passw="1234"
saldo=random.randint(0,1000000)
saldo2=random.randint(0,50000)
cont=0
conectado=bool;
while cont<3:
    us=raw_input("ingrese rut");
    co=raw_input("ingrese contreaseña");
    if us==usuario and passw==co:
        print "Bienvenido al sistema"
        conectado=True
        break
    else:
        cont=cont+1;
        print "Usuario y contraseña incorreta"
        conectado=False

while conectado==True:
    print "Que operacion desea utilizar?:"
    print "1.- Giro"
    print "2.- Deposito"
    print "3.- Traspaso"
    print "4.- Consulta Saldo"
    print "0.- Para cerrar"
    choi=int(input("Ingrese opcion:"))
    if choi==1:
        monto=int(input("Ingrese monto a girar:"))    
        saldo=saldo-monto
        print "ha retirado " , monto
    elif choi==2:
        monto=int(input("Ingrese monto a Depositar:"))          
        saldo=saldo+monto
        print "su nuevo saldo es", saldo
    elif choi==3:
        cu2=input("Ingrese cuenta a depositar")    
        monto=int(input("Ingrese monto a Transferir:"))
        saldo=saldo-monto
        saldo2=saldo2+monto
        print "se han transferido", monto,"pesos a la cuenta",cu2
        print "el nuevo saldo es:",saldo2
    elif choi==4:
        print "Su saldo es:", saldo
    elif choi==0:
        break



Como se puede ver, esta hecho de una manera "local", el usario y la pass son predefinidos,

pero el punto es que se puede hacer algo simple y "funcional" con las condicionales while, if, else, y variables booleanas..
----------------



Reflexión:


Si bien es cierto, el código podría haberse pulido más, con cosas bien simples como los ciclos, verdadero y falso y un poco de lógica se puede llegar a construir un programa bastante "solido"(este no lo es de el todo) y bastante funcional. Todo depende de que tan lejos quieras llegar.