Omat peli- ja ohjelmaprojektit

Liittynyt
17.10.2016
Viestejä
58
No pahus. Millä selaimella koitat? Pitäisi toimia normaalisti perinteisellä 64 bittisellä selaimella, jossa WebGL tuki. Toisaalta tuon IndexDB:n saisi päälle erikseen, mutta en taida jaksaa penkoa projektia auki ihan tällä sekunnilla
Hyvin täällä toimi vaikka tais alussa tuo disabled -juttu näkyäkin. Selaimena Chrome.
Ihan mukava tietovisa :tup:
 
Liittynyt
23.10.2016
Viestejä
658
Tein tällaisen komentorivillä toimivan pikkuohjelman. Ohjelmalla pystyy ottamaan "kuvan" haluastaan hakemistosta ja tallentamaan sen tiedostona koneelle. Sitä tiedostoa voi sitten verrata jonain toisena hetkenä luotuun tiedostoon. Näin aloittelevani koodarina mielelläni kuulisin kommentteja koodin tasosta. Onko se ihan päin seiniä vai vähän sinne päin?

Jossain vaiheessa voisi varmaan harjoituksen vuoksi muokata tuon OOP-muotoon.

Linkki
 
Liittynyt
19.10.2016
Viestejä
1 563
Tein tällaisen komentorivillä toimivan pikkuohjelman. Ohjelmalla pystyy ottamaan "kuvan" haluastaan hakemistosta ja tallentamaan sen tiedostona koneelle. Sitä tiedostoa voi sitten verrata jonain toisena hetkenä luotuun tiedostoon. Näin aloittelevani koodarina mielelläni kuulisin kommentteja koodin tasosta. Onko se ihan päin seiniä vai vähän sinne päin?

Jossain vaiheessa voisi varmaan harjoituksen vuoksi muokata tuon OOP-muotoon.

Linkki
En ole hirveästi Pythonia käyttänyt enkä kovin tarkkaan katsonut, mutta pääasiassa näytti aika selkeältä. Luultavasti tuota voi parantaa reilustikin, mutta näyttää pikaisen vilkaisun perusteella ihan järkevältä. Code Review on muuten sivusto, jonne voi pistää koodejaan muiden arvosteltavaksi (siis ihan kehitysmielessä - sieltä näyttäisi saavan yleensä hyviä vinkkejä). Säännöt kannattaa varmaan lukaista lähtien ainakin siitä, että tuonne tuskin voi vain linkittää GitHub-repoa, vaan koodit pitää käsittääkseni laittaa suoraan näkyville.
 
Liittynyt
23.10.2016
Viestejä
658
En ole hirveästi Pythonia käyttänyt enkä kovin tarkkaan katsonut, mutta pääasiassa näytti aika selkeältä. Luultavasti tuota voi parantaa reilustikin, mutta näyttää pikaisen vilkaisun perusteella ihan järkevältä. Code Review on muuten sivusto, jonne voi pistää koodejaan muiden arvosteltavaksi (siis ihan kehitysmielessä - sieltä näyttäisi saavan yleensä hyviä vinkkejä). Säännöt kannattaa varmaan lukaista lähtien ainakin siitä, että tuonne tuskin voi vain linkittää GitHub-repoa, vaan koodit pitää käsittääkseni laittaa suoraan näkyville.
Täytyykin tutustua tuohon Code Reviewiin. Ehkä tuonnekin jotain kehtaa postata joku päivä.

Lainasin kirjan kesällä ja tein harjoitukset ja muokkasin spline-nimistä tkinter-harjoitusta. Jos kiinnostaa voit tehdä ohjelmallesi guin tkinterillä. Mielessäni on ollut tehdä(joskus) tiedosto-duplikaattien etsimis-ohjelma, ja ohjelmastasi voisi olla siinä hyötyä.
Olen vähän tuota tkinteriä käyttänyt, mutta en vielä tässä vaiheessa viitsi hirveästi käyttää aikaa guin turaamiseen. Pyrin vaan tekemään paljon erilaisia projekteja tutustuen kirjastoihin.
 
Liittynyt
16.10.2016
Viestejä
543
Tein tällaisen komentorivillä toimivan pikkuohjelman. Ohjelmalla pystyy ottamaan "kuvan" haluastaan hakemistosta ja tallentamaan sen tiedostona koneelle. Sitä tiedostoa voi sitten verrata jonain toisena hetkenä luotuun tiedostoon. Näin aloittelevani koodarina mielelläni kuulisin kommentteja koodin tasosta. Onko se ihan päin seiniä vai vähän sinne päin?

Jossain vaiheessa voisi varmaan harjoituksen vuoksi muokata tuon OOP-muotoon.

Linkki
Suosittelen käyttämään cmd tai click moduuleja komentorivisovelluksille. Koodista yleisesti sanoisin, että liikaa if/else lausekkeita ja liian pitkiä funktioita. Jaa koodia pienempiin osiin ja vältä if/else rakennelmia, varisinkin sisäkkäiset if/elset ovat varma merkki siitä että nyt kannattaa refactoroida. Tee mieluummin kontrollereita (funktioita) joita sitten kutsut vaikka jonkun dictin perusteella, eli avaimena on ehto ja arvona suoritettava funktio.
 
Liittynyt
16.10.2016
Viestejä
543
Kirjoittelin tähän mitä hain takaa. Tein nyt kaikki yhteen objektiin joka kyllä tosielämässä paisuisi tarpeettoman isoksi ja se pitäisi pilkkoa myös osiin. Mutta idea varmaan tulee selväksi. Menun voisi rakentaa myös dynaamisesti controllerista, mutta sitä en nyt tehnyt.

Koodi:
'''App docstring'''

EXIT_NUMBER = 9

MENU = f'''
APP
===
Please type a number and press enter:

1. Do 1
2. Do 2
3. Do 3
{EXIT_NUMBER}. Exit
'''


class Controller:

    @staticmethod
    def execute(user_input):
        controller_name = f'do_{user_input}'
        try:
            controller = getattr(Controller, controller_name)
        except AttributeError:
            return
        controller()

    @staticmethod
    def do_1():
        '''This is a controller for action 1'''
        print('Doing action 1 stuff...')

    @staticmethod
    def do_2():
        '''This is a controller for action 2'''
        print('Doing action 2 stuff...')

    @staticmethod
    def do_3():
        '''This is a controller for action 3'''
        print('Doing action 3 stuff...')

    @staticmethod
    def get_numeric_user_input(user_input=None):
        while not user_input or not user_input.isnumeric():
            user_input = input(MENU)
        return int(user_input)

    @staticmethod
    def run(user_input=0):
        while(user_input != EXIT_NUMBER):
            user_input = Controller.get_numeric_user_input()
            Controller.execute(user_input)


def main():
    Controller.run()

if __name__ == '__main__':
    main()
 
Liittynyt
23.10.2016
Viestejä
658
Kirjoittelin tähän mitä hain takaa. Tein nyt kaikki yhteen objektiin joka kyllä tosielämässä paisuisi tarpeettoman isoksi ja se pitäisi pilkkoa myös osiin. Mutta idea varmaan tulee selväksi. Menun voisi rakentaa myös dynaamisesti controllerista, mutta sitä en nyt tehnyt.

Koodi:
'''App docstring'''

EXIT_NUMBER = 9

MENU = f'''
APP
===
Please type a number and press enter:

1. Do 1
2. Do 2
3. Do 3
{EXIT_NUMBER}. Exit
'''


class Controller:

    @staticmethod
    def execute(user_input):
        controller_name = f'do_{user_input}'
        try:
            controller = getattr(Controller, controller_name)
        except AttributeError:
            return
        controller()

    @staticmethod
    def do_1():
        '''This is a controller for action 1'''
        print('Doing action 1 stuff...')

    @staticmethod
    def do_2():
        '''This is a controller for action 2'''
        print('Doing action 2 stuff...')

    @staticmethod
    def do_3():
        '''This is a controller for action 3'''
        print('Doing action 3 stuff...')

    @staticmethod
    def get_numeric_user_input(user_input=None):
        while not user_input or not user_input.isnumeric():
            user_input = input(MENU)
        return int(user_input)

    @staticmethod
    def run(user_input=0):
        while(user_input != EXIT_NUMBER):
            user_input = Controller.get_numeric_user_input()
            Controller.execute(user_input)


def main():
    Controller.run()

if __name__ == '__main__':
    main()
Täytyy tutustua tähän esimerkkiisi paremmin. En ole tehnyt "controllereita" aiemmin, joten tämä on ihan hyvä harjoitustehtävä. Jos tulee valmista niin postaan päivitetyn koodin tänne. :)

Click-moduulista en ollut koskaan kuullutkaan ja cmd:hen en ole vielä muuten vaan kerennyt perehtyä. Täytyy lisätä myös nuo työlistalle.
 
Liittynyt
21.09.2017
Viestejä
1 024
Oman pelin proto:
itch.io
salasana on testi

klikkaa latauksen jälkeen peliruutuun vielä toisen kerran niin sitten w:llä pieree. Hellävaraiset painallukset suositeltavia :D

Protossa on toistaiseksi vain tuo yksi kenttä. Ei toimi vielä kännykällä oikein. Kertokaahan paljonko saitte pisteitä. :)
 
Liittynyt
23.10.2016
Viestejä
658
Pakko myöntää, että tuolla kontrollerirakenteella dirxray.py:stä tuli huomattavasti selkeämpi. Uppasin päivitetyn version GitHubiin. Täytyy katsoa myös jos tuolle dirxhelper.py:lle osaisi tehdä jotain.

Mietin myös, että miten tuosta MENU:sta saisi dynaamisen, mutta en ainakaan vielä saanut mitään toimivaa aikaan.

Koitin lähteä rakentamaan ratkaisua näin:

Koodi:
funcs = inspect.getmembers(Controller, predicate=inspect.isfunction)
funcs = [func for func in funcs if func[0].startswith('do_')]
Tuosta saisin listan tupleja, joissa ensimmäinen itemi on metodin nimi ja toinen itemi on itse metodi, mutta tästä en osaa edetä toimivaan dynaamiseen menuun. Voisin funktion listata vain metodien nimet for-loopilla, mutta ne eivät ole kovin kuvaavia. Voisinko laittaa jokaiseen metodiin muuttujan, joka tulostuisi menuun tekstinä? En varmaan, koska en pääse siihen käsiksi ajamatta metodia. Taidan olla ihan hakoteilla tämän kanssa.
 
Liittynyt
23.10.2016
Viestejä
658
Oman pelin proto:
itch.io
salasana on testi

klikkaa latauksen jälkeen peliruutuun vielä toisen kerran niin sitten w:llä pieree. Hellävaraiset painallukset suositeltavia :D

Protossa on toistaiseksi vain tuo yksi kenttä. Ei toimi vielä kännykällä oikein. Kertokaahan paljonko saitte pisteitä. :)
4 pistettä oma enkka. Vielä vaikeampi kuin Flappy Bird. :)
 
Liittynyt
16.10.2016
Viestejä
543
Mietin myös, että miten tuosta MENU:sta saisi dynaamisen, mutta en ainakaan vielä saanut mitään toimivaa aikaan.
Laita metodin docstringiksi haluttu kuvaus jolloin sen saa helposti ulos Controller.do_1.__doc__

Koodi:
class Controller:

    @staticmethod
    def do_1():
        '''Selects stuff'''
        pass

    @staticmethod
    def do_2():
        '''Executes stuff'''
        pass

    @staticmethod
    def do_3():
        '''Loads stuff'''
        pass

# listataan kontrollerin metodit ja jos metodin nimi alkaa 'do_' niin siitä muodostetaan osa menua.
# Pythonissa on sisäänrakennettu __doc__ parametri funktioille ja metodeille joilla siitä saadaan docstring ulos string-muodossa
# numero otetaan metodin nimen perästä viimeisestä merkistä [-1] indeksillä

menu_string = "\n".join([f"{method[-1]}. {getattr(Controller, method).__doc__}" for method in dir(Controller) if method.startswith("do_")])

print(menu_string)

# tulostaa:
# 1. Selects stuff
# 2. Executes stuff
# 3. Loads stuff

Mikäli haluaa rakentaa tietueen jossa on numero, selite ja itse funktio samassa rakenteessa täytyy käyttää dict-datatyyppiä jossa avaimena on valittava numero ja arvona toinen dict jonka avaimena taas funktion selite ja arvona itse suoritettva funktio. Tämä menu dict siis saadaan Controller-luokasta myös dynaamisesti hieman muokkaamalla ylläolevaa esimerkkiä.

Koodi:
# huom tämä menu on vain esimerkki datasta. Tämän voi muodostaa Controller-luokasta dynaamisesti.
menu = {
  1: {"Selects stuff": Controller.do_1},
  2: {"Executes stuff": Controller.do_2},
  3: {"Loads stuff": Controller.do_3},
}

# kysytään käyttäjän syötettä ja muutetaan se kokonaisluvuksi int() funktiolla
user_input = int(input(menu_string))

# otetaan menu dict tietueesta käyttäjän valinnanmukainen avain-arvopari
# ja otetaan tuosta parista sen arvo values() metodilla sekä next() funktiolla ja suoritetaan se.
next(method for method in menu[user_input].values())()

Tästä rakenteesta saadaan taas helposti string-muotoinen menu ja käyttäjän input() syötteen perusteella voidaan suorittaa haluttu metodi. Tällöin kaikki kolme: valittava numero, selite ja suoritettava funktio pysyy aina tiukasti yhdessä ja mikä parasta: kaikki on tehty dynaamisesti jolloin menu muokkaantuu automaattisesti jos lisätään uusi metodi Controller-luokkaan.

Mutta jos näiden rakentaminen käy liian työlääksi itselle, kannattaa tosiaan tutustua cmd-moduuliin jossa tämä on jo valmiiksi tehty.
 
Viimeksi muokattu:
Liittynyt
16.10.2016
Viestejä
543
helppous tosin on siltä osin subjektiivista, että itse tavasin tuota menu-stringin muodostus lausetta arviolta 5min.
Tämä on totta, tuo one-liner ei ollut kyllä mikään paras esimerkki. Siksi kirjoittelin siihen ylös vähän mitä se tekee. Paremmin kirjoitettuna se tulisi näin:
Koodi:
menu_string = ""
do_methods = [method for method in dir(Controller) if method.startswith("do_")]
for method_name in do_methods:
    method_selection_number = method_name[-1]
    method_docstring = getattr(Controller, method_name).__doc__
    menu_string += f"{method_selection_number}: {method_docstring}\n"
 
  • Tykkää
Reactions: 111
Liittynyt
23.10.2016
Viestejä
658
Toi getattr on kätevä, en vain tajunnut ensin että siihen pitää lisätä sulut, (), loppuun. Pythonin docs-sivut ei hirveästi sitä painottanut, niin lopputulos oli että yritin kiertää ongelman exec():llä suorittamalla komentoja stringeistä, mutta sekin meni jotenkin pieleen.. Eli jos haluaa suorittaa esim. modulename.method, ja tallessa on halutun metodin nimi stringimuuttujassa a='method' niin se suoriutuu komennolla getattr(modulename, a)(). Toi exec() oli siitä vaikea että se ei palauttanut mitään, mutta keksin sitten sen globals-parametrin, mutta jokin siinä edelleen mätti. Että näin.
Niin siis jos haluat kutsua heti getattr:n palauttaman metodin, niin ne sulut tarvitaan. CCC:n esimerkissä metodi tallennetaan ensin controller-muuttujaan, joka kutsutaan virheenhallinnan jälkeen kutsumalla controller().
 
  • Tykkää
Reactions: 111
Liittynyt
21.01.2017
Viestejä
107
Hjoo. Pitää kai tulla päivitelemään välillä, viime kerrasta on sen verran aikaa että tais olla vielä muron puolella. :D

offgrid.jpg

Askarrellaan siis Stealth/hacking-henkistä 3rd-person peliä Unityllä. Ideana että niiden tavallisten aseiden jne sijaan pelaajan "arsenaalina" on AR-lasit jolla näkee kaiken datan mitä ihmiset ja laitteet jättää ajan mittaan, hahmojen tekstiviestit, NFC-data ovien skannereita käyttäessä jne, ja sitten kasa ohjelmia joilla kaikkea dataa ja laitteita (ja sitä kautta ihmisiä ;) ) voi manipuoloida.



Koko peli on tehty modaaja-ystävälliseksi, valmiin version mukana tulee Unity-projekti omien työkalujen ja ison kasan 3D-malleja jne. kera, ja tuosta projektista voi sittten kätevästi pakata omat kentät AssetBundleksi ja pudottaa pelin kansioihin tai ladata Steam Workshoppiin muiden ihmeteltäväksi. Itseasiassa tetiin homma vielä helpommaksi ja editori yhdistää localhostilla pyörivään peliin suoraan nopeampaa testaamista varten (kätevämpää näin, kun tehdään itse kaikki sisältö samoilla työkaluilla)

Itse tehtävät, keskustelut, hahmojen tekoäly (ainakin raskaampaa laskentaa lukuunottamatta), laitteet, pelihahmon puhelimessa pyörivät ohjelmat jne. pyörivät kaikki omissa Lua-virtuaalikoneissaan ja niiden scriptit löytyvät sitten ihan tekstitiedostoina pelin kansioista niin että kuka tahansa pääsee halutessaan muokkaamana ja säätämään asioita.

Ja häpeämätön syy tähän viestiin on tietty että nyt olis kickstarter käynnissä että saadaan vähän lisäaikaa kehitykseen ja pystytään tekemään jonkunlainen puoli-julkinen beta noiden modaustyökalujen ja Lua-API:n hiomista varten. Tosin moisen rahan ruinaamisen vastapainoksi riivittiin kasaan myös julkinen (ja buginen) demo joka on ilmaiseksi tarjolla Itch.io:ssa. Eli siitä vaan kokeilemaan.

Asiaan kuuluvat linkit:

Omalta osalta ne viimeisimmät päivitykset työhön (demon kanssa tappelun lisäksi) on noiden pelaajan puhelimessa pyörivien appien ja sitä tukevan API:n jne täydellinen uudelleenrakentaminen. Edellisen version teki firmasta jo poistunut koodari ja jossain välissä alkoi käydä selväski että kyseisellä tyypillä ei ollut ihan motivaatio riittänyt tehdä tuota niiden specisen mukaan mistä sovittiin, ja lopputuloksena homma ei sitten tietty toiminut ihan niin kuin olisi pitänyt (Lua-scripti ei oikeasti pystynyt määräämään milloin ohjelma on käynnissä tai ei ole, ja sekalaiset muut jutut ympäri peliä pääsivät itsekseen vaihtelemaan ohjelman ikonia päälle/pois jne ilman että Lua-puoli tiesi asiasta-> lopputuloksena sotkua.) Kyseinen tyyppi on muissa töissä jonkun muun riesana nyt ja ohjelmat toimivat siis pelissä niinkuin oli tarkoituskin. Olis vaan pitänyt heti samaan tien tajuta repiä koko vanha koodi pois ja tehdä alusta asti uusiksi, meni reilu kuukausi hukkaan yrittäessä selvitellä ja muokata sitä vanhaa sotkua toimimana oikein...)

...ja kaikesta päätellen seuraavaksi sitten sama edessä noiden verkkon kytkettyjen laitteiden osalta, ainakin demoa viimeistellessä tuli vastaan muutama juttu jotka eivät toiminut ihan niin kuin olisi tarkoitus. No, ainakin on tuoreena muistissa toimiva arkkitehtuuri tuohon niin noiden korjaaminen tuskin vie mahdottoman pitkään.


(edit: vielä kun osais kirjoittaa ilman että joka toinen sana on typotettu)
 
Viimeksi muokattu:
Liittynyt
16.10.2016
Viestejä
543
Tein näppäinyhdistelmien kuuntelija -ohjelmarungon Pythonilla. Olen tehnyt myös hiiri-makron teko-ohjelman, se löytyy kotisivultani myös. Saa kommentoida. Vaatii pynput-lisämoduulin.
Ihan hauska ohjelma. Enpä ole moiseen edes törmännyt Pythonilla. Jollain C# tuli joskus väsättyä jotain näppäimistö- ja hiiri-input-tunnistimia.

Koodissa häiritsi ehkä turhat kommentit, joka taas viestii yleensä epäselvästä koodista jos asioita joutuu paljon selittämään. Näppäinyhdistelmien ja suoritettavien funktioiden irrallisuus myös häiritsi, sekä yleisesti vaikeasti luettava logiikka any/all funktioineen, indekseineen ja osittain huonoine muuttujanimineen, esim. "current" nimen tilalla voisi olla "pressed_keys" joka taas auttaa ymmärtämään koodia :) Ohjelmassa oli myös pieni bugi joka liittyi näppäimen päästöön joka taisi tyhjentää koko current-setin, eikä vain viimeistä.

Tässä oma versio:

Koodi:
from pynput import keyboard
from pynput.keyboard import Key

COMBINATIONS = (
    {
        "keys": {
            keyboard.Key.shift,
            keyboard.KeyCode(char='a')
        },
        "functions": (
            lambda: function_1(),
        )
    },
    {
        "keys": {
            keyboard.Key.shift,
            keyboard.KeyCode(char='b')
        },
        "functions": (
            lambda: function_2(),
        )
    }
)

QUIT_KEY = Key.esc

pressed_keys = set()


def function_1():
    print("exec 1")


def function_2():
    print("exec 2")


def execute(functions):
    for function in functions:
        function()


def on_press(key):
    if key == QUIT_KEY:
        return False

    pressed_keys.add(key)
    for combo in COMBINATIONS:
        if pressed_keys == combo['keys']:
            execute(combo['functions'])


def on_release(key):
    pressed_keys.discard(key)


def main():
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()

if __name__ == '__main__':
    main()
 
Viimeksi muokattu:
Liittynyt
16.10.2016
Viestejä
543
Totta kyllä, että mun versiossa sitä funktiota toistetaan kun pidetään näppäimiä pohjassa, tosin se saattaa olla myös joskus mitä halutaan. Esim. Ctrl + c/v toimii just noin, että kun kerran kopioit niin voit pastee kun vaan pidät Ctrl + v pohjassa.

Lambda on toiselta nimeltä nimetön funktio jota kannattaa käyttää jos halutaan wrapata jokin yksinkertainen toiminnallisuus (nimettömän) funktion sisälle. Tässä tapauksessa se mahdollistaa suoritettavien funktioiden "function_1" ja "function_2" viittauksen ennen kun niitä on koodissa edes määritelty. Ilman lambdaa tulee NameError. Toinen tapa on määrittää funktiot ensiksi ja vasta sitten viitata niihin ilman suoritusta, esim: {"avain": function_1}, tällöin ei tarvitse käyttää lambdaa ja ei tule NameErroria.

Globaali vakio "COMBINATIONS" on itse asiassa tuple, eli muuttumaton (immutable) lista, joka sisältää dict-olioita joilla on avaimet "keys" sekä "functions". "keys"-Avaimen arvo on setti (eli se vastaa tietotyypiltään "pressed_keys" muuttujaa joka on myös setti). Tästä syystä näitä kahta muuttujaa voidaan verrata keskenään myöhemmin "==" operaattorilla eikä tarvitse käyttää any/all funktioita. "functions"-Avaimen arvo on tuple joka sisältää noita suoritettavia funktioita wräpättynä lambdaan.

combo['keys'] viittaa siis juuri tuohon COMBINATIONS-setin dictin avaimeen jonka arvossa (tietotyypiltään set) on määritelty nuo eri näppäinyhdistelmät.

set-tietotyyppi on samantyyppinen kuin dict, mutta sillä erotuksella, että se sisältää vain avaimia. Tuple-tietotyypissä kannattaa muistaa se juttu, että jos määrität vain yhden objektin sinne niin siellä perässä pitää olla pilkku.

Tämä on itseasiassa aika hyvä pätkä just tutustua noihin Pythonin erilaisiin tietotyyppeihin ja millon mitäkin kannattaa käyttää :)
 
Viimeksi muokattu:
  • Tykkää
Reactions: 111
Liittynyt
30.10.2016
Viestejä
4
Tere! Tehtiin kouluprojektina incremental-peli (mallina Cookie Clicker jne.) ja julkaistiin se Play-kauppaan Egg Crusher. Toteutettiin peli kolmen hengen ryhmässä Unityä käyttäen. Peli on vielä pientä viilausta vailla mutta otan mielelläni palautetta vastaan.

Kiitti!
 
Liittynyt
20.01.2017
Viestejä
178
Tällänen pieni casual peli tuli värkättyä.

https://play.google.com/store/apps/details?id=com.SteamedPoet.MarbleLift

"Tavoitteenasi on saada marmorikuulat alatasolta ylimmälle napauttamalla sivuilla olevia sinisiä hissejä. Pelissä on 10 tasoa ja luonnollisesti vaikeustaso kasvaa tasolta toiselle. Peli vaatii nopeita refleksejä ja havainnointikykyä, sillä et saa jättää kuulia hetkeksikään huomioitta tai saattaa olla liian myöhäistä!"
 
Liittynyt
23.10.2016
Viestejä
658
Tuolla "Pieniä kysymyksiä ohjelmoinnista"-ketjussa joulukuussa mainitsin työn alla olevasta UNO-korttipelistä, mutta en vielä kehdannut laittaa mitään koodia esille. Nyt sain viimeinkin GUI:n valmiiksi, niin laitetaas nyt sitten peli tänne näytille. GitHub.

En ole vieläkään testejä tai virheenhallintaa saanut tehtyä. Alunperin koko peli oli koodattu tekstipohjaiseksi ja aika iso osa pelilogiikasta meni uusiksi GUI:n rakentamisen yhteydessä. En vieläkään ole tyytyväinen lopputulokseen, mutta saa nyt tähän väliin kelvata.

Kuulisin taas mieluusti kritiikkiä kokeneemmilta koodareita, että mihin asioihin kannattaisi kiinnittää enemmän huomiota ja mitä kannattaa parantaa.
 

living_death

★ Still alive ™
Liittynyt
15.11.2016
Viestejä
6 881
@Nigel ei osaa koodata, mutta pitääkö minun asentaa jotain Python juttuja koneelle, että pääsisin testailemaan, tai olisiko mahdollista saada Windows versio joka käynnistyisi suoraan .exe filestä tms?

Pelaan PALJON ja päivittäin Facebook Gameroomista Unoa ja odotan, että joku tekisi joskus myös Skip-BO -pelistä tietokoneversion (pelikortit löytyy kotoa) :)

uno.png
 
Liittynyt
23.10.2016
Viestejä
658
@Nigel ei osaa koodata, mutta pitääkö minun asentaa jotain Python juttuja koneelle, että pääsisin testailemaan, tai olisiko mahdollista saada Windows versio joka käynnistyisi suoraan .exe filestä tms?

Pelaan PALJON ja päivittäin Facebook Gameroomista Unoa ja odotan, että joku tekisi joskus myös Skip-BO -pelistä tietokoneversion (pelikortit löytyy kotoa) :)

Python pitää olla asennettuna, muuten ei toimi. On vissiin olevassa jotain tapoja muuntaa Python-ohjelma .exeksi, mutta en ole perehtynyt. :tdown:
 
Liittynyt
16.10.2016
Viestejä
543
Tuolla "Pieniä kysymyksiä ohjelmoinnista"-ketjussa joulukuussa mainitsin työn alla olevasta UNO-korttipelistä, mutta en vielä kehdannut laittaa mitään koodia esille. Nyt sain viimeinkin GUI:n valmiiksi, niin laitetaas nyt sitten peli tänne näytille. GitHub.

En ole vieläkään testejä tai virheenhallintaa saanut tehtyä. Alunperin koko peli oli koodattu tekstipohjaiseksi ja aika iso osa pelilogiikasta meni uusiksi GUI:n rakentamisen yhteydessä. En vieläkään ole tyytyväinen lopputulokseen, mutta saa nyt tähän väliin kelvata.

Kuulisin taas mieluusti kritiikkiä kokeneemmilta koodareita, että mihin asioihin kannattaisi kiinnittää enemmän huomiota ja mitä kannattaa parantaa.
Mitä pikaisesti katoin koodia niin tuohan näyttää hyvältä :tup: Pieniä juttuja ehkä koodin rakenteessa ja repositoryssä itsessään. Kaipa se konventio on, että pistetään src tai uno_game-kansion alle koodit ja pidetään toi repositoryn juuri readme.md, requirements.txt, Dockerfile, jne. tiedostoissa. Itse laittaisin varmaan UI:n vielä omaan kansioon ja pilkkoisin tuon 1000 riviä omiksi filuiksi sinne. Vähän soomea myös vielä vilisi koodissa vaikka nähtävästi jossain vaiheessa käänsitkin nimet englanniksi :) Itse en kyllä koskaan ole jaksanut tuohon tkinter kirjastoon tutustua koska kaikki on nykyään webissä. Eli jos tuon kääntäisi web-sovellukseksi ja pistäisi johonkin pyörimään niin alkaa olla aika kova paketti!

Tämmöiset hassutukset menee muuten regexillä yhdellä rivillä ;)
Koodi:
    def on_validate(self, P):
        """Validates the player names in the entry widgets.
        The names can have only small or capital letters or numbers.
        Max length of the name is 15 chars.
        """
        valid = "abcdefghijklmnopqrstuvwxyzåäö"
        valid = valid + valid.upper() + "0123456789 "

        if len(P) > 15:
            return False

        for l in P:
            if l not in valid:
                return False
        return True

Koodi:
elif not right and not top and not draw_deck:
Parempi:
Koodi:
elif not any((right, top, draw_deck)):

Minusta tämä on aina parempi jos vaan mahdollista:
Koodi:
mapper = {
    0: lambda frame, player: self.set_horizontal_hand(frame, player),
    1: lambda frame, player: self.set_vertical_hand(frame, player),
    2: lambda frame, player: self.set_vertical_hand(frame, player, right=True),
    3: lambda frame, player: self.set_horizontal_hand(frame, player, top=True)
}
for i, (player, frame) in enumerate(zip(self.controller.game.players,
                                        self.card_frames)):
    mapper[i](frame, player)
...kuin peräkkäiset elif-lauseet:

Koodi:
for i, (player, frame) in enumerate(zip(self.controller.game.players,
                                        self.card_frames)):
    if i == 0:
        self.set_horizontal_hand(frame, player)
    elif i == 1:
        self.set_vertical_hand(frame, player)
    elif i == 2:
        self.set_vertical_hand(frame, player, right=True)
    elif i == 3:
        self.set_horizontal_hand(frame, player, top=True)
 
Viimeksi muokattu:
Liittynyt
23.10.2016
Viestejä
658
Mitä pikaisesti katoin koodia niin tuohan näyttää hyvältä :tup: Pieniä juttuja ehkä koodin rakenteessa ja repositoryssä itsessään. Kaipa se konventio on, että pistetään src tai uno_game-kansion alle koodit ja pidetään toi repositoryn juuri readme.md, requirements.txt, Dockerfile, jne. tiedostoissa. Itse laittaisin varmaan UI:n vielä omaan kansioon ja pilkkoisin tuon 1000 riviä omiksi filuiksi sinne. Vähän soomea myös vielä vilisi koodissa vaikka nähtävästi jossain vaiheessa käänsitkin nimet englanniksi :) Itse en kyllä koskaan ole jaksanut tuohon tkinter kirjastoon tutustua koska kaikki on nykyään webissä. Eli jos tuon kääntäisi web-sovellukseksi ja pistäisi johonkin pyörimään niin alkaa olla aika kova paketti!

Tämmöiset hassutukset menee muuten regexillä yhdellä rivillä ;)
Koodi:
    def on_validate(self, P):
        """Validates the player names in the entry widgets.
        The names can have only small or capital letters or numbers.
        Max length of the name is 15 chars.
        """
        valid = "abcdefghijklmnopqrstuvwxyzåäö"
        valid = valid + valid.upper() + "0123456789 "

        if len(P) > 15:
            return False

        for l in P:
            if l not in valid:
                return False
        return True

Koodi:
elif not right and not top and not draw_deck:
Parempi:
Koodi:
elif not any((right, top, draw_deck)):

Minusta tämä on aina parempi jos vaan mahdollista:
Koodi:
mapper = {
    0: lambda frame, player: self.set_horizontal_hand(frame, player),
    1: lambda frame, player: self.set_vertical_hand(frame, player),
    2: lambda frame, player: self.set_vertical_hand(frame, player, right=True),
    3: lambda frame, player: self.set_horizontal_hand(frame, player, top=True)
}
for i, (player, frame) in enumerate(zip(self.controller.game.players,
                                        self.card_frames)):
    mapper[i](frame, player)
...kuin peräkkäiset elif-lauseet:

Koodi:
for i, (player, frame) in enumerate(zip(self.controller.game.players,
                                        self.card_frames)):
    if i == 0:
        self.set_horizontal_hand(frame, player)
    elif i == 1:
        self.set_vertical_hand(frame, player)
    elif i == 2:
        self.set_vertical_hand(frame, player, right=True)
    elif i == 3:
        self.set_horizontal_hand(frame, player, top=True)
Joo lähdin vääntämään tuota tkinterillä, koska en tähän hätään halunnut opetella uutta ohjelmointikieltä ja tkinteristä oli jo jotain pohjaa ensimmäisen ohjelmointikurssin jäljiltä. En oikeastaan edes tiedä mitä pitää osata, että tuon saisi selaimessa pyörimään. Javascriptin lisäksi mitä tarvitsisi opiskella (frameworkit yms)? Pakko piakkoin siirtyä opiskelemaan noita frontend-asioita jonkinlaiselle tasolle. Flask backendin puolelta on jo tuttu.

Kiitos hyvistä vinkeistä. Otin jo neuvosta väärin ja painoin päivityksen GitHubiin. :) Tosin tuo nimilaatikon validointi ei ole ihan täydellinen, koska ensimmäistä merkkiä ei enää saa deletoitua, jos sen kirjoittaa väärin. Varmaan aika simppeli korjata. Täytyy perehtyä myohemmin.

Noista elif-lauseista olen samaa mieltä. Niitten kanssa aika nopeasti koodista tulee vaikeaselkoista. Äkkiseltään tuota mapper-tekniikkaan voi käyttää muutamassa muussakin kohtaa.
 
Liittynyt
16.10.2016
Viestejä
543
En oikeastaan edes tiedä mitä pitää osata, että tuon saisi selaimessa pyörimään. Javascriptin lisäksi mitä tarvitsisi opiskella (frameworkit yms)?
HTML, CSS ja Javascript, sillähän se alkaa selaimessa pyörimään. Itse ainakin tykkään Vue.js frameworkistä. Tosin tietty Javascript pitää olla hallussa ennen kun noihin lähtee. Varsinkin kannattaa noi uusimmat JS:n ominaisuudet omaksua. Btw. laita noi UI ja cards kansiot myös sinne src-kansion alle :)
 
Liittynyt
23.10.2016
Viestejä
658
HTML, CSS ja Javascript, sillähän se alkaa selaimessa pyörimään. Itse ainakin tykkään Vue.js frameworkistä. Tosin tietty Javascript pitää olla hallussa ennen kun noihin lähtee. Varsinkin kannattaa noi uusimmat JS:n ominaisuudet omaksua. Btw. laita noi UI ja cards kansiot myös sinne src-kansion alle :)
Hieroin nyt nuokin asiat kuntoon.

Täytyy varmaan katsastaa tuo Helsingin yliopiston Full Stack Open 2019. Näyttää alkavan 15.3.
 
Liittynyt
18.10.2016
Viestejä
272
Pelaan PALJON ja päivittäin Facebook Gameroomista Unoa ja odotan, että joku tekisi joskus myös Skip-BO -pelistä tietokoneversion (pelikortit löytyy kotoa) :)
Mulla on ollut Skip-bo pitkään TODO-listalla. Alunperin lähdin tekemään sitä MSN Messengerille (JavaScriptillä). Mutta se projekti jäi kesken, kun nuo Messenger-pelit eivät silloin oikein lähteneetkään lentoon.

Ajattelin tänään aloittaa sen puuhastelemisen mobiiliin React Nativella. Raportoin tänne projektin etenemistä, mikäli saan sen potkaistua käyntiin.

Onko tässä vaiheessa asioita, joita kannattaisi ottaa huomioon peliä tehdessä? Ajattelin tehdä toteutuksen, jossa 2 - 4 pelaajaa vastakkain standardi-säännöillä ja ilmavalla käyttöliittymällä.

Mitenköhän Hasbro suhtautuu tähän - toisin sanoen onko heillä jokin yksinoikeus peliin?
 
Liittynyt
18.10.2016
Viestejä
272
Kirjoittelin eilen ~300 riviä koodia hahmotellakseni tuota skip-boa. Eli tein pöydän, hahmon/hahmot ja kortit sekä perusanimointi / interaktio korttia painettaessa.

Heti ensimmäisenä piti miettiä, että mennäänkö portraitilla vai landscapella. Ensi alkuun landscape tuntuu intuitiivisemmalta, mutta itse asiassa tila loppuu luultavimmin kesken landscapessa. Näkyvillä pitää kuitenkin olla vihun pakat, keskipakka, omat pakat sekä kädessä olevat kortit, eli neljä "kerrosta" tavaraa. Toki jollain käyttöliittymäratkaisuilla voisi noita laittaa päällekäin / jonkin erillistoiminnon taakse. Mutta aloittelen kuitenkin portraitissa.

Ensimmäisen illan hahmotteluna siis lopputuloksena tällainen raakile :D

skipbo-initial.jpg
 

living_death

★ Still alive ™
Liittynyt
15.11.2016
Viestejä
6 881
Landscape tietenkin, kun kortteja on niin paljon pelatessa.

Tuleeko Windows versiota? Itse en jaksa pelailla mitään kännykällä / tabletilla.
 
Liittynyt
23.10.2016
Viestejä
658
On ollut vähän takkuista päästä alkuun JavaScriptin kanssa. Piti vähän opiskella myös HTML:ää ja CSS:ää, koska muuten materiaalien seuraamisesta ei oikein tullut mitään. On muuten huomattavasti vaikeampi löytää hyvää ja johdonmukaista opiskelumateriaali JavaScriptille kuin Pythonille. Aloittelin tänään ensimmäistä omaa JavaScript-projektia. Laitoin sen Fiddleen jos jotain kiinnostaa.
 
Liittynyt
21.09.2017
Viestejä
1 024
Seuraava proto:

itch.io
salasana 42nena

jonkunlainen fysiikkamalli siinä on ja f-zerosta pöllitty rata.
Nyt tarvii vain tehdä omat radat, äänet, AI ajelijat, aikalaskurit ja no tuota yleensäkin se peli vielä tosta puuttuu :)
pelin ikkunaan pitää ensin klikata ennenkuin kontrollit toimii
wasd tai nuolet.
r napilla resetoi jos onnistuit löytämään bugin tai jotain
 
Liittynyt
01.12.2016
Viestejä
39
Vuoropohjainen rpg/roguelike tiiligrafiikalla:
Zorbus

Pelikuvia:
Zorbus

Perinteistä luolaholvin komppausta D&D-henkisessä ympäristössä. Ainakin yksi pelaaja on jo pelin läpi pelannut.
 
Liittynyt
21.09.2017
Viestejä
1 024
Pierupeliä päivittelin

uutta:
-uusia assetteja humble bundlesta
-putkien paikat pystysuunnassa arvotaan
-pelaaja ei liiku sivusuunnassa vaan kenttä kulkee (piilossa) liukuhihnalla pelaajan ympäri
-high score tallentuu lokaalisti
-peli nykii ja paukkuu (hups)

edit: päivitin pelin niin että nyt sen ei pitäisi nykiä ja tökkiä kuten ennen. (fysiikka päivittyy nyt 50 kertaa sekunnissa 60 sekunnin sijaan jolloin jostain syystä se synkkaa kaiketi paremmin näytön virkistystaajuuteen joka kuitenkin on 60Hz. En ihan ymmärrä miksi tämä toimii paremmin mutta toimiipahan vaan :). Liikkuvat jutut eivät enää stutteroi ainakaan niin pahasti kuin ennen )

edit2: mutta nyt jostain syystä törmäystarkistus toimii vasta ekan resetin jälkeen oikein... öööö...

edit3:
hakkasin päätä seinään että miten tää korjataan...

no näin:

Koodi:
void Start()
{
   rb = GetComponent<Rigidbody> ();
   rb.gameObject.SetActive (false);
   rb.gameObject.SetActive (true);
}
Nyt sitte toimii, huippujärkevää
edit4: lisätty valikko.
 
Viimeksi muokattu:
Liittynyt
21.09.2017
Viestejä
1 024
Koska peli olisi hyvä tehdä myös macille ja linuxille sopivaksi niin tänään olisi tarkoitus asentaa linux ja testata miten unity kehitys linuxille onnistuu. Manjaro image tuli tossa ladattua...
Sitten pitäisi opiskella popiskella että miten steamiin saadaan achievementit omalle pelille jos nyt meinaan jossain vaiheessa pelin laittaa steamiin :)
En kyllä tiiä ostaako sitä kukaan mutta kivahan se ois laittaa cv:hen että tämmösen kikkareen oon julkassu steamissä :D
Nykyäänhän siellä voi julkasta mitä hyvänsä paskaa kunhan ei laittomuuksia ole joten miksikäs ei. Kokemus kai siitäki tulee :)
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
22 120
Koska peli olisi hyvä tehdä myös macille ja linuxille sopivaksi niin tänään olisi tarkoitus asentaa linux ja testata miten unity kehitys linuxille onnistuu. Manjaro image tuli tossa ladattua...
Sitten pitäisi opiskella popiskella että miten steamiin saadaan achievementit omalle pelille jos nyt meinaan jossain vaiheessa pelin laittaa steamiin :)
En kyllä tiiä ostaako sitä kukaan mutta kivahan se ois laittaa cv:hen että tämmösen kikkareen oon julkassu steamissä :D
Nykyäänhän siellä voi julkasta mitä hyvänsä paskaa kunhan ei laittomuuksia ole joten miksikäs ei. Kokemus kai siitäki tulee :)
Unity tukee ristiinkääntämistä, niin voit ihan Windowsilla tai niiden build servereillä kääntää sen Mac OS X:lle ja Linuxille. Melkein jos uskaltaa laittaa CV:hen, että "creator of Farty McFartface", uskaltaa suoraan luottaa siihen, että Unityn buildit toimii kaikilla alustoilla sellaisenaan.
 
Liittynyt
21.09.2017
Viestejä
1 024
Nyt olen oppinut senkin että ekaksi Linux distroksi devaamiseen ei välttämättä kannatakaan valita Arch Linuxia, tuota distrojen dwarf fortressia
 
Liittynyt
21.09.2017
Viestejä
1 024
Seuraava peli sitte Godotilla kaiketi. Siinä voi sitte pudotella pommeja
 
Liittynyt
21.09.2017
Viestejä
1 024
Pari tyyppiä nyt testaillut vielä tuota peliä ja on se vaan liian vaikea. Mutta sitten jos siitä tekee helpon niin se on välittömästi tylsä. Ei tästä taida saada sopivaa. Taidan välillä säätää jotain muuta projektia.
 
Viimeksi muokattu:
Liittynyt
17.10.2016
Viestejä
14 715
Pari tyyppiä nyt testaillut vielä tuota peliä ja on se vaan liian vaikea. Mutta sitten jos siitä tekee helpon niin se on välittömästi tylsä. Ei tästä taida saada sopivaa. Taidan välillä säätää jotain muuta projektia.
Tällaisissakin peleissä toimii tasaisesti kasvava vaikeustaso. Alussa pylväiden väli (siis aukon koko) on iso ja niiden keskikohta ei vaihtele suuresti. Teet siis näistä pelaajan x-koordinaatin/ajan funktion. Ja tuunaat sitä niin kauan että pelaaminen on mielekästä. Nyt ei ole.
 
Liittynyt
17.10.2016
Viestejä
22 120
Pari tyyppiä nyt testaillut vielä tuota peliä ja on se vaan liian vaikea. Mutta sitten jos siitä tekee helpon niin se on välittömästi tylsä. Ei tästä taida saada sopivaa. Taidan välillä säätää jotain muuta projektia.
Älä luovuta! Vaikka se olisi ihan kakka, niin se on valmis tuotos ja siitä suunta on vaan ylöspäin! Tee vaikka siitä über-vaikea ja rahasta sillä Souls-viballa.

Itsellä on miljoona keskeneräistä projektia. Älä ole niinkuin minä. Suosittelen unohtamaan muiden negatiiviset mielipiteet ja tekemään sellaisen pelin, joka kelpaa itselle. Otat muilta vaan lisätöitä ja pelin laajuus kasvaa ja sitten ei taas tule ikinä valmista.
 
Liittynyt
21.09.2017
Viestejä
1 024
Huomasin tossa sellaisenkin bugin että pelin fysiikat toimii vain jos peli pyörii 60fps. Sanotaan että vaikka thrustinappi on jatkuvasti pohjassa ja peli pyörii täydellä 60fps vauhdilla niin silloin lähdetään kiihtymään ylöspäin. Mutta, jos peli pyöriikin vaikka vain 30 fps... ja tämän tilanteen saa helposti aikaan vaikkapa kaappaamalla pelikuvaa frapsilla 4k resoluutiolla samaan aikaan kun pelaa... niin silloin samassa tilanteessa thrustin painaminen vain hidastaa painovoiman vaikutusta eli ukkeli vain leijailee alaspäin vähän hitaammin kuin jos nappia ei painettaisi. Eli ylöspäin voimaa annetaan vain silloin kun joka frame on saatu piirrettyä/laskettua mutta painovoima vaikuttaa tasaisesti ja koko ajan suorituskyvystä riippumatta. Toi on aika fataalia ja pitäisi kyllä saada jotenkin korjattua. Pelin pitäisi toimia sentään loogisesti.

edit: Yksi hauska ja jatkuva teema tuntuu olevan että tulee vastaan joku tällainen isolta tuntuva ongelma mutta hetken kun asiaa miettii niin tajuaa että tämä sama ongelma on täytynyt olla jo jollain muulla aiemmin ja se on varmasti jo ratkaistu. Niin vaikuttaisi olevan nytkin:
https://forum.unity.com/threads/addforce-values-vary-with-framerate.396204/
 
Viimeksi muokattu:
Toggle Sidebar

Uusimmat viestit

Statistiikka

Viestiketjut
240 413
Viestejä
4 198 313
Jäsenet
70 904
Uusin jäsen
yayko8787

Hinta.fi

Ylös Bottom