Galgje programmeren in Java

Status
Niet open voor verdere reacties.

Soapsim

Gebruiker
Lid geworden
24 mrt 2008
Berichten
7
Hallo allemaal,

Ik moet een spel programmeren in Java, en heb galgje gekozen. Het probleem is dat ik echt heel erg slecht ben in programmeren, en dat het me totaal niet lukt. Ik heb op het internet gezocht voor aanvullende informatie op mijn boek, maar het heeft allemaal niet geholpen. Donderdag moet ik het spel inleveren, en ik kom er nog altijd niet uit. De docent heeft me voor een deel geholpen, maar ieder nieuw stapje kan ik ook niet maken. Telkens heb ik geen flauw idee hoe ik het voor elkaar moet krijgen. Ik hoop dat jullie me kunnen helpen. Ik heb al een aardig deel van de programmeercode, en zit nu vast na het nascannen van het te raden woord (rwoord) of een ingevoerde letter erin zit, en waar dan. Hierna moet die letter op het juiste puntje ingevuld worden als het in het woord voorkomt, of het getal missers moet met één verhoogd worden en een deel van de galg moet verschijnen.

Dit is de code tot nu toe:

/**

* @(#)Proef.java
* Proef Applet application
* @author
* @version 1.00 2008/3/3
*/
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;
public class Proef extends Applet {

static final int DOOD = 13;
private String rwoord; // het te raden woord
private StringBuffer gwoord;// het geraden woord
private int missers; // globale variabele toegevoegd jonp
private String meldTekst; // globale variabele toegevoegd jonp
private String toelichting; // globale variabele toegevoegd jonp
private int AANTAL = 100000;

// hier wordt de variabele woord gedeclareerd: het is een rij van hooguit 3 String's (jonp)

String[] woord = new String[3];

public void init() {

// hier wordt de variabele woord gevuld (jonp)
woord[0] = "aardbol";
woord[1] = "appelboom";
woord[2] = "agrarisch";

}

//}}

void startKnop_ActionPerformed(java.awt.event.ActionEvent event) {

// declareer een nummer en vul willekeurig met een getal van 0 t/m 2
int RG = (int) (Math.random() * 3);
// haal het te raden woord op
rwoord = woord[RG];
StringBuffer puntjes;
puntjes = new StringBuffer(rwoord);
// en vervang alle tekens in dat woord door een '.'
for (int i = 0; i < rwoord.length(); i++) {
puntjes.setCharAt(i, '.');
}
// gebruik de methode toString() om de inhoud van een StringBuffer
// als String te verkrijgen
woordLabel.setText(puntjes.toString());
meldingLabel.setText("Raad een letter");

}

void raadKnop_ActionPerformed(java.awt.event.ActionEvent event) {
String letter = raadVeld.getText();
// raadVeld.getText();
raadVeld.setText("");
// String letter;
StringBuffer geradenletters = new StringBuffer();

while (missers < 13 && !woord.equals(rwoord)) {
int index = 0;
meldingLabel.setText("Voer een letter in: ");
//geraden letter
if ((rwoord.indexOf(letter)) != (-1)) // index van het gevonden karakter bewaren

{

StringBuffer puntjes = new StringBuffer(woordLabel.getText());
for (int i = 0; i < rwoord.length(); i++) {
if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
{
puntjes.setCharAt(i, letter.charAt(0));
}
else
{
puntjes.setCharAt(i, '.');
missers++;
int pogingen = 13 - missers;
}
}
rwoord.indexOf(letter);
toelichtingLabel.getText("");
toelichtingLabel.setText("Deze letter is goed!");
meldingLabel.setText("Je hebt " + pogingen + " poging(en) over.");
} //verkeerd geraden woord
else {
missers++;
meldingLabel.setText("");
toelichtingLabel.setText("Je hebt " + missers + "over");
}
if (missers == DOOD) {
meldingLabel.setText("Je hebt het woord niet geraden, Je hangt!");
toelichtingLabel.setText("Het te raden woord was: " + rwoord);
}
}
}
// alles wat getekend moet worden moet in de methode Paint staan
public void Paint(Graphics g) {
int baseY = 250;
if (missers > 0) { // grond
g.drawLine(90, baseY, 200, baseY);
}
if (missers > 1) { // balk omhoog
g.drawLine(125, baseY, 125, baseY - 100);
}
if (missers > 2) {
g.drawLine(110, baseY, 125, baseY - 15);
}
if (missers > 3) {
g.drawLine(140, baseY, 125, baseY - 15);
}
if (missers > 4) { // zijbalk
g.drawLine(125, baseY - 100, 175, baseY - 100);
}
if (missers > 5) {
g.drawLine(125, baseY - 85, 140, baseY - 100);
}
if (missers > 6) { // het touw
g.drawLine(175, baseY - 100, 175, baseY - 75);
}
if (missers > 7) { // lichaam
g.drawOval(170, baseY - 75, 10, 12);
}
if (missers > 8) {
g.drawOval(170, baseY - 65, 15, 25);
}
if (missers > 9) { // armen
g.drawLine(160, baseY - 65, 170, baseY - 60);
}
if (missers > 10) {
g.drawLine(183, baseY - 60, 193, baseY - 65);
}
if (missers > 11) { // benen
g.drawLine(165, baseY - 30, 170, baseY - 45);
}
if (missers > 12) {
g.drawLine(183, baseY - 45, 193, baseY - 30);
}
// Toon de meldingen.
g.drawString(meldTekst, 50, baseY + 25);
g.drawString(toelichting, 25, baseY + 45);
}
}

Alvast heel erg bedankt voor de hulp.
 
Ik snap eerlijk gezegd niet wat het probleem is, en aangezien je niet de hele code hebt geplakt, (het maken van de interface) kan ik het zelf ook niet testen. Zou je even duidelijker uit willen leggen wat er precies niet doet wanneer je wat doet en of er een foutmelding komt of niet? Zet anders de hele code eens neer ;) (Tip: gebruik code tags, dit is overzichtelijker (
Code:
 en [ /code])
 
Code:
/**
 * @(#)Proef.java
 *
 * Proef Applet application
 *
 * @author 
 * @version 1.00 2008/3/3
 */
 
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;

public class Proef extends Applet {
	
    static final int DOOD = 13;
    private String rwoord;      // het te raden woord
    private StringBuffer gwoord;// het geraden woord
    private int missers; // globale variabele toegevoegd jonp
    private String meldTekst; // globale variabele toegevoegd jonp
    private String toelichting; // globale variabele toegevoegd jonp
    private int AANTAL = 100000;
    // hier wordt de variabele woord gedeclareerd: het is een rij van hooguit 3 String's (jonp)
    String[] woord = new String[3];

    public void init() {
        // Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
        //symantec.itools.lang.Context.setApplet(this);

        // This code is automatically generated by Visual Cafe when you add
        // components to the visual environment. It instantiates and initializes
        // the components. To modify the code, only use code syntax that matches
        // what Visual Cafe can generate, or Visual Cafe may be unable to back
        // parse your Java file into its visual environment.
        //{{INIT_CONTROLS
        setLayout(null);
        setSize(522, 357);
        raadKnop.setLabel("Raad");
        add(raadKnop);
        raadKnop.setBackground(java.awt.Color.lightGray);
        raadKnop.setBounds(420, 24, 78, 38);
        startKnop.setLabel("Start");
        add(startKnop);
        startKnop.setBackground(java.awt.Color.lightGray);
        startKnop.setBounds(420, 276, 84, 48);
        add(raadVeld);
        raadVeld.setBounds(336, 24, 46, 35);
        add(woordLabel);
        woordLabel.setBounds(36, 24, 224, 40);
        // 2 labels toegevoegd (jonp)
        add(meldingLabel);
        meldingLabel.setBounds(36, 44, 224, 60);
        meldingLabel.setText("meldingLabel");
        add(toelichtingLabel);
        toelichtingLabel.setBounds(36, 64, 224, 80);
        toelichtingLabel.setText("toelichtingLabel");
        //}}

        //{{REGISTER_LISTENERS
        SymAction lSymAction = new SymAction();
        startKnop.addActionListener(lSymAction);
        raadKnop.addActionListener(lSymAction);
        //}}

        // hier wordt de variabele woord gevuld (jonp)
        woord[0] = "aardbol";
        woord[1] = "appelboom";
        woord[2] = "agrarisch";

    }
    //{{DECLARE_CONTROLS
    java.awt.Button raadKnop = new java.awt.Button();
    java.awt.Button startKnop = new java.awt.Button();
    java.awt.TextField raadVeld = new java.awt.TextField();
    java.awt.Label woordLabel = new java.awt.Label();
    java.awt.Label meldingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    java.awt.Label toelichtingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    //}}
    class SymAction implements java.awt.event.ActionListener {

        public void actionPerformed(java.awt.event.ActionEvent event) {
            Object object = event.getSource();
            if (object == startKnop) {
                startKnop_ActionPerformed(event);
            } else if (object == raadKnop) {
                raadKnop_ActionPerformed(event);
            }
        }
    }

    void startKnop_ActionPerformed(java.awt.event.ActionEvent event) {

        int RG = (int) (Math.random() * 3);
          rwoord = woord[RG];
             StringBuffer puntjes;
             puntjes = new StringBuffer(rwoord);
            for (int i = 0; i < rwoord.length(); i++) {
            puntjes.setCharAt(i, '.');
        }
      
        woordLabel.setText(puntjes.toString());
        meldingLabel.setText("Raad een letter");

    }

    void raadKnop_ActionPerformed(java.awt.event.ActionEvent event) {
        String letter = raadVeld.getText();
        // raadVeld.getText();
        raadVeld.setText("");
        // String letter;
        StringBuffer geradenletters = new StringBuffer();


        while (missers < 13 && !woord.equals(rwoord)) {
            int index = 0;
            toelichtingLabel.setText("Je opgegeven letter(s) zijn: " + geradenletters);
            meldingLabel.setText("Voer een letter in: ");
            geradenletters.append(letter + "_");

            //geraden letter
            if ((rwoord.indexOf(letter)) != (-1)) // index van het gevonden karakter bewaren
            {
                StringBuffer puntjes = new StringBuffer(woordLabel.getText());
                
                for (int i = 0; i < rwoord.length(); i++) {
                    if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                    {
                         puntjes.setCharAt(i, letter.charAt(0));
                    } 

                    else 
                        {
                         missers++;
                         int pogingen = 13 - missers;
                    }
                } 
         

                rwoord.indexOf(letter);
                woordLabel.setText("");
                toelichtingLabel.setText("Deze letter is goed!");
                woordLabel.setText(rwoord);
                woordLabel.setText("");
                meldingLabel.setText("Je hebt " + missers + " leven(s) over.");
            } //verkeerd geraden woord
            else {
                missers++;
                meldingLabel.setText("");
                toelichtingLabel.setText("Je hebt " + missers + "over");
            }

                if (missers == DOOD) {
                meldingLabel.setText("Je hebt het woord niet geraden, Je hangt!");
                toelichtingLabel.setText("Het te raden woord was: " + rwoord);
                
            }


        }
    }

{
        int baseY = 250;

        if (missers > 0) {    // grond
            g.drawLine(90, baseY, 200, baseY);
        }
        if (missers > 1) {    // balk omhoog
            g.drawLine(125, baseY, 125, baseY - 100);
        }
        if (missers > 2) {
            g.drawLine(110, baseY, 125, baseY - 15);
        }
        if (missers > 3) {
            g.drawLine(140, baseY, 125, baseY - 15);
        }
        if (missers > 4) {    // zijbalk
            g.drawLine(125, baseY - 100, 175, baseY - 100);
        }
        if (missers > 5) {
            g.drawLine(125, baseY - 85, 140, baseY - 100);
        }
        if (missers > 6) {    // het touw
            g.drawLine(175, baseY - 100, 175, baseY - 75);
        }
        if (missers > 7) {    // lichaam
            g.drawOval(170, baseY - 75, 10, 12);
        }
        if (missers > 8) {
            g.drawOval(170, baseY - 65, 15, 25);
        }
        if (missers > 9) {    // armen
            g.drawLine(160, baseY - 65, 170, baseY - 60);
        }
        if (missers > 10) {
            g.drawLine(183, baseY - 60, 193, baseY - 65);
        }
        if (missers > 11) {    // benen
            g.drawLine(165, baseY - 30, 170, baseY - 45);
        }
        if (missers > 12) {
            g.drawLine(183, baseY - 45, 193, baseY - 30);
        }
        // Toon de meldingen.               
        g.drawString(meldTekst, 50, baseY + 25);
        g.drawString(toelichting, 25, baseY + 45);

    }
}

Dit is, als het goed is, de hele code.
Momenteel zit ik vast met dit stukje:
Code:
   for (int i = 0; i < rwoord.length(); i++) {
                    if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                    {
                         puntjes.setCharAt(i, letter.charAt(0));
                    } 

                    else 
                        {
                         missers++;
                         int missers = 13 - missers;
                    }
                }

Er is hier een letter ingevoerd, en er moet gekeken worden of die letter in het woord zit, en waar. Dat gebeurt in de eerste regel. Daarna moet er gehandeld worden worden wanneer de letter er wel of niet in zit. Zit ie er wel in, dan moet hij in het label verschijnen op de plek van een van de puntjes. Zit hij er niet in, dan is het de bedoeling dat het aantal missers met 1 verhoogd wordt, en dat er een deel van de galg bij wordt getekend. Maar ik weet dus niet hoe ik dat voor elkaar moet krijgen. Hij zou volgens mij de goede letter al op zijn plek in het woord moeten zetten, maar toen ik dat probeerde, gebeurde dat niet.:confused:
 
Als je de lijntjes wilt tekenen, zul je dit met

Code:
public void paint (Graphics g)
{

}

moeten doen. Zet dus alles waar je mee tekent in dit blok. Als je de tekening opnieuw wil laten tekenen, gebruik je

Code:
repaint();

Als ik de applet dan draai, krijg ik een NullPointerException. Dat is bij dit stukje:

Code:
// Toon de meldingen.               
        g.drawString(meldTekst, 50, baseY + 25);
        g.drawString(toelichting, 25, baseY + 45);


De eerste keer hebben meldTekst en toelichting daar nog geen waarde gekregen, waardoor er niks getekend kan worden en je een NPE krijgt.

Verder gebruik je bij het controleren een while-lus.
Deze gaat net zolang door tot missers groter dan 13 is, of tot het woord goed is. Als de letter fout is, zal hij 1 bij misser optellen, de galg verdertekenen en opnieuw kijken of misser kleiner is dan 13. Zo ja, dan telt hij weer 1 bij misser op, zodat je op het eind van de lus de hele galg ziet en je af bent.

Maak dus van deze while een if lus ;)

Code:
        [color=red]while [/color](missers < 13 && !woord.equals(rwoord)) {
            int index = 0;
            toelichtingLabel.setText("Je opgegeven letter(s) zijn: " + geradenletters);
            meldingLabel.setText("Voer een letter in: ");
            geradenletters.append(letter + "_");

En om je applet iets meer 'fool-proof' te maken, zorg dat je pas op de raadKnop kunt drukken nádat het spel is gestart. Anders ga je geheid fouten krijgen.
 
Laatst bewerkt:
Maar als ik die dingen heb veranderd, dan klopt het toch nog steeds niet allemaal, of wel? Sorry als deze vraag stom is, maar op mijn laptop thuis kan ik de applet niet goed runnen. Hij geeft aan dat er geen errors zijn, maar zegt wel bij de General Output: '-Configuration: <Default>--------------------
java.lang.NoSuchMethodError: main
Exception in thread "main"
Process completed.'

Ik weet zo snel niet hoe ik dit op kan lossen, maar hierdoor laat JCreator mijn applet niet zien.

De code die ik nu heb, is nu dus:

Code:
 /**
 * @(#)Proef.java
 *
 * Proef Applet application
 *
 * @author 
 * @version 1.00 2008/3/3
 */
 
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;

public class Proef extends Applet {
	
    static final int DOOD = 13;
    private String rwoord;      // het te raden woord
    private StringBuffer gwoord;// het geraden woord
    private int missers; // globale variabele toegevoegd jonp
    private String meldTekst; // globale variabele toegevoegd jonp
    private String toelichting; // globale variabele toegevoegd jonp
    private int AANTAL = 100000;
    // hier wordt de variabele woord gedeclareerd: het is een rij van hooguit 3 String's (jonp)
    String[] woord = new String[3];

    public void init() {
        // Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
        //symantec.itools.lang.Context.setApplet(this);

        // This code is automatically generated by Visual Cafe when you add
        // components to the visual environment. It instantiates and initializes
        // the components. To modify the code, only use code syntax that matches
        // what Visual Cafe can generate, or Visual Cafe may be unable to back
        // parse your Java file into its visual environment.
        //{{INIT_CONTROLS
        setLayout(null);
        setSize(522, 357);
        raadKnop.setLabel("Raad");
        add(raadKnop);
        raadKnop.setBackground(java.awt.Color.lightGray);
        raadKnop.setBounds(420, 24, 78, 38);
        startKnop.setLabel("Start");
        add(startKnop);
        startKnop.setBackground(java.awt.Color.lightGray);
        startKnop.setBounds(420, 276, 84, 48);
        add(raadVeld);
        raadVeld.setBounds(336, 24, 46, 35);
        add(woordLabel);
        woordLabel.setBounds(36, 24, 224, 40);
        // 2 labels toegevoegd (jonp)
        add(meldingLabel);
        meldingLabel.setBounds(36, 44, 224, 60);
        meldingLabel.setText("meldinglabel");
        add(toelichtingLabel);
        toelichtingLabel.setBounds(36, 84, 224, 80);
        toelichtingLabel.setText("toelichtinglabel");
        //}}

        //{{REGISTER_LISTENERS
        SymAction lSymAction = new SymAction();
        startKnop.addActionListener(lSymAction);
        raadKnop.addActionListener(lSymAction);
        //}}

        // hier wordt de variabele woord gevuld (jonp)
        woord[0] = "aardbol";
        woord[1] = "appelboom";
        woord[2] = "agrarisch";

    }
    //{{DECLARE_CONTROLS
    java.awt.Button raadKnop = new java.awt.Button();
    java.awt.Button startKnop = new java.awt.Button();
    java.awt.TextField raadVeld = new java.awt.TextField();
    java.awt.Label woordLabel = new java.awt.Label();
    java.awt.Label meldingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    java.awt.Label toelichtingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    //}}
    class SymAction implements java.awt.event.ActionListener {

        public void actionPerformed(java.awt.event.ActionEvent event) {
            Object object = event.getSource();
            if (object == startKnop) {
                startKnop_ActionPerformed(event);
            } else if (object == raadKnop) {
                raadKnop_ActionPerformed(event);
            }
        }
    }

    void startKnop_ActionPerformed(java.awt.event.ActionEvent event) {

        // (jonp start)
        // declareer een nummer en vul  willekeurig met een getal van 0 t/m 2
        int RG = (int) (Math.random() * 3);
        // haal het te raden woord op
        rwoord = woord[RG];
        // declareer een nieuwe stringbuffer
        // (een StringBuffer is handiger dan een String 
        // als je de inhoud wilt manipuleren)
        StringBuffer puntjes;
        // creeer hem en geef het als inhoud het te raden woord...
        puntjes = new StringBuffer(rwoord);
        // en vervang alle tekens in dat woord door een '.'
        for (int i = 0; i < rwoord.length(); i++) {
            puntjes.setCharAt(i, '.');
        }
        // gebruik de methode toString() om de inhoud van een StringBuffer
        // als String te verkrijgen 
        woordLabel.setText(puntjes.toString());
        // (jonp einde)
        meldingLabel.setText("Raad een letter");

    }

    void raadKnop_ActionPerformed(java.awt.event.ActionEvent event) {
        String letter = raadVeld.getText();
        // raadVeld.getText();
        raadVeld.setText("");
        // String letter;
        StringBuffer geradenletters = new StringBuffer();


        if (missers < 13 && !woord.equals(rwoord)) {
            int index = 0;
            meldingLabel.setText("Voer een letter in: ");
            
            //geraden letter
            if ((rwoord.indexOf(letter)) != (-1)) // index van het gevonden karakter bewaren
            {
             
                StringBuffer puntjes = new StringBuffer(woordLabel.getText());
                
                for (int i = 0; i < rwoord.length(); i++) {
                    if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                    {
                         puntjes.setCharAt(i, letter.charAt(0));
                        
                    } 
                    else {
                         missers++; 
                         int pogingen = 13 - missers;

                    }
                } 
         
                rwoord.indexOf(letter);
                woordLabel.setText("");
                toelichtingLabel.setText("Deze letter is goed!");
                woordLabel.setText(rwoord);
                woordLabel.setText("");
                meldingLabel.setText("Je hebt " + missers + " leven(s) over.");
            } //verkeerd geraden woord
            else {
                missers++;
                meldingLabel.setText("");
                toelichtingLabel.setText("Je hebt " + missers + "over");
            }

            if (missers == DOOD) {
                meldingLabel.setText("Je hebt het woord niet geraden, Je hangt!");
                toelichtingLabel.setText("Het te raden woord was: " + rwoord);
                
            }


        }
    }

    // alles wat getekend moet worden moet in de methode Paint staan
    public void Paint(Graphics g) {
        int baseY = 250;

        if (missers > 0) {    // grond
            g.drawLine(90, baseY, 200, baseY);
        }
        if (missers > 1) {    // balk omhoog
            g.drawLine(125, baseY, 125, baseY - 100);
        }
        if (missers > 2) {
            g.drawLine(110, baseY, 125, baseY - 15);
        }
        if (missers > 3) {
            g.drawLine(140, baseY, 125, baseY - 15);
        }
        if (missers > 4) {    // zijbalk
            g.drawLine(125, baseY - 100, 175, baseY - 100);
        }
        if (missers > 5) {
            g.drawLine(125, baseY - 85, 140, baseY - 100);
        }
        if (missers > 6) {    // het touw
            g.drawLine(175, baseY - 100, 175, baseY - 75);
        }
        if (missers > 7) {    // lichaam
            g.drawOval(170, baseY - 75, 10, 12);
        }
        if (missers > 8) {
            g.drawOval(170, baseY - 65, 15, 25);
        }
        if (missers > 9) {    // armen
            g.drawLine(160, baseY - 65, 170, baseY - 60);
        }
        if (missers > 10) {
            g.drawLine(183, baseY - 60, 193, baseY - 65);
        }
        if (missers > 11) {    // benen
            g.drawLine(165, baseY - 30, 170, baseY - 45);
        }
        if (missers > 12) {
            g.drawLine(183, baseY - 45, 193, baseY - 30);
        }
       
    }
}

En hoe zorg ik ervoor dat er pas na 'Start' op de raadknop gedrukt kan worden?
 
Hoe probeer je je applet thuis te runnen dan? Je zult wel gebruik moeten maken van visual café of een browser om dit te doen met applets.

En die knoppen, zet dit erbij:

Code:
raadKnop.setBackground(java.awt.Color.lightGray);
raadKnop.setBounds(420, 24, 78, 38);
[color=red]raadKnop.setVisible(false);[/color]

Zo zal je raadKnop in het begin niet te zien zijn
zet bij de actionPerformed van de startKnop

Code:
raadKnop.setVisible(true);

Zo maak je de knop zichtbaar en kan hij gebruikt worden. Je zou hier dus ook eventueel de startKnop onzichtbaar kunnen maken.

En er zitten wel degelijk wat algoritme fouten in je applet, maar die mag je zelf uitzoeken ;)

Oh, en waarschijnlijk is die fout er doordat je Paint met een hoofdletter hebt geschreven, dit moet dus public void paint(Graphics g) zijn.. Mijn fout
 
Laatst bewerkt:
:confused:Ik heb de hele code opnieuw in VisualCafe geplakt, en nu runt ie 'm wel.

Dat er fouten in zitten, dat snap ik wel, want het gaat dus nog altijd niet zoals het moet.:( Als de letter goed is, verschijnt hij niet in het woord. Sterker nog: de puntjes verdwijnen.:confused:
Is de letter fout, dan verschijnt er niks van de galg. Ik heb wel al voor elkaar dat het klopt hoeveel pogingen je nog over hebt.:P Ben ik nog trots op ook.

Alleen nu dus die twee irritante dingen die nog maar niet lukken.
Code:
StringBuffer puntjes = new StringBuffer(woordLabel.getText());
                
                for (int i = 0; i < rwoord.length(); i++) {
                    if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                    {
                         puntjes.setCharAt(i, letter.charAt(0));

Hier moet toch al in geregeld worden dat de geraden letter in het woord verschijnt? Maar toch verdwijnen alleen maar alle puntjes als de letter goed is. Ik heb er aan lopen rommelen, maar toen kreeg ik meteen het hele woord als er net een letter goed geraden was. Dat zou wel erg makkelijk zijn.:o

Ik heb paint al met een kleine letter, maar toch verschijnt er niets van die galg?
Ik heb al geprobeerd om dat public void paint nog onder de else van het letter raden te zetten, maar toen kreeg ik een error.:confused:

Eh... ja, ik weet dat ik echt hopeloos ben hiermee...:confused:


Edit: Omg, dat stomme van dat de puntjes verdwijnen heb ik al weg weten te krijgen. Maar nu verschijnt nog steeds die stomme letter niet. Nu blijven de puntjes alleen maar staan. Dit is echt heel irritant.XD

Edit 2: Ik heb het opgelost! Zo simpel is het!:O gewoon woordLabel.setText(puntjes.toString());!
Oké, ik ga me steeds dommer voelen hierdoor.:P
Nu nieuw probleem ontdekt: het woord is geraden, en dan moet er een melding komen dat het het woord geraden is, en dat je op start moet drukken om nog eens te spelen, of iets in die trant. Hoe doe ik dat?
Het lukt niet met
Code:
 if (woordLabel.setText(puntjes.toString()) = rwoord ) {

of met
Code:
 if (puntjes.toString = rwoord)

Ik weet dat ik waarschijnlijk dichtbij zit, maar hoe kan ik de linkerkant van deze vergelijking kloppend maken, dus dat het woord dat in het woordlabel staat, gelijk is aan het rwoord?

En dan nog steeds die galg... :confused:
 
Laatst bewerkt:
gebruik je wel repaint() op de plek waar de galg moet tekenen?
 
gebruik je wel repaint() op de plek waar de galg moet tekenen?

repaint()? Sorry, ik snap je niet.:confused: Op de plek waar ik de galg moet tekenen? Er verschijnt geen enkel deel van de galg, ook de grond niet?

Code:
/**
 * @(#)Proef.java
 *
 * Proef Applet application
 *
 * @author 
 * @version 1.00 2008/3/3
 */
 
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;

public class Proef extends Applet {
	
    static final int DOOD = 13;
    private String rwoord;      // het te raden woord
    private StringBuffer gwoord;// het geraden woord
    private int missers; // globale variabele toegevoegd jonp
    private int pogingen;
    private String meldTekst; // globale variabele toegevoegd jonp
    private String toelichting; // globale variabele toegevoegd jonp
    private int AANTAL = 100000;
    // hier wordt de variabele woord gedeclareerd: het is een rij van hooguit 3 String's (jonp)
    String[] woord = new String[3];

    public void init() {
        // Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
        //symantec.itools.lang.Context.setApplet(this);

        // This code is automatically generated by Visual Cafe when you add
        // components to the visual environment. It instantiates and initializes
        // the components. To modify the code, only use code syntax that matches
        // what Visual Cafe can generate, or Visual Cafe may be unable to back
        // parse your Java file into its visual environment.
        //{{INIT_CONTROLS
        setLayout(null);
        setSize(522, 357);
        raadKnop.setLabel("Raad");
        add(raadKnop);
        raadKnop.setBackground(java.awt.Color.lightGray);
        raadKnop.setBounds(420, 24, 78, 38);
        raadKnop.setVisible(false);
        startKnop.setLabel("Start");
        add(startKnop);
        startKnop.setBackground(java.awt.Color.lightGray);
        startKnop.setBounds(420, 276, 84, 48);
        add(raadVeld);
        raadVeld.setBounds(336, 24, 46, 35);
        add(woordLabel);
        woordLabel.setBounds(36, 24, 224, 40);
        // 2 labels toegevoegd (jonp)
        add(meldingLabel);
        meldingLabel.setBounds(36, 44, 224, 60);
        meldingLabel.setText("meldinglabel");
        add(toelichtingLabel);
        toelichtingLabel.setBounds(36, 84, 224, 80);
        toelichtingLabel.setText("toelichtinglabel");
        //}}

        //{{REGISTER_LISTENERS
        SymAction lSymAction = new SymAction();
        startKnop.addActionListener(lSymAction);
        raadKnop.addActionListener(lSymAction);
        //}}

        // hier wordt de variabele woord gevuld (jonp)
        woord[0] = "aardbol";
        woord[1] = "appelboom";
        woord[2] = "agrarisch";

    }
    //{{DECLARE_CONTROLS
    java.awt.Button raadKnop = new java.awt.Button();
    java.awt.Button startKnop = new java.awt.Button();
    java.awt.TextField raadVeld = new java.awt.TextField();
    java.awt.Label woordLabel = new java.awt.Label();
    java.awt.Label meldingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    java.awt.Label toelichtingLabel = new java.awt.Label(); // label toegevoegd (jonp)
    //}}
    class SymAction implements java.awt.event.ActionListener {

        public void actionPerformed(java.awt.event.ActionEvent event) {
            Object object = event.getSource();
            if (object == startKnop) {
                startKnop_ActionPerformed(event);
            } else if (object == raadKnop) {
                raadKnop_ActionPerformed(event);
            }
        }
    }

    void startKnop_ActionPerformed(java.awt.event.ActionEvent event) {

        // (jonp start)
        raadKnop.setVisible(true);
        // declareer een nummer en vul  willekeurig met een getal van 0 t/m 2
        int RG = (int) (Math.random() * 3);
        // haal het te raden woord op
        rwoord = woord[RG];
        // declareer een nieuwe stringbuffer
        // (een StringBuffer is handiger dan een String 
        // als je de inhoud wilt manipuleren)
        StringBuffer puntjes;
        // creeer hem en geef het als inhoud het te raden woord...
        puntjes = new StringBuffer(rwoord);
        // en vervang alle tekens in dat woord door een '.'
        for (int i = 0; i < rwoord.length(); i++) {
            puntjes.setCharAt(i, '.');
        }
        // gebruik de methode toString() om de inhoud van een StringBuffer
        // als String te verkrijgen 
        woordLabel.setText(puntjes.toString());
        // (jonp einde)
        meldingLabel.setText("Raad een letter");

    }

    void raadKnop_ActionPerformed(java.awt.event.ActionEvent event) {
        String letter = raadVeld.getText();
        // raadVeld.getText();
        raadVeld.setText("");
        // String letter;
        StringBuffer geradenletters = new StringBuffer();


        if (missers < 13 && !woord.equals(rwoord)) {
            meldingLabel.setText("Voer een letter in: ");
            
            //geraden letter
            if ((rwoord.indexOf(letter)) != (-1)) // index van het gevonden karakter bewaren
            {
             
                StringBuffer puntjes = new StringBuffer(woordLabel.getText());
                
                for (int i = 0; i < rwoord.length(); i++) {
                    if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                    {
                         puntjes.setCharAt(i, letter.charAt(0));
                         woordLabel.setText(puntjes.toString());
                         
                    } 
                    
                } 
         
                    toelichtingLabel.setText("Deze letter is goed!");
             
                            } 
            
            else {
                         missers++; 
                         pogingen = 13 - missers;
                         toelichtingLabel.setText("Deze letter is fout");
                         meldingLabel.setText("Je hebt " + pogingen + " leven(s) over.");

                    }
                    
                                      
                    
            if (missers == DOOD) {
                meldingLabel.setText("Je hebt het woord niet geraden, Je hangt!");
                toelichtingLabel.setText("Het te raden woord was: " + rwoord);
                
            }
            
           [COLOR="Red"] if (puntjes.toString = rwoord ) {[/COLOR]                    meldingLabel.setText("Gefeliciteerd! Je hebt het woord geraden!");
                   }


        }
    }

    // alles wat getekend moet worden moet in de methode Paint staan
    public void paint(Graphics g) {
        int baseY = 250;

        if (missers > 0) {    // grond
            g.drawLine(90, baseY, 200, baseY);
        }
        if (missers > 1) {    // balk omhoog
            g.drawLine(125, baseY, 125, baseY - 100);
        }
        if (missers > 2) {
            g.drawLine(110, baseY, 125, baseY - 15);
        }
        if (missers > 3) {
            g.drawLine(140, baseY, 125, baseY - 15);
        }
        if (missers > 4) {    // zijbalk
            g.drawLine(125, baseY - 100, 175, baseY - 100);
        }
        if (missers > 5) {
            g.drawLine(125, baseY - 85, 140, baseY - 100);
        }
        if (missers > 6) {    // het touw
            g.drawLine(175, baseY - 100, 175, baseY - 75);
        }
        if (missers > 7) {    // lichaam
            g.drawOval(170, baseY - 75, 10, 12);
        }
        if (missers > 8) {
            g.drawOval(170, baseY - 65, 15, 25);
        }
        if (missers > 9) {    // armen
            g.drawLine(160, baseY - 65, 170, baseY - 60);
        }
        if (missers > 10) {
            g.drawLine(183, baseY - 60, 193, baseY - 65);
        }
        if (missers > 11) {    // benen
            g.drawLine(165, baseY - 30, 170, baseY - 45);
        }
        if (missers > 12) {
            g.drawLine(183, baseY - 45, 193, baseY - 30);
        }
      
    }
}

Dit is wat ik nu heb?
 
Ik ben nog even bezig met debuggen, dus een uitgebreider antwoord komt zo ;)

In het begin als je de applet opstart, gaat je code langs de paint methode. Om deze methode later aan te roepen als hij er een lijn bij moet tekenen, gebruik je repaint()

dus zoiets:

Code:
//letter geraden
//letter is fout, misser++
repaint(); //hier tekent hij het lijntje er bij
 
Ik heb 4 (grote) fouten gevonden:

1.
Code:
void raadKnop_ActionPerformed(java.awt.event.ActionEvent event) {
//(...)
         StringBuffer geradenletters = new StringBuffer();

Als je dit doet, zal hij elke keer dat je op de raadKnop drukt opnieuw de StringBuffer geradenletters aanmaken en deze leeghalen. Zet deze code daarom bij de globale variabelen!

2.
Code:
for (int i = 0; i < rwoord.length(); i++) {
                     if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                     {
                          puntjes.setCharAt(i, letter.charAt(0));
			  [color=green]woordLabel.setText(puntjes.toString());[/color]
                         
                     } 
                    [color=red] else {
                          missers++; 
                          int pogingen = 13 - missers;		

                     }
[/color]
                 }
Dit rode stukje is onzin en heeft niets met het aantal pogingen van de gebruiker te maken. Wat de code hier doet, is dat hij kijkt of de letter op de eerste plaats staat. Zo niet, dan missers++. Dan kijkt hij of de letter op de tweede plaats staat, zo niet missers++ enz. Dit moet je dus niet hebben! Dus volgens mij kun je dit hele else-blokje weghalen.
De groene regel moet je er juist bijvoegen. Zo zet je de puntjes met de letter op het scherm neer.

3.
Code:
                 rwoord.indexOf(letter); //zie 1 hierondre
                 woordLabel.setText(""); //zie 2 hieronder
                 toelichtingLabel.setText("Deze letter is goed!");  
                 woordLabel.setText(rwoord);//zie 2 hieronder
                 woordLabel.setText("");///zie 2 hieronder
                 meldingLabel.setText("Je hebt " + missers + " leven(s) over.");
1 - Wat bereik je hier mee?
2 - Dit zijn grote boosdoeners. In de code boven dit stukje zet je de puntjes + de geraden letters er neer. In deze code haal je de label eerst weer leeg, dan zet je het woord dat te raden is er neer, en dan haal je hem weer leeg.. Dus deze 3 regels kun je gewoon weghalen!

4.
Code:
 } //verkeerd geraden woord
             else {
                 missers++;
                 meldingLabel.setText("");
                 toelichtingLabel.setText("Je hebt " + missers + "over");
[color=green]repaint();[/color]
             }
Ook hier weer moet je de groene regel toevoegen.

Ik heb hem getest, hij doet het in principe, alleen als je een fout maakt, telt hij in dit geval i er bij op:

je hebt i over.

dus foute letter: je hebt 1 over

nog een foute letter: je hebt 2 over.. dat klopt dus niet helemaal ;)
 
Laatst bewerkt:
2.
Code:
for (int i = 0; i < rwoord.length(); i++) {
                     if (rwoord.charAt(i) == letter.charAt(0))// elke verschijning van de juiste letter vinden
                     {
                          puntjes.setCharAt(i, letter.charAt(0));
			  [color=green]woordLabel.setText(puntjes.toString());[/color]
                         
                     } 
                    [color=red] else {
                          missers++; 
                          int pogingen = 13 - missers;		

                     }
[/color]
                 }
Dit rode stukje is onzin en heeft niets met het aantal pogingen van de gebruiker te maken. Wat de code hier doet, is dat hij kijkt of de letter op de eerste plaats staat. Zo niet, dan missers++. Dan kijkt hij of de letter op de tweede plaats staat, zo niet missers++ enz. Dit moet je dus niet hebben! Dus volgens mij kun je dit hele else-blokje weghalen.
De groene regel moet je er juist bijvoegen. Zo zet je de puntjes met de letter op het scherm neer.

3.
Code:
                 rwoord.indexOf(letter); //zie 1 hierondre
                 woordLabel.setText(""); //zie 2 hieronder
                 toelichtingLabel.setText("Deze letter is goed!");  
                 woordLabel.setText(rwoord);//zie 2 hieronder
                 woordLabel.setText("");///zie 2 hieronder
                 meldingLabel.setText("Je hebt " + missers + " leven(s) over.");
1 - Wat bereik je hier mee?
2 - Dit zijn grote boosdoeners. In de code boven dit stukje zet je de puntjes + de geraden letters er neer. In deze code haal je de label eerst weer leeg, dan zet je het woord dat te raden is er neer, en dan haal je hem weer leeg.. Dus deze 3 regels kun je gewoon weghalen!

Ik heb hem getest, hij doet het in principe, alleen als je een fout maakt, telt hij in dit geval i er bij op:

je hebt i over.

dus foute letter: je hebt 1 over

nog een foute letter: je hebt 2 over.. dat klopt dus niet helemaal ;)


Haha, zo'n onzin is dat rode stukje dus niet, want bij mij klopt het aantal pogingen dat hij aangeeft als je een letter fout hebt, wel.:D Oh, ik zie al hoe dat komt. Jij hebt mijn oude code nog gebruikt, en niet de iets verbeterde versie. Daarbij heb ik in plaats van
Code:
 meldingLabel.setText("Je hebt " + [COLOR="red"]missers[/COLOR] + " leven(s) over.");
Code:
 meldingLabel.setText("Je hebt " + [COLOR="Red"]pogingen[/COLOR] + " leven(s) over.");

Ik heb een tijd zitten zoeken naar die drie regels die ik van jou weg moest halen, maar het bleek dat ik die zelf dus al had verwijderd, omdat ik er ook achter was dat het onzin was.;)

En de galg verschijnt nu inderdaad!:D Heel erg bedankt voor je hulp!:D Ik ben je eeuwig dankbaar, en dat meen ik echt.:thumb::D Je hebt me gigantisch geholpen hiermee.



Ik moet nu eigenlijk nog een paar dingen verbeteren. Het spel moet de melding geven dat het afgelopen is als het woord geraden is, en eigenlijk moet ik een langere woordenlijst hebben waar een woord uit gekozen wordt. Volgens m'n leraar kon je bij
Code:
String[] woord = new String[3];
Hooguit drie strings doen.:confused:.

Ach ja, het belangrijkste is dat het spel het doet. Dat is al heel wat!:eek:
 
ja, String[] woord = new String[3]; maakt 3 'plekken' aan waar je strings in kunt stoppen. Verander de 3 in een 5 en je kunt er 5, niet zo moeilijk. Aangezien je de woorden toch in je programmacode in de array stopt, kun je die zo makkelijk veranderen ;)

Je zou bijvoorbeeld ook een extra knop kunnen maken, die verschijnt als het woord geraden is of als je hangt (setVisible, weet je nog ;)), en daarmee zet je alle variabelen terug naar de beginwaarden, en maak je de startKnop weer zichtbaar. Goochel er maar even wat mee, het is toch meestal proberen, kijken wat er gebeurt en googelen naar eventuele dingen waar je niet uit komt ;)

succes ermee nog! :thumb:
 
Als je een variabel aantal strings wil gebruiken, dan kan je geburik maken van een ArrayList ipv van een gewone Array.
Een voorbeeld hiervan is:

Code:
ArrayList<String> lijstMetStrings = new ArrayList<String>();;

Vervolgens kan je een String toevoegen in de arraylist mbv de .add methode.

Code:
String nieuweString = "test";
lijstMetStrings.add(nieuweString);

En er weer uithalen doe je bijvoorbeeld met:

Code:
String opvraagstring = lijstMetStrings.get(1);

Een arraylist is dus eigenlijk een gewone array, maar dan met een lengte welke kan variëren.

Verder uitleg over een arraylist kan je vinden op:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html
 
Laatst bewerkt:
wat is dan het verschil tussen een vector en een arraylist?
 
Een ArrayList is niet heel goed voor gebruik bij Threads als je meerdere Threads uit dezelfde ArrayList wil laten werken dan moet de ArrayList extern gesynchroniseert worden.
Dat is met een Vector beter geregelt.
 
Nogmaals ontzettend bedankt! Alles werkt nu, en dat had ik nooit maar dan ook nooit kunnen bedenken toen ik hieraan begon. Ik heb heel wat wanhoopmomenten gehad door dit spel.
Wat een opluchting dat het nu toch gelukt is!

Niekfct, en ook killermanace: mijn dank is groot. Ik ben heel erg blij met de hulp. Zonder had ik nog steeds met een aantal stomme fouten gezeten, die voor errors zorgen.:thumb:

Nu maar hopen dat het een beetje goed beoordeeld wordt.:)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan