Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 2582
Hei!

Jeg har holdt på med Java i ca. 20 måneder, men sitter litt fast på det siste prosjektet mitt.

Skulle prøve å lage et veldig basic hang-man spill. Alt ser ut til å fungerer greit, utenom at jeg ikke klarer å fylle opp en array som skal bestå av chars. Jeg skal fylle den opp med '_'. som skal representere de tomme plassene i ordet man gjetter på.

Her er koden:
SPOILER ALERT! Vis spoiler


Kode

/**
 * HANG-MAN V0.1
 * 
 * AUTHOR: VAB
 * 
 **/

import java.util.Scanner;

public class hangMan 
{
	
	public static void main(String args[])
	{	
		Scanner keyboard = new Scanner(System.in); // scanner to get input from user
		
		int minusPoints = 0, start;
		char guessChar, temp = '.';

		String sWord = ""; // the word that we are supposed to guess (secretWord)
		
		System.out.println("WELCOME TO HANGMAN V1.0");
		System.out.println("_________________________");
		System.out.println("");
		
		toHost(sWord);
		
		// Where you place the correctly guessed chars (guessWord)
		char [] gWord = new char[sWord.length()]; 
		
		System.out.println("Type 1 to start");
		System.out.println("");
		start = keyboard.nextInt();
		
		if (start == 1)
		displayDesc(args);
		else 
		System.exit(0);
		
		fillArray(gWord, sWord);
		
		do 
		{
			displayArray(gWord);
			System.out.println("");
			System.out.println("Minuspoints: " + minusPoints);
			System.out.println("Guess a character: ");
			guessChar = keyboard.next().charAt(0);
			checkGuess (guessChar, gWord, temp, sWord, minusPoints);
		}
		while (minusPoints < 7);
		
		System.out.println("");
		System.out.println("You loose!");
	
		
	}
	
	// game-rules
	public static void displayDesc(String args[])
	{
		System.out.println("Description: ");
		System.out.println("You are supposed to guess a secret word.");
		System.out.println("Every time you guess wrong, you get 1 point.");
		System.out.println("Once you reach 7 points, you loose.");
		System.out.println("You win when you are sucessfully guessed the word");
		System.out.println("");
	}
	
	// information to game-host
	public static void toHost(String word)
	{
		Scanner keyboard = new Scanner(System.in); // scanner to get input from user
		
		System.out.println("Type in the word to guess: ");
		word = keyboard.nextLine(); // get input  from the user
		
		System.out.println("Remember to 'right-click > clear'");
		System.out.println("before showing to user");
		System.out.println("");
		
	}
	
	public static void fillArray(char [] array, String word)
	{
		for (int i = 0; i < word.length(); i++ )
			array[i] = '_';
	}
	
	// display the array
	// DOES NOT WORK
	public static void displayArray(char [] array)
	{
		System.out.print("Word: " );
		
		for (int i = 0; i < array.length; i++)
		{
			System.out.println(array[i]);
		}

	}
	
	public static void checkGuess(char guess, char [] array, char temp, 
			String sWord, int minusPoints)
	{
		// search the array and check if the char matches
		for (int i = 0; i > array.length; i++)
		{
			// if the char matches, place it in the array
			if (guess == sWord.charAt(i))
			{
				temp = sWord.charAt(i);
				array[i] = temp;
			}
			else
			{
				minusPoints++;
			}
		}
	}
	
	
	
}
Du gjør jo det i fillArray-funksjonen din? Problemet der er at du legger det inn, men returnerer den ikke igjen fra funksjonen.

Kode

    public static char[] fillArray(char [] array, String word) 
    { 
        for (int i = 0; i < word.length(); i++ ) {
            array[i] = '_'; 
        }
        return array;
    }
Om jeg husker java-syntax riktig:

Kode

char[] foo = new char[<lengde på array>];
foo.fill(array, 0);
note: forumet har fubar visning av code-tags, bytt ut 0 med "_"

Du har altså prøvd å lære deg Java i 20mnd uten å få til å fylle et array? Jeg blir imponert
Sist endret av liasis; 19. november 2014 kl. 18:32. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av moridin Vis innlegg
Om jeg husker java-syntax riktig:

Kode

char[] foo = new char[<lengde på array>];
foo.fill(array, 0);
note: forumet har fubar visning av code-tags, bytt ut 0 med "_"

Du har altså prøvd å lære deg Java i 20mnd uten å få til å fylle et array? Jeg blir imponert
Vis hele sitatet...
I læreplanen, og de 4 bøkene vi er innom på IB, fyller vi en array med for-loops. Så du kan spare deg for spydige kommentarer.

Og det er 2mnd, ikke 20.

Og kan dere ikke fortelle meg hva som er galt med koden over, istedet for å klage på meg?

Det fungerer HELT ypperlig å fylle en array på den måten jeg har gjort, så lenge det er en integer eller String array (det er det eneste jeg har prøvd). Hvorfor fungerer det ikke med en char-array?
Sist endret av Claryn; 19. november 2014 kl. 18:49. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Om du ønsker deg mindre spydige kommentarer får du nesten komme med noe fornuftig info for at folk skal hjelpe deg da.

F.eks, hvilken feilmelding får du? Enten så gir kompilatoren deg en exception, eller så får du en exception når du kjører programmet. Hva er denne? Eller forventer du helt seriøst at folk skal gidde å kompilere programmet ditt for å se feilmeldingen for deg?
Sist endret av liasis; 19. november 2014 kl. 18:56. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av Ueland Vis innlegg
Du gjør jo det i fillArray-funksjonen din? Problemet der er at du legger det inn, men returnerer den ikke igjen fra funksjonen.

Kode

    public static char[] fillArray(char [] array, String word) 
    { 
        for (int i = 0; i < word.length(); i++ ) {
            array[i] = '_'; 
        }
        return array;
    }
Vis hele sitatet...
Dette ser heller ikke ut til å fungere. Arrayen er fortsatt tom etter fillArray methoden

Sitat av moridin Vis innlegg
Om du ønsker deg mindre spydige kommentarer får du nesten komme med noe fornuftig info for at folk skal hjelpe deg da.

F.eks, hvilken feilmelding får du? Enten så gir kompilatoren deg en exception, eller så får du en exception når du kjører programmet. Hva er denne? Eller forventer du helt seriøst at folk skal gidde å kompilere programmet ditt for å se feilmeldingen for deg?
Vis hele sitatet...
Det er ingen feilmelding. Tror kanskje du skal lese hele posten min. Problemet er at arrayen ikke fylles. Den er fortsatt tom.
Sist endret av Claryn; 19. november 2014 kl. 18:58. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
ओम नमो नारायण
Dodecha's Avatar
DonorCrew
Sitat av Claryn Vis innlegg
I læreplanen, og de 4 bøkene vi er innom på IB, fyller vi en array med for-loops. Så du kan spare deg for spydige kommentarer.

Og det er 2mnd, ikke 20.

Og kan dere ikke fortelle meg hva som er galt med koden over, istedet for å klage på meg?

Det fungerer HELT ypperlig å fylle en array på den måten jeg har gjort, så lenge det er en integer eller String array (det er det eneste jeg har prøvd). Hvorfor fungerer det ikke med en char-array?
Vis hele sitatet...
Siden jeg ikke har noe bedre her leker jeg djevelens advokat.

Det moridin mener her er at programmering generellt krever at man er ressurssterk, finne løsninger selv ved å søke på nett (div forum er en gullgruve for programmeringsproblemer).
Et char array er temmelig elementær kunnskap, noe jeg ville tro man møter på allerede i side to i flere av programmeringsbøkene jeg har liggende.

moridin er ikke ute etter å angripe deg personlig, men å gi et lite puff i retningen til å få deg til å forstå at programmering er et vanskelig og omfattende tema, og det blir absolutt ikke enklere fremover.
Sitat av Dodecha Vis innlegg
søke på nett (div forum er en gullgruve for programmeringsproblemer).
Vis hele sitatet...
Har brukt formiddagen på å finne løsning på problemet selv. Fant ingen, så jeg spurte på et forum jeg kjenner godt. Det jeg blir møtt med er spydige kommentarer på at jeg ikke har denne kunnskapen fra før. Fra en i Crew, vel og merke.
Problemet ditt oppstår helt i starten av programmet. Koden for å fylle arrayet virker forsåvidt, men i starten av programmet instansieres
sWord

Kode

String sWord = ""; // the word that we are supposed to guess (secretWord)
I metoden toHost settes tilsynelatende variabelen lik det brukeren skriver, men dette stemmer ikke. Java er "pass-by-value", som betyr at argumentene du sender inn i metoden sendes med verdien, ikke med referansen. Når du så skriver

Kode

word = keyboard.nextLine(); // get input  from the user
vil dette kun skje innad i metoden din, men vil ikke bli reflektert utenfor metoden. Referansen endres altså ikke, kun verdien du sendte inn i metoden.

Med andre ord vil fortsatt sWord-variabelen være lik "" etter at metoden "toHost" er fullført, og returnerer (void). Dersom du hadde tatt en System.out.println() av variabelen sWord rett etter at metoden toHost er ferdig kjørt, vil du få en tom linje, uten tekst. Når du så skal fylle arrayet, er lengden på sWord lik 0 tegn, og vil derfor ikke sette inn underscore.

En enkel fiks er å skrive

Kode

sWord = toHost();
for så å endre metoden toHost til

Kode

 // information to game-host 
    public static String toHost() 
    { 
        Scanner keyboard = new Scanner(System.in); // scanner to get input from user 
         
        System.out.println("Type in the word to guess: "); 
        String word = keyboard.nextLine(); // get input  from the user 
         
        System.out.println("Remember to 'right-click > clear'"); 
        System.out.println("before showing to user"); 
        System.out.println(""); 
        
        return word;
    }
Litt kjekt lesestoff om parametere i Java, hvis du er interessert:
http://www.yoda.arachsys.com/java/passing.html
http://stackoverflow.com/questions/4...-pass-by-value

EDIT: Fort gjort å gjøre feil her. Tydeligvis ingen andre som oppdaget denne feilen heller..
Sist endret av hosjmeister; 19. november 2014 kl. 19:13.
Sitat av hosjmeister Vis innlegg
Problemet ditt oppstår helt i starten av programmet. Koden for å fylle arrayet virker forsåvidt, men i starten av programmet instansieres
sWord

Kode

String sWord = ""; // the word that we are supposed to guess (secretWord)
I metoden toHost settes tilsynelatende variabelen lik det brukeren skriver, men dette stemmer ikke. Java er "pass-by-value", som betyr at argumentene du sender inn i metoden sendes med verdien, ikke med referansen. Når du så skriver

Kode

word = keyboard.nextLine(); // get input  from the user
vil dette kun skje innad i metoden din, men vil ikke bli reflektert utenfor metoden. Referansen endres altså ikke, kun verdien du sendte inn i metoden.

Med andre ord vil fortsatt sWord-variabelen være lik "" etter at metoden "toHost" er fullført, og returnerer (void). Dersom du hadde tatt en System.out.println() av variabelen sWord rett etter at metoden toHost er ferdig kjørt, vil du få en tom linje, uten tekst. Når du så skal fylle arrayet, er lengden på sWord lik 0 tegn, og vil derfor ikke sette inn underscore.

En enkel fiks er å skrive

Kode

sWord = toHost();
for så å endre metoden toHost til

Kode

 // information to game-host 
    public static String toHost() 
    { 
        Scanner keyboard = new Scanner(System.in); // scanner to get input from user 
         
        System.out.println("Type in the word to guess: "); 
        String word = keyboard.nextLine(); // get input  from the user 
         
        System.out.println("Remember to 'right-click > clear'"); 
        System.out.println("before showing to user"); 
        System.out.println(""); 
        
        return word;
    }
Litt kjekt lesestoff om parametere i Java, hvis du er interessert:
http://www.yoda.arachsys.com/java/passing.html
http://stackoverflow.com/questions/4...-pass-by-value

EDIT: Fort gjort å gjøre feil her. Tydeligvis ingen andre som oppdaget denne feilen heller..
Vis hele sitatet...
Flott. Dette løste jo problemet, og ga mening!

Det som er så gøy med programmering er at problemene dukker opp overalt. Nå skjer tydeligvis samme feilen i checkGuess methoden. Her må jeg altså returnere både arrayen og minusPoints. Kan dette gjøres på en elegant måte?

Det første jeg tenker er at jeg kan returnere arrayen, og teste om man skal legge på et minuspoeng når arrayen er sendt tilbake til main-method? Hvis det er mulig å returnere en hel array, da.
Ja, dette kan gjøres på en elegant måte. Dette kalles for klassevariabler, og blir det neste steget videre. Jeg har tidligere skrevet en post om basic objektorientert programmering, som du kan lese her. Java er et objektorientert språk, og jo før du lærer deg de generelle prinsippene om objektorientering jo bedre. Antar du har en lærebok som forklarer dette, men les gjerne posten min. Finnes også mange gode filmer på youtube om temaet.

I dette eksempelet kan du for eksempel lage en klassevariabel som heter "minusPoints". Denne må da ligge utenfor main-metoden, som betyr at den tilhører klassen, ikke metoden. Typisk er slik som dette:

Kode

public class hangMan  
{ 
    private static int minusPoints = 0;
    public static void main(String args[]) 
    {     
            
            //Mainmetoden din... 
            //Fjern din instansiering av minusPoints-variabelen
    } 
}
Du kan da fjerne alle metode-argumenter som viser til minusPoints-variabelen, ettersom dette er en variabel som blir tilgjengelig for alle metodene i klassen.

Til slutt kan du da la checkGuess-metoden returnere arrayet.
Sitat av hosjmeister Vis innlegg
Ja, dette kan gjøres på en elegant måte. Dette kalles for klassevariabler, og blir det neste steget videre. Jeg har tidligere skrevet en post om basic objektorientert programmering, som du kan lese her. Java er et objektorientert språk, og jo før du lærer deg de generelle prinsippene om objektorientering jo bedre. Antar du har en lærebok som forklarer dette, men les gjerne posten min. Finnes også mange gode filmer på youtube om temaet.

I dette eksempelet kan du for eksempel lage en klassevariabel som heter "minusPoints". Denne må da ligge utenfor main-metoden, som betyr at den tilhører klassen, ikke metoden. Typisk er slik som dette:

Kode

public class hangMan  
{ 
    private static int minusPoints = 0;
    public static void main(String args[]) 
    {     
            
            //Mainmetoden din... 
            //Fjern din instansiering av minusPoints-variabelen
    } 
}
Du kan da fjerne alle metode-argumenter som viser til minusPoints-variabelen, ettersom dette er en variabel som blir tilgjengelig for alle metodene i klassen.

Til slutt kan du da la checkGuess-metoden returnere arrayet.
Vis hele sitatet...
Supert. Takk skal du ha. Det der visste jeg egentlig, men blir litt forvirret med alle parameterne og returns osv! Skal lese gjennom posten. Takk skal du ha!
SÅ mye på han her når jeg hadde java på skolen:

https://www.youtube.com/playlist?lis...2CE09D83EE3E28

Er noen videoer om arrays rundt video 32
Sist endret av SJefen; 19. november 2014 kl. 19:39.