login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Ruby] Tetris

Offline Fenrir - 02/10/2005 21:43 (laatste wijziging 02/10/2005 21:45)
Avatar van FenrirPHP expert Ik maak een tetris-spel in Ruby. Het lukt al aardig, maar ik heb 1 probleem. Het is zo dat als je een hele rij vol hebt (horizontaal) dat die dan verdwijnt, en dat de rijen erboven dan naar beneden vallen. Dit lukt allemaal, maar soms krijg je dan rare dingen:

  1. +
  2. + + + + + +
  3. + + + + + + +


Nu zweeft dat blokje in de lucht. Eigenlijk zou die omlaag moeten vallen. Maar hoe maak ik een functie die dat laat gebeuren? Ik sla de blokjes in een 1 dimensionale array op. Ieder blockje is een object met class "Block". Deze class heeft een x en een y positie. Dus bijv:
block.x = 10
block.y = 7

En zo'n dingen zitten in mijn array.
Nu moet ik dus iets zien te maken dat ervoor zorgt dat alle "zwevende" blokjes naar beneden gaan. Je zou dus voor elk blokje moeten nagaan of hij links/rechts/beneden zich nog een blokje heeft, en zo nee moet hij naar beneden vallen. Het probleem is nu dat als er 2 blokjes naast elkaar in de lucht zweven ze niet naar beneden vallen. Hoe maak ik het zo dat ook blokjes die samen zweven naar beneden vallen?

Als je geen Rubt kent is dat geen probleem. Je kunt ook uitleggen hoe je het precies moet doen, dan maak ik er zelf code van.

Alvast bedankt,
Fenrir

6 antwoorden

Gesponsorde links
Offline nemesiskoen - 02/10/2005 21:58
Avatar van nemesiskoen Gouden medaille

PHP expert
Ik kan geen ruby, maar zal met een 'fictieve' programmeertaal uitleggen hoe ik het zou doen.

kan zijn dat ik je verkeerd heb begrepen want het lijkt simpel (in theorie) vandaar...

  1. class objBlock {
  2. }
  3. class block extends objBlock {
  4. //hier de block class
  5. }
  6.  
  7. boolean isBlockOnder(block) {
  8. blocks[] = new objBlock {block};
  9. for(i=0;i<length(blocks);i++) {
  10. if(blocks[i].y == block.y-1) {
  11. return false;
  12. }
  13. }
  14. return true;
  15. }
  16.  
  17. if(isBlockOnder(huidigeBlock)) {
  18. huidigeBlock.y -= 1;
  19. }


Zoiets ongeveer... zo zou het toch volgens het principe van java moeten werken.
Offline Fenrir - 02/10/2005 22:04 (laatste wijziging 02/10/2005 22:07)
Avatar van Fenrir PHP expert Ja, dat dacht ik eerst ook, maar dat klopt niet helemaal. Want wat als het zo zit:

  1. XXX
  2. XXXXXX


Onder die blokken zit geen ander blokje, maar toch moeten ze niet naar beneden vallen omdat ze vastgehouden worden door het blokje ernaast. En het meest linkse blokje van de 3 wordt gesteund door de onderste rij. Ik denk dat ik een recursieve functie maak die nagaat welke blokjes er allemaal aan elkaar vast zitten (dus welke groepen er zijn), en als er een losse groep is die nog niet beneden (wordt bijgehouden door bool heeft_steun oid) is dan moet die losse groep naar beneden.
Offline nemesiskoen - 02/10/2005 22:39 (laatste wijziging 02/10/2005 23:04)
Avatar van nemesiskoen Gouden medaille

PHP expert
Ja, je kan zoiets doen.

  1. boolean isBlockNaast(block) {
  2. global blo;
  3. for(i=0;i<length(blo);i++) {
  4. if(blo[i].x == block.x-1 || blo[i].x == block.x+1) {
  5. return true;
  6. }
  7. }
  8. return false;
  9. }
  10. boolean isBlockOnder(block) {
  11. global blo;
  12. for(i=0;i<length(blo);i++) {
  13. if(blo[i].y == block.y-1) {
  14. return false;
  15. }
  16. }
  17. if(isBlockNaast(block)) {
  18. block bl = new block(block.x-1,block.y); //block namaken
  19. block bl2 = new block(block.x+1,block.y); //block namaken
  20. return ((isBlockOnder(bl) === true) || (isBlockOnder(bl2) === true));
  21. }
  22. return true;
  23. }
  24. i=0;
  25. //elke keer als je een block aanmaakt: een teller setten
  26. block blo[i++] = new block(/*x en y coordinaat*/);
  27. if(isBlockOnder(huidigeBlock)) {
  28. huidigeBlock.y -= 1;
  29. }
Offline XenoX - 03/10/2005 15:00
Avatar van XenoX Gouden medailleGouden medaille

PHP expert
Bij tetris zijn er toch gewoon vliegende blokjes .. ?
Offline ReneeJ - 03/10/2005 15:34
Avatar van ReneeJ HTML interesse ja dat lijkt mij ook. als je toch een recht ding van drie blokjes hebt kunnen er niet 2 vallen en 1 blijven hangen:o
Offline Fenrir - 03/10/2005 15:40
Avatar van Fenrir PHP expert @XenoX: Nee, een blokje kan nooit helemaal vliegen, behalve het blokje dat nog naar beneden aan het vallen is.

@nemesiskoen: Ja, zoiets ga ik gebruiken. Maar dan moet het van alle blokjes bijhouden of ze steun hebben, anders moet je het voor ieder blokje apart gaan doen, bijv:

XX
XXXXX XX

Hierbij ga je eerst het meest links-onder blokje controleren. Alle blokjes die onderaan liggen hebben sowieso steun (van de bodem). Dus alle blokjes die hieraan vastzitten ook. Nu ga je dus langs alle blokjes die hieraan vastzitten, en zet je:
block.steun = true

Dat doe je voor alle blokjes op de onderste rij (alle blokjes die aan elkaar vastzitten op deze rij hoef je maar 1 keer te doen omdat block.steun dan al op true staat, de meest-rechtse 2 blokjes moet je dus wel nog apart doen).

Daarna ga je bij alle blokjes kijken of steun op true staat, en als dat niet zo is zet je block.y += 1. En voor alle blokjes: block.steun = false. Nu doe je dit nog een keer totdat alle blokjes steun hebben.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.194s