Zhodnocení naprogramovené hry HAD – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zhodnocení naprogramovené hry HAD – Python – Fórum – Programujte.comZhodnocení naprogramovené hry HAD – Python – Fórum – Programujte.com

 

Ahoj30
Návštěvník
14. 6. 2011   #1
-
0
-

Před delší dobou jsem zde psal ohledně seznamů v Pythonu. Po přečtění vašich reakcí na to, že bych měl pořádně projet základy, jsem se znovu vrátil k oněm základním věcem. Poté jsem zkusil naprogramovat hru hada.
Myslíte, že byste ten můj výtvor mohli zhodnotit? (k čemu máte výtky, popř. co byste udělali jinak...)
Zajímá mě jestli se mám pustit do nových lekcí, nebo pořád dřít ty základy.
 

from livewires import *
import random
import time


def kresli_hada(delka):
    hadak = []
    had_x =  random.randrange(100, 560,10)
    had_y =  random.randrange(100, 200, 10)
    plno = True
    for x in range(delka):
        had = box(had_x, had_y, had_x + 10, had_y + 10, filled = plno)
        hadak.append([had, had_x, had_y])
        had_x -= 10
        plno = False

    return hadak


def pohybHada(x, y):
    global koncime
    polozka = 0
    minule_x = hadak[polozka][1]
    minule_y = hadak[polozka][2]
    hadak[polozka][1] += x
    hadak[polozka][2] += y

    for blok, blok_x, blok_y in hadak[1:]:
        polozka += 1
        hadak[polozka][1] = minule_x
        hadak[polozka][2] = minule_y
        minule_x = blok_x
        minule_y = blok_y

    for blok, blok_x, blok_y in hadak:
        move_to(blok, blok_x, blok_y)

    konec = srazkaShadem()
    konec2 = srazkaSEzdi()
    
    srazkaSjidlem() 

    if konec == 0 or konec2 == 0:
        koncime = 0

    time.sleep(0.05)


def klavesy_a_pohybHada(zmena_x, zmena_y, klavesa1, klavesa2):
    seznam_klaves = [klavesa1, klavesa2]
    
    while koncime:
        pohybHada(zmena_x, zmena_y)             
        klavesy = keys_pressed()

        for klavesa in seznam_klaves:
            if klavesa in klavesy:
                return klavesa
     

def posunHada():
    klavesy = keys_pressed()

    if "a" in klavesy:
        klavesy = klavesy_a_pohybHada(-10, 0, "w", "s")
    elif "s" in klavesy:
        klavesy = klavesy_a_pohybHada(0, -10, "a", "d")
    elif "w" in klavesy:
        klavesy = klavesy_a_pohybHada(0, 10, "a", "d")
    elif "d" in klavesy:
        klavesy = klavesy_a_pohybHada(10, 0, "w", "s")


def skore(body):
    global sezrane_jidlo_text
    t = body
    sezrane_jidlo_text = text(t)


def jidlo():
    while 1:
        ruzne_souradnice = True
        jidlo_x = random.randrange(10,630,10)
        jidlo_y = random.randrange(0,470,10)
        for souradnice in hadak:
            if [jidlo_x, jidlo_y] == souradnice[1:]:
                ruzne_souradnice = False
                break
        if ruzne_souradnice == True:
            break

    jidlo = box(jidlo_x, jidlo_y, jidlo_x + 10, jidlo_y + 10)
    return [jidlo, jidlo_x, jidlo_y]


def srazkaSjidlem():
    global cele_jidlo, body      
    if hadak[0][1:] == cele_jidlo[1:]:
        hadak.append(cele_jidlo)
        cele_jidlo = jidlo()

        remove_from_screen(sezrane_jidlo_text)
        body += 1
        skore(body)     
       

def srazkaSEzdi():
    if hadak[0][1] == 640 or hadak[0][2] == 470:
        return 0
    elif hadak[0][1] == -10 or hadak[0][2] == -10:
        return 0


def srazkaShadem():
    for blok, blok_x, blok_y in hadak[1:]:
        if blok_x == hadak[0][1] and blok_y == hadak[0][2]:
            return 0


def jmeno_hrace():
    jmeno = raw_input("JMENO: ")
    return jmeno


def uloz_nejVysledky(body):
    soubor = file("NEJLEPSI VYSLEDKY - hadak1,1.txt","a")
    hrac = jmeno_hrace()
    text_body = str(body)
    soubor.write(text_body + " " + hrac)
    soubor.write("\n")
    soubor.close()


def cti_srovnej_nejVysledky():
    q = 0
    soubor = file("NEJLEPSI VYSLEDKY - hadak1,1.txt", "r")
    poradi = 1

    srovnani_seznamu = []

    for vysledek in soubor:
        srovnani = vysledek.split()
        srovnani_seznamu.append(srovnani)

    for skore, jmeno in srovnani_seznamu:
        srovnani_seznamu[q][0] = int(skore)
        q += 1

    print 10 * "_", "Tabulka s body hracu", 10 * "_"
    print "\n"
    srovnani_seznamu.sort()
    srovnani_seznamu.reverse()                 
    
    for skore, jmeno in srovnani_seznamu:
        print jmeno, ":", skore    

    soubor.close()


def smaz_tabulku():
    soubor = file("NEJLEPSI VYSLEDKY - hadak1,1.txt", "w")
    soubor.close()
 

znovu = "y"    
while znovu == "y":
    koncime = 1
    body = 0
 
    begin_graphics()
    allow_moveables()
   
    hadak = kresli_hada(5)
    cele_jidlo = jidlo()
    
    move(10, 450)       # skore se bude tisknout v rohu obrazovky
    skore(body)

    while koncime:
        posunHada()

    end_graphics()
  
    uloz_nejVysledky(body)
    cti_srovnej_nejVysledky()

    znovu = raw_input("Chces hrat znovu [y/n] : ")

print "\n"

smazat_tabulku = raw_input("Chces smazat tabulku se vsemi vysledky [y/n]: ")

if smazat_tabulku == "y":
    smaz_tabulku()
    print "Tabulka je smazana :)"


print "Dostal ses na konec programu, nic vic uz tady neni, musis si me spustit znova :)"

Nahlásit jako SPAM
IP: 78.45.112.–
Spectator0
Věrný člen
14. 6. 2011   #2
-
0
-

To Ahoj3 : Hraje se to pěkně! Chtělo by to jen přívětivější ovládání. Vědět, jak začít, čím ovládat. Je to fajnovka. Pro ukládání do tabulky bych spíš zobrazil nějaké grafické okýnko, konzole asi ne, ale je to v podstatě fuk. Líbí se mi to!

Nahlásit jako SPAM
IP: 81.19.47.–
. . .
Ahoj30
Návštěvník
15. 6. 2011   #3
-
0
-

To Spectator : Děkuju mockrát :) Nevím jest-li si nenarazil na pár problémů, které se mi nepodařilo odstranit např.: čím je had delší tím jede pomaleji. ( had s 3 kostičkami jede určitou vzdálenost 15.2 sek, s 50 kostičkami už 16.8sek, se 100 kostičkami 19s) Je to logické čím delší seznam, kde jsou všechny kostky hada, tím delší zpracování než se s tim všim pohne dopředu. Přitom když si zahraju Hada (samozřejmě ne toho mého) na mobilu žádnou změnu rychlosti nezaznamenám?! Jediné co mě napadlo je v průběhu hry zkracovat time.sleep(), nebo zmenšit hrací pole, aby Had nemohl tolik vyrůst a hru tím zpomalovat.
Ještě mam problém s tím, že když klávesu stiskneš moc rychle had se zastaví, popřípadě zajede do sebe a vznikne srážka. To bohužel nevím jak napravit a ani nevím proč to nastane. Když tlačítko zmáčknu rychle stisk se v programu nezaznamená, seznam kláves neukazuje žádné tlačítko, tak nechápu proč se had zastaví?

Nahlásit jako SPAM
IP: 78.45.112.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
16. 6. 2011   #4
-
0
-

Ahoj Ahoj3,
sice na Pythonu3 není livewires a tak si to nevyzkouším, ale i tak se mi líbí jak to máš napsané a je tam u Tebe určitě vidět velký postu.

K tomu, že se ti pohyb hada zpomaluje, tak ty při pohybu toho hada přehresluješ pokaždé celého, je to tak? Nestačilo by jen přidat políčko ve směru kam leze a odebrat jedno políčko z konce?

Nahlásit jako SPAM
IP: 90.178.215.–
nervak0
Věrný člen
17. 6. 2011   #5
-
0
-

Seznam místo objektu je k ničemu. To si budeš pamatovat pořadí všech hodnot a při každé změně hledat, co všechno musíš upravit ?

Podobně ten soubor s výsledky. Dlouhý název zadrátovaný ve 3 funkcích, místo jedné globální proměnné. A možná i rozměry okna by nemusely být natvrdo.

Dodržuj jednotný styl. Názvy kresli_hada, pohybHada, klavesy_a_pohybHada jsou na blití.

Co ta proměnná koncime ?

while koncime: 

posunHada()
Takže, dokud koncime, tak nekončíme, ale hra pokračuje :)

Funkce srazkaShadem a srazkaSEzdi nesmyslně vrací 0, když dojde ke srážce a výchozí None, pokud ne. Navíc je zbytečně voláš obě a zbytečně ty návratové hodnoty ukládáš do proměnných. Přepiš to normálně na True pro srážku a False pro opak a můžeš čarovat:
if srazkaShadem() or srazkaSEzdi():

konec_hry = True
return
Funkce srazkaSjidlem naopak nevrací nic a rovnou srážku ošéfuje :)

Funkce klavesy_a_pohybHada by mohla mít v parametrech seznam, místo dvou jednotlivých kláves. A když vrací klávesu, tak je nesmysl tu návratovku v posunHadata ukládat do klavesy. Kromě toho, že ji k ničemu nepotřebuješ, tak zase dostaneš proměnnou, ve které je něco jiného než má.

Ale hlavně je klavesy_a_pohybHada úplně zbytečná, ten kód může být rovnou v posunHada a bez cyklu. Zároveň se tím zbavíš sleep v pohybHada a můžeš ho dát do hlavního cyklu.

A souhlasím s pány výše, že by bylo dobré zrušit konzoli a kompletně to vyřešit v grafice, a že toho hada nemusíš posunovat celého. A přidám, že v češtině neodpovídáme yes/no :)

Nahlásit jako SPAM
IP: 213.211.51.–
sputnikone+1
Věrný člen
17. 6. 2011   #6
-
0
-
Nahlásit jako SPAM
IP: 147.251.201.–
Ahoj30
Návštěvník
17. 6. 2011   #7
-
0
-

Děkuji za vaši kritiku, obzvláště nervakovi, který toho Hada opravdu rozpitval :)
Díky za tipy jako např.: nehýbat s celým hadem. Obávám se, že mě by to snad v životě nenapadlo :D Zdá se mi, že něco naprogramovat není zas takový oříšek, i když ten dosavadní had mi dal pěkně zabrat a to je ještě hodně co opravovat, horší je vymyslet ten správný způsob, jak danou věc v programu vyřešit, což já zatím neovládám.
Děkuji, že se mnou máte trpělivost :)

Nahlásit jako SPAM
IP: 84.42.206.–
Ahoj30
Návštěvník
24. 8. 2011   #8
-
0
-

#5 nervak
Omlouvam se, že toto vlákno po delší době opět obnovuji, ale nevím, jak zrealizovat jeden nervakův tip na zlepšení hry. Týká se to tohoto : "Seznam místo objektu je k ničemu. To si budeš pamatovat pořadí všech hodnot a při každé změně hledat, co všechno musíš upravit ?"

Vůbec nevím, jak to udělat. Zdá se mi to snad nemožné s absencí seznamu. Ten text mi není zcela jasný. Objektem je myšlena instance třídy, nebo něco jiného?

Můžete mi prosím pomoci, jak ten nervakův vylepšovák napsat do té hry? Nemusíte mi říkat vše, stačí mě jenom nějaká nápověda, rada, jak s tím začít. Samozřejmě když mi to řeknete komplet vše, jak to udělat, taky se nebudu zlobit :)

Nahlásit jako SPAM
IP: 78.45.112.–
zlz
~ Anonymní uživatel
634 příspěvků
27. 8. 2011   #9
-
0
-

Jak máš pro každou kostku seznam [box, x, y], tak místo toho můžeš mít objekt. Takže pro přístup k x místo kostka[1] můžeš používat čitelnější kostka.x.

SCREENWIDTH  = 640
SCREENHEIGHT = 480
BLOCKWIDTH   = 10
BLOCKHEIGHT  = 10

class Blok:
    def __init__(self, x, y, fill = False):
        self.x = x
        self.y = y
        self.box = box(x, y, x + BLOCKWIDTH, y + BLOCKHEIGHT, filled = fill)


def vytvor_hada(delka):
    had = []
    x = SCREENWIDTH / 2
    y = SCREENHEIGHT / 2
    for i in xrange(delka):
        blok = Blok(x, y, i == 0)
        had.append(blok)
        x -= BLOCKWIDTH
    return had

def vytvor_jidlo():
    while True:
        kolize = False
        x = random.randrange(0, SCREENWIDTH-BLOCKWIDTH, BLOCKWIDTH)
        y = random.randrange(0, SCREENHEIGHT-BLOCKHEIGHT, BLOCKHEIGHT)
        for blok in had:
            if x == blok.x and y == blok.y:
                kolize = True
                break 
        if not kolize:
            break 

    jidlo = Blok(x, y)
    return jidlo


def srazka_zed():
    x, y = had[0].x, had[0].y
    maxx, maxy = SCREENWIDTH-BLOCKWIDTH, SCREENHEIGHT-BLOCKHEIGHT
    if not 0 <= x <= maxx or not 0 <= y <= maxy:
        return True
    return False

def srazka_had():
    x, y = had[0].x, had[0].y
    for blok in had[1:]:
        if x == blok.x and y == blok.y:
            return True
    return False

def srazka_jidlo():
    x, y = had[0].x, had[0].y
    if x == jidlo.x and y == jidlo.y:
        return True
    return False

Pokud třídy/objekty nechápeš, tak by to mohl být aspoň slovník {"box": box, "x": x, "y": y}, takže pro to x by to pak bylo zase trochu čitělnější kostka["x"].

Nahlásit jako SPAM
IP: 213.211.51.–
zlz
~ Anonymní uživatel
634 příspěvků
27. 8. 2011   #10
-
0
-

Ty testy souřadnic by v ověřování srážek šly napsat jednodušeji, ale nechci ti moc motat hlavu. Prostuduj objektově orientované programování v Pythonu, není to tak složité a rychle tomu přijdeš na chuť.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Zhodnoceni PDA — založil darkerboy

OOP Zhodnocení — založil SeraphCZ

3d hry v c++ — založil RybaRak-WM

Hry — založil squirrel1981

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý