Puolen tunnin Asteroids-haaste

Muu yhteisön välinen keskustelu.
Post Reply
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Puolen tunnin Asteroids-haaste

Post by KilledWhale »

Esipuhe

Jonkin aikaa sitten törmäsin YouTubessa HandmadeCon 2015:ssa olleeseen haastatteluun (https://youtu.be/qWJpI2adCcs?t=3455) jossa Mike Acton mainitsi keskustelun lomassa, että hänen mielestään peliohjelmoijat eivät harjoittele tarpeeksi ja esitti yhtenä kiireisille ihmisille sopivana harjoitusmetodina seuraavanlaista: Valitse jokin kiinnostava ongelma ja koita ratkaista kyseinen ongelma 30 minuutissa. Tämän jälkeen (esim. seuraavana päivänä) koita ratkaista sama ongelma uudelleen 30 minuutissa aloittaen alusta, tuomatta mitään edellisessä sessiossa tuotettua mukana uuteen yritykseen.

Haastattelussa esimerkkinä käytettiin Asteroids-peliä ja tästä intoutuneena päädyin kesälomaillessa kokeilemaan Asteroidsin toteutusta CoolBasicilla 30 minuutissa (esimerkkisuoritus myöhemmässä viestissä) ja totesin tämän olevan sen mukavaa pientä puuhastelua, että haastan muutkin kokeilemaan samaa jos nyt joku sattuu vielä foorumeille eksymään. Itse käytin CoolBasiciin lähinnä sen kitkattomuuden vuoksi, mutta koska CB on jokseenkin kuollut (:cry:) ajattelin, että tekniikka voisi kuitenkin olla vapaa, eli muutkin kielet/pelimoottorit/työkalut sallittaan.

Tehtävä

Toteuta Asteroids-peli 30 minuutissa.

Image

Video: https://www.youtube.com/watch?v=9Ydu8UhIjeU
Wikipediassa Asteroidsia kuvaillaan seuraavasti:
Pelissä pelaaja voi liikuttaa alustaan kaikkiin suuntiin varoen ja tuhoten samalla asteroideja. Tarkoituksena on pisteiden keruu ja elossa säilyminen mahdollisimman kauan. 10 000:n pisteen välein pelaaja saa uuden aluksen. Peli on ohi, kun pelaajalla ei enää ole aluksia käytettävänään.
Englanninkielisestä wikipediasta löytyy hieman kattavampi kuvaus:
The objective of Asteroids is to destroy asteroids and saucers. The player controls a triangular ship that can rotate left and right, fire shots straight forward, and thrust forward. Once the ship begins moving in a direction, it will continue in that direction for a time without player intervention unless the player applies thrust in a different direction. The ship eventually comes to a stop when not thrusting. The player can also send the ship into hyperspace, causing it to disappear and reappear in a random location on the screen, at the risk of self-destructing or appearing on top of an asteroid.

Each level starts with a few large asteroids drifting in various directions on the screen. Objects wrap around screen edges – for instance, an asteroid that drifts off the top edge of the screen reappears at the bottom and continues moving in the same direction. As the player shoots asteroids, they break into smaller asteroids that move faster and are more difficult to hit. Smaller asteroids are also worth more points. Two flying saucers appear periodically on the screen; the "big saucer" shoots randomly and poorly, while the "small saucer" fires frequently at the ship. After reaching a score of 40,000, only the small saucer appears. As the player's score increases, the angle range of the shots from the small saucer diminishes until the saucer fires extremely accurately. Once the screen has been cleared of all asteroids and flying saucers, a new set of large asteroids appears, thus starting the next level. The game gets harder as the number of asteroids increases until after the score reaches a range between 40,000 and 60,000. The player starts with 3–5 lives upon game start and gains an extra life per 10,000 points. Play continues to the last ship lost, which ends the game. Machine "turns over" at 99,990 points, which is the maximum high score that can be achieved.
Säännöt
  • Jokaisessa yrityksessä tiukka 30-minuutin aikaraja, kellon pysäyttäminen windows päivitysten yms. vuoksi ei ole sallittua.
  • Voit tehdä oman tulkintasi Asteroidsista eli grafiikoilla ja säännöillä kikkailu on sallittua.
  • Voit käyttää haluaamasi kieltä/engineä/työkaluja (Vinkki: CoolBasic sopii tähän erittäin hyvin ;))
  • Voit yrittää ratkaisua niin monta kertaa kuin haluat, mutta joka kerralla on aloitettava alusta.
  • Koska haasteen pääpaino on ohjelmoinnissa, grafiikoiden ja äänien uusiokäyttö on sallittua.
  • Tavoitteena ennen kaikkea ongelmanratkaisussa kehittyminen, itsensä haastaminen ja hauskanpito :P
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: Puolen tunnin Asteroids-haaste

Post by KilledWhale »

Ensimmäinen yritys:

Ominaisuudet:
  • Satunnaisen kokoisia ja mallisia asteroideja jotka liikkuvat satunnaisiin suuntiin mutta eivät looppaa poistuessaan ruudulta
  • Keskellä ruutua paikallaan törröttävä pelaaja
Mitä opin (tai opin uudelleen :lol:)?:
  • Tyyppien sisällä ei voi olla taulukoita :x
  • Tyyppimuuttujat esitellään jostain syystä Field avainsanalla Dim-avainsanan sijaan
  • Rnd() ja Rand() ovat eri nimillä
  • Aluksen muodostamiseen matematiikalla meni pari yritystä
  • DirectPlay puuttui ja koneen uudelleenkäynnistys vei aikaa...
Kuva:
Image
Toinen yritys:

Ominaisuudet (edellisten lisäksi):
  • Asteroidit looppaavat kauniisti ruudun reunoja ylittäessään (eivät teleporttaa tökerösti kuten esimerkkivideon Asteroidsissa)
  • Pelaaja voi ohjata alusta, joka looppaa asteroidien kaltaisesti reunoja ylittäessään
  • Panosten luominen ~toimii, mutta panoksia ei piirretä tai käsitellä muutenkaan
Mitä opin?:
  • Pitkien nimien kirjoittamiseen tuhrautuu arvokkaita sekunteja
  • Vakioiden kirjoittamiseen (ruudun leveys ja korkeus yms.) kuluu arvokkaita sekunteja
  • As Float, As Integer jne. kirjoittaminen syö aikaa
  • Asteroidien kokotaulukoista pääsisi eroon tallentamalla satunnaisuudelle siemenluvun per asteroidi ja tällä säästyy ehkä kirjoitusaikaa
  • Helppo ruudun yli wrappaus onnistuu piirtämällä sama asteroidi useaan kertaan offsetattuna ruudun koolla
Kuva:
Image
Kolmas yritys:
Ominaisuudet (edellisten lisäksi):
  • Pelaaja voi ampua panoksia pitämällä pohjassa välilyöntiä
  • Panokset piirrtyvät ja looppaavat asteroidien ja pelaajan tapaan
  • Panoksilla voi tuhota asteroideja (etäisyyspohjainen tarkistus) jotka tuhoutuessaan hajoavat kahdeksi pienemmäksi asteroidiksi
Mitä opin?:
  • Looppauskoodin kirjoittaminen on itseääntoistavaa ja aikaa vievää (ts. asioita pitää funktioida seuraavalla kerralla agressiivisemmin)
  • Uusien asteroidien luontikoodi pitäisi myös funktioida...
  • For Each loopissa asioiden deletointi on turvallista :shock: (yllättää positiivisesti useamman vuoden C++/C# ohjelmoinnin jälkeen)
  • Ympyräpohjainen törmäystarkistus vaikuttaa pikaisella katsauksella riittävän hyvältä
Kuva:
Image
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Puolen tunnin Asteroids-haaste

Post by valscion »

Onpas mielenkiintoinen haaste ja mielenkiintoinen koonti omista iteraatioista! Kiitos siitä :)
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Post Reply