##############
# polytechCity : jeu proposé par N. Pourcelot inspiré de simcity
##############

from turtle import *
from random import *

################################################
    ## outils
################################################

# pour se déplacer sans écrire
def va(x,y) :
    up()
    goto(x,y)
    down()

# dessin d'un polygone régulier dont le point en bas à gauche est (x,y)
def dessinePolygone(nbCote,x,y,l,col="black",plein=False):
    va(x,y)
    angle = 360/nbCote
    # récupère la couleur courante
    saveCol = color()
    color(col)
    if plein:
        begin_fill()
    for i in range(0,nbCote):
        forward(l)
        left(angle)
    if plein:
        end_fill()
    # remet la couleur initiale
    color(saveCol[0])

# pour colorier entièrement la case (i,j)
def remplitCase(i,j,c="white"):
    x=xBasGrille + i*tailleCase
    y=yBasGrille + j*tailleCase
    # on remplit la case avec la couleur
    dessinePolygone(4,x,y,tailleCase,c,True)
    # on fait le tour en noir
    dessinePolygone(4,x,y,tailleCase)


################################################
    ## dessin de la grille
################################################
# dessine la grille
def dessineGrille(config) :
    va(xBasGrille,yBasGrille)
    for i in range(0,nbCase) :
        for j in range(0,nbCase) :
            if config[i][j]=="eau":
                remplitCase(i,j,"blue")
            else :
                remplitCase(i,j,"brown")

################################################
    ## dessins des éléments dans la grille
################################################
# dessine une maison dans le carré de coordonnées (i,j)
def dessineMaison(i,j):
    x = xBasGrille + i*tailleCase
    y = yBasGrille + j*tailleCase
    # le carré de la maison
    dessinePolygone(4,x+tailleCase/4,y,tailleCase/2,plein=True)
    # le triangle pour le toit
    dessinePolygone(3,x+tailleCase/4,y+tailleCase/2,tailleCase/2,"red",True)

################################################
    ## pour effectuer les actions de la grille
################################################
# construction de la configuration initiale de la grille
# quelques cases contiennent de l'eau
def construitConfigurationInit(nbCase):
    config = []
    # les cases sont vides
    for i in range(0,nbCase) :
        ligne=[]
        for j in range(0,nbCase) :
            ligne.append("vide")
        config.append(ligne)
    # on créé quelques points d'eau (1 à 3)
    nbPointsEau = randint(1, 3)
    for k in range(0,nbPointsEau):
        li = randint(3, nbCase - 4)
        co = randint(3, nbCase - 4)
        for i in range(li - randint(0, 2), li + randint(1, 2)):
            for j in range(co - randint(0, 2), co + randint(1, 2)):
                config[i][j] = "eau"
    return config
    
# agit dans la case (i,j) en fonction de l'action a
# cela met à jour l'affichage ainsi que la configuration et l'argent
def agir(i,j,a):
    cout = 0
    if a=="c":
        if configuration[i][j]=="eau":
            print("construction impossible, c'est dans l'eau")
        else :
            dessineMaison(i,j)
            configuration[i][j]="maison"
            cout=50 # une maison vaut 50 sesterces
    else :
        print("action inconnue")
    return cout
            
# pour écrire les informations actuelles
def ecritInformations(an):
    
    xInfo=xBasGrille
    yInfo=tailleGrille/2+55
    
    # cadre de la zone de message
    # c'est un rectangle, on aurait pu définir une fonction
    va(xInfo,yInfo)
    saveCol = color()
    color("magenta")
    begin_fill()
    for i in range(0,2):
        forward(tailleGrille)
        left(90)
        forward(50)
        left(90)
    end_fill()
    color(saveCol[0])
    
    # affichage de l'année et l'argent
    va(xInfo+5,yInfo-10)
    message = "Nous sommes en " + str(an) + ".\n"
    write(message)

################################################
    ## programme principal
################################################

# configuration fenetre
title("polytechCity")

# configuration tortue
speed(0)     # va vite
tracer(0)    # on voit pas les déplacements
hideturtle() # on voit pas le curseur

# variables globales pour décrire la grille
# la grille est supposée carrée
marge = 100
nbCase = 20
tailleGrille = window_height()-2*marge
tailleCase = tailleGrille/nbCase
# (xBasGrille,yBasGrille) pt en bas à gauche de la grille
xBasGrille=-tailleGrille/2
yBasGrille=-tailleGrille/2

# représentation de la grille
# permet de savoir ce qu'il y a dans chaque case
# par exemple, s'il y a de l'eau, on ne peut pas construire
configuration = construitConfigurationInit(nbCase)

# dessin de la grille
dessineGrille(configuration)

#########################
# la boucle de simulation
annee = 2000
argent = 1000
action = ""
while argent >0 and action!="q":
    ecritInformations(annee)
    message ="Que souhaitez-vous faire ?"+"\n"
    message +="  Construire maison (c)"+"\n"
    message +="  Quitter (q)"
    action=textinput("choix",message)
    if action=="c" :
        li = int(numinput("case","i ? "))
        co = int(numinput("case","j ? "))
        a = agir(li,co,action)
        argent=argent-a
    annee+=1

    
if argent < 0:
    print("Vous avez fait faillite")
else :
    print("fin du jeu")

exitonclick()
