Archief - Java - Tetris

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

michel39

Legacy Member
Hallo allemaal,

Ik ben al een tijdje voor school bezig in het programma Netbeans. Ik heb besloten het spel Tetris te maken, alleen ik blijf vastlopen en ik heb het gevoel dat ik dit nooit af krijg.

Ik heb gezorgd dat er blokjes spawnen zodra er een blokje beneden is, maar dat blokje kan maar opgestapelt worden tot een zekere hoogte.

Verder ben ik dus gestart met het spawnen van blokjes ipv figuren omdat dit vrij lastig is.

Ik zal de code plakken in een spoiler en hopelijk kunnen jullie me verder helpen.

package javaapplication2;
import com.sun.imageio.plugins.jpeg.JPEGImageReader;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.image.BufferedImage.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Graphics.*;

public class JavaApplication2 extends Applet implements ActionListener, KeyListener{

int y = 1;
int x = 5;
Thread Puls;
private Image Roodblokje;
int[][] anArray;

Font f = new Font("Arial", Font.BOLD, 20);

Graphics buffergraphics;
Image offscreen;
Dimension dim;


public void init(){

addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);

Roodblokje = getImage(getDocumentBase(),"4 Blokjes in vierkant.png");

setSize(1010,907);
dim=getSize();
Thread Puls = new Thread(PulsUitvoer);
offscreen=createImage(dim.width,dim.height);
buffergraphics=offscreen.getGraphics();

anArray = new int[10][20];
for (int i=0; i<10; i++ ){
for (int j=1; j<20; j++ ){
anArray[j]=0;
}
}
anArray[x][y]=1;
Puls.start();
}

Runnable PulsUitvoer = new Runnable(){


public void run(){
int x2,y2;
while (true){
try {
x2 = x;
y2 = y+1;
if ( y2<19) {
if ( anArray[x2][y2]==0){
System.out.println(x2 + " array " + y2 );
anArray[x][y]=0;
anArray[x2][y2]=1;
y++;

}
}

else {
System.out.println("debug1");
anArray[x2][y2]=2;
anArray[5][1]=1;
x=5;
y=1;
}
repaint();
Puls.sleep(500);
} catch (InterruptedException ex) {
}
}
}
};


public void paint (Graphics g){

dim=getSize();
buffergraphics.clearRect(0, 0, dim.width, dim.height);

//Tekstopmaak
buffergraphics.setFont(f);

//Lijn om vierkant
buffergraphics.setColor(Color.black);
buffergraphics.fillRect (0, 0, 457, 907);

//Achtergrond binnen vierkant
buffergraphics.setColor(Color.gray);
buffergraphics.fillRect (0, 5, 452, 897);

//Scoreboard rand
buffergraphics.setColor(Color.black);
buffergraphics.fillRect (510, 400, 500, 507);

//Scoreboard zijkant
buffergraphics.setColor(Color.gray);
buffergraphics.fillRect (515, 405, 490, 497);

//Next blokje rand
buffergraphics.setColor(Color.black);
buffergraphics.fillRect(510, 0, 500, 360);

//Next blokje vierkant
buffergraphics.setColor(Color.gray);
buffergraphics.fillRect (515, 5, 490, 350);

//Tekst in next blokje vak
buffergraphics.setColor(Color.black);
buffergraphics.drawString("Next Block:", 720, 30);

//Tekst in score vak
buffergraphics.setColor(Color.black);
buffergraphics.drawString("Score:", 735, 430);

for (int i=0; i<10; i++ ){
for (int j=1; j<20; j++ ){
if(anArray[j]==1){
buffergraphics.drawImage(Roodblokje, i*45, j*45, this);

}
if(anArray[j]==2){
buffergraphics.drawImage(Roodblokje, i*45, j*45, this);

}


}
}
g.drawImage(offscreen, 0,0, this);
}

public void update (Graphics g){
paint(g);
}


public void actionPerformed(ActionEvent e) {
repaint();

}


public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();

if (code == KeyEvent.VK_DOWN){
anArray[x][50]=2;
anArray[x][y]=0;
x=5;
y=1;
anArray[x][y]=1;
}
if (code == KeyEvent.VK_RIGHT && x<9){
anArray[x][y]=0;
x++;
anArray[x][y]=1;
}
if (code == KeyEvent.VK_LEFT && x>0){
anArray[x][y]=0;
x--;
anArray[x][y]=1;
}

repaint();


}


public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}

private void maakTraceMogelijk() {
throw new UnsupportedOperationException("Not yet implemented");

}

}



Alvast vriendelijk bedankt!

Met vriendelijke groeten,

Michel.

blackrabbit

Legacy Member
Je kan ook je code gewoon plakken in code-tags hoor ;-)


Code is nu moeilijk leesbaar, maar voor zover ik kan zien heb je toch nog wat dingen te doen.
Collision-detection bvb. Implementeer dat (deftig) en je hebt geen problemen meer met de verschillende soorten blokken.

Verder: MVC patroon.

michel39

Legacy Member
Bedankt dat je snel gereageert hebt. Heb je toevallig een stukje code wat ik kan invoegen?

blackrabbit

Legacy Member
Ik denk niet dat dat de bedoeling is..

Maar vermits je met een OO-taal bezig bent: gebruik eens wat meer classes om je code te abstraheren. Het gaat dan vooral voor jezelf véél duidelijk worden hoe je wat moet aanpakken.

michel39

Legacy Member
Ik ben een 'noob' in java want begin net met dit onderwerp. Ik blijf vastlopen omdat de stukken codes die ik typ vaak niet willen werken. Dan haal ik het weer weg en ben ik weer terug bij af. Zo gaat het nu al een lange tijd door.

Zijn er toevallig mensen die wat meer specifieke uitleg kunnen geven met voorbeelden en/of stukjes codes die kunnen zorgen dat mijn Tetris spel iets verder komt.

blackrabbit

Legacy Member
Dat rijmt niet helemaal met dit dan he:
Ik ben al een tijdje voor school bezig in het programma Netbeans. Ik heb besloten het spel Tetris te maken, alleen ik blijf vastlopen en ik heb het gevoel dat ik dit nooit af krijg.


Als je voorbeelden wil, die kan je wel vinden op het Net. Ik heb de indruk dat je graag een kant-en-klare oplossing wil, maar daar ga je weinig uit leren IMHO.

Je zegt dat je nu vaak moet herbeginnen omdat je 'vastloopt'. Wel, dat is vrij normaal als je net begint met programmeren. Het is deel van het leerproces & maakt sowieso deel uit van het (serieuzere) programmeerwerk.

Misschien wil je ook meteen een te moeilijk programma schrijven (ook al is het leuk om spelletjes te maken, natuurlijk).

In ieder geval, je code ontbreekt aan OO-abstracties. Begin bvb met het abstraheren van uw 'playfield' (noem het gerust een klasse 'Playfield'), die het 'laten zakken' en het 'detecteren van collisions' op zich neemt. Ontwerp eveneens een klasse 'Block' die op een handige wijze een blokje kan beschrijven.

Verder kan je best ook leren van je aan coding conventions te houden. Namen van variabelen zouden bvb met een kleine letter moeten beginnen, ipv een hoofdletter.

michel39

Legacy Member
Bedankt voor dit bericht. Ik snap wat je bedoeld betreft het leerproces, maar mensen leren wanneer er iets voor ze gedaan wordt. Dan blijft het vaak in je hoofd steken en weet je het voor een volgende keer wel. Daarom vroeg ik om een aantal voorbeelden, dan weet ik dat niet alleen voor nu maar ook voor later.

Recipe4hate

Legacy Member
michel39 zei:
maar mensen leren wanneer er iets voor ze gedaan wordt.

Niet akkoord. Mensen leren door te doen, fouten te maken, op te zoeken hoe het beter kan, dit te implementeren en dan tevreden te zijn dat het werkt. (bij programming & developing in ieder geval). Van kant-en-klare oplossingen maak je je er snel van af en kan je achteraf niet meer voor de geest halen hoe die codeblok nu ook weer in elkaar stak...

Daarbuiten denk ik dat je best wat leest over de Java syntax, zodat je frustratie betreffende fouten al een deel vermindert.

Als je concrete voorbeelden wil geven waar het misloopt (bijvoorbeeld: mijn for-lus doet rare dingen of mijn nieuwe klasse erft niet van mijn hoofdklasse), dan kunnen wij beter aanduiden hoe je verder moet.

blackrabbit

Legacy Member
Wat Recipe4hate zegt dus...


Ik heb je alvast enkele tips gegeven om op weg te geraken, als die tips je niets zeggen dan raad ik aan om een goed boek te lezen (of eventueel wat crash courses op internet), zowel rond Java als OO.

Het MVC pattern waar ik over sprak kan je bvb nog even links laten liggen, maar als je je code leesbaar wil houden (en liefst ook herbruikbaar), dan zal je toch wat 'verantwoordelijkheden' moeten gaan verdelen over verschillende entities (ipv alles in 1 klasse te proppen)



En nog even dit: begin met een console-applicatie. Ja, dat is veel minder fancy, maar je gaat er meer uit leren. Je kan je dan focussen op JAVA/OO en GUI-shizzle (wat ik persoonlijk altijd 'lelijke' & bombastische code vind) voorlopig achterwege laten.
Begin met een simpel programma, bvb iets 'boekhoudkundig' ofzo:
- je kan 'items' toevoegen aan een 'DB' (dat hoeft geen database te zijn, kan bvb door een Map worden bijgehouden), waarbij elk item volgende eigenschappen heeft:
-- aankoopprijs
-- verkoopprijs
-- hoeveelheid in stock
- een 'factuur' opstellen: items 'selecteren' (dat kan ok via console, bvb dmv een genummerde lijst, waarbij de gebruiker een cijfer uit de lijst moet ingeven om een lijstitem te selecteren)
- een rapport 'uitprinten' (ook in console dus) met info zoals:
-- samenvatting van verkopen (% winst, bedragen, ..)
-- totale winst
-- resterende stock

etc etc
Je kan dit om te beginnen gerust implementeren dmv in/output rechtstreeks in je methods te laten uitvoeren (= stap 1). Eens je programma werkt, kan je proberen het te transformeren zodat het MVC pattern gebruikt wordt (maar nog steeds met console dus) (= stap 2). Vervolgens, wanneer MVC juist is geimplementeerd, is het eenvoudig om de console-interface te vervangen door een grafische interface (= stap 3).

Op deze manier ga je gaandeweg een aantal concepten leren & hopelijk inzien hoe design van een OO programma 'werkt' en invloed heeft op de rest van de implementatie.

Maser00

Legacy Member
Of begin met bv. memory te maken, das makkelijker en ook een van onze eerste opdrachten op school.

michel39

Legacy Member
Bedankt voor de tips en snelle reacties steeds. Ik heb ondertussen op internet wat dingen gelezen over java in netbeans en begrijp het conept wel, maar op school worden we als het ware het diepe in gegooid want ik ben een beginnend informatica leerling en we moeten direct een spel in elkaar zetten zonder ook maar ooit in aanraking geweest te zijn met dit programma en deze codes.

Het is de bedoeling dat we dit spel eigenlijk deze week/volgende week af hebben maar ik heb de leraar al aangegeven dat dit absoluut niet gaat lukken. Ik heb hem gezegd dat ik het zo ver mogelijk af probeer te krijgen, maar dat wordt moeilijk. Ik ga in ieder geval proberen nog wat dingen aan het spel te bewerken zodat het wat duidelijker/overzichtelijker wordt en misschien nog wat beter.

Ik hoop dat het me lukt, maar het zal moeilijk worden.

blackrabbit

Legacy Member
Het is midden juni. Je gaat me toch niet zeggen dat je het ganse jaar geen letter Java hebt gezien?

Je hoeft trouwens niet met NetBeans te werken, dat is maar een IDE. Welke IDE heb je tijdens de lessen gebruikt?

michel39

Legacy Member
Natuurlijk heb ik het hele jaar wel wat Java gezien, maar we begonnen pas rond de winter met dit onderwerp. Vele van ons voelen zich als het ware in het diepe gegooid omdat we niet precies weten hoe het allemaal werkt. We moeten de codes als het ware weten. We kunnen het toch niet zomaar weten?

We gebruiken Netbeans IDE 7.0.

@Pudmeister: Als je het niet erg vind houdt ik het liever voor me op welke school ik zit.

Recipe4hate

Legacy Member
Euh, "code" weet je nooit. Ik ben dagelijks bezig met het opzoeken en implementeren van nieuwe elementen.
Developing is echt iets waar je mee bezig moet zijn om er wat gedaan in te krijgen...

Ik kan me niet voorstellen dat je het hele jaar ermee bent bezig geweest en nu het gevoel hebt dat je voor de leeuwen wordt gegooid.

Natuurlijk is dit slechts mijn mening hé.

michel39

Legacy Member
Ik kriig niet 'nu pas' het gevoel dat ik voor de leeuwen gegooid wordt, maar dat speelt al langer mee. Veel langer zelfs. En niet bij mij alleen, ook bij meerdere in de klas.

Maargoed zoals jullie ook beschrijven moet je zelf een hoop proberen en oefenen om beter te worden als onderdeel van het leerproces. Dat is ook de reden dat ik nu zo laat pas kom aanzetten met mijn spel. Ik heb tot het laatste moment gewacht en zoveel mogelijk proberen te doen. Maar verder kon ik echt niet komen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan