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 1583
Holder på å lage et "spill" i java, har litt problem med en metode.
Metoden skal kontrollere at en streng er gyldig. Det vil si:

- kontrollere om strengen "hemmelig" har samme lengde som innStreng
- kontrollere at alle tegn i den angitte strengen er lovlige (tegnene er: "+-*#")
- kontrollere at hvert tegn fra den hemmelige strengen må forekomme max en gang i "innStreng".

Noen som kan hjelpe meg å lage den? har prøvd i evigheter, står litt stille.
med fruktkjøtt.
Tias's Avatar
Crew
Hva har du laget så langt?
Innestengt
Spelly's Avatar
Trådstarter
dette er forsøk nr 3 på å skrive metoden som skal gjøre det nevnte:

Kode

public static boolean erGyldig(String innStreng) {
  
  for (int z = 1; z == innStreng) {
    if (innStreng.length() == hemmelig.length() {
      if  (innStreng.indexOf(hemmelig.charAt(n)) == -1) {
        
      }
    }
Sist endret av Spelly; 17. februar 2011 kl. 17:03.
Kan kanskje lage en metode til deg seinere i kveld om du ikke får gjort det til da.
Lover ingenting så ikke skyt meg om jeg legger meg i stedenfor.
Queen of Blades
Jonta's Avatar
DonorCrew
Du har blandet sammen "=" (tilordne) og "==" (sjekk)

Tja, noe slikt kanskje?

Spelleyness.java:

Kode

public class Spelley {

        public static void main(String[] args) {

                String innStreng = "-+*#";
                String hemmelig = "+-#*";
                System.out.println(Hithere.erGyldig(innStreng, hemmelig));
        }
}
Hithere.java:

Kode

public class Hithere {

public static boolean erGyldig(String innStreng, String hemmelig) {

  //Har ikke noen vits å gjøre noe mer i metoden om denne returnerer false
  if(innStreng.length() != hemmelig.length()) {
    return false;
  }

  //Tenkte først ha egne countere for hver char, men blir nok ryddigere å slenge dem inn i en array
  //Kan eventuelt opprette en egen array utifra String hemmelig.
  char[] charRekke = {'+', '-', '*', '#'};

  for(int inn = 0; inn < innStreng.length(); inn++) {
    for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
      if(innStreng.charAt(inn) != charRekke[gyldig]) {
        return false;
      }
    }
  }
  //metoden må returnere noe, og om den kommer gjennom alle hindrene kommer den hit
  return true;
}
}
Dette støter på false en eller annen plass. Spelleyness.java skriver hvertfall ut false. Men du har hvertfall et utgangspunkt.

Ser ut som noe vagt mastermind-aktig.
"+-*#" eneste tegnene som skal være lovlige?
Queen of Blades
Jonta's Avatar
DonorCrew
Sitat av reaVen Vis innlegg
"+-*#" eneste tegnene som skal være lovlige?
Vis hele sitatet...
Ehm, ja? Jfr. førstepost. Tegnene er altså, pluss, minus, stjerne og hash. (ikke hermetegn)

Kode

public static boolean erGyldig(String innStreng) {
  for (int i = 0; i < innStreng.length() - 1; i++) {
    if (innStreng.substring(i + 1).contains(innStreng.charAt(i) + "")) {
      return false;
    }
  }
  return innStreng.length() == hemmelig.length() &&
                  !innStreng.matches(".*[^+*#-].*");
}
Sitat av Jonta Vis innlegg
[/code]Hithere.java:

Kode

public class Hithere {

public static boolean erGyldig(String innStreng, String hemmelig) {

  //Har ikke noen vits å gjøre noe mer i metoden om denne returnerer false
  if(innStreng.length() != hemmelig.length()) {
    return false;
  }

  //Tenkte først ha egne countere for hver char, men blir nok ryddigere å slenge dem inn i en array
  //Kan eventuelt opprette en egen array utifra String hemmelig.
  char[] charRekke = {'+', '-', '*', '#'};

  for(int inn = 0; inn < innStreng.length(); inn++) {
    for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
      if(innStreng.charAt(inn) != charRekke[gyldig]) {
        return false;
      }
    }
  }
  //metoden må returnere noe, og om den kommer gjennom alle hindrene kommer den hit
  return true;
}
}
Vis hele sitatet...
Her tror jeg du har snublet. Prøv den på norsk da; så blir det kansje lettere å innse: Ordrett er vel det du har skrevet der : Hvis innstrengens første tegn IKKE er lik det aller første tegnet i tabellen, nemmelig '+', så er strengen ugydelig (av False returnert) som et resultat av dette, selv om første tegn kan være f.eks '*', da det også er et gyldig tegn.
Sist endret av blueshift; 18. februar 2011 kl. 07:40.
Queen of Blades
Jonta's Avatar
DonorCrew
blueshift: Ah, stemmer. Hm, kan eventuelt gjøre noe slik med kodesnutten du markerte:

Kode

  for(int inn = 0; inn < innStreng.length(); inn++) {
    int teller = 0;
    for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
      if(innStreng.charAt(inn) != charRekke[gyldig]) {
        teller++;
      }
      if(teller >= 4) {
        return false;
      }
      else {
        teller = 0;
    }
  }
(Har ikke testet koden, men formidler hvertfall idéen)
Innestengt
Spelly's Avatar
Trådstarter
Takker for gode tilbakemeldinger!
Det stemmer at dette er noe mastermind-aktig spill.

Får dessverre ikke programmet til å fungere i det hele tatt, jeg har prøvd å fikse feilmeldinger i timesvis uten resultat. I begynnelsen hadde jeg 4 feilmeldinger, no har jeg 18.

er det noen som kunne hjulpet meg å rydde litt i koden?

Kode

import java.util.Scanner;

public class MasterMind1 {
//hemmelig streng  
  public static final String hemmelig = "+-*#";
  
  // Metoden teller hvor ofte en tegn forekommer i en streng.

  public static int antallForekomst(char tegn, String streng) {
    
    int[] teller = new int[4]; //Dekalerer teller
    
    for (int i = 0; i < hemmelig.length(); i++) { //teller hvor ofte et tegn forekommer i en streng
      
      if (streng.charAt(i) == '+') {teller [0] ++; } 
      if (streng.charAt(i) == '-') {teller [1] ++; } 
      if (streng.charAt(i) == '*') {teller [2] ++; } 
      if (streng.charAt(i) == '#') {teller [3] ++; }
    }
  }
  for(int i = 0; i < teller.length; i++) {   
  }
  
  // Metoden kontrollere at alle tegn i den angitt strengen forekommer i den hemmelige strengen.
  public static boolean harLovligeTegn(String innStreng) { 
    for (int n = 0; n < hemmelig.length(); n++) { 
      if (innStreng.indexOf(hemmelig.charAt(n)) == -1) { 
        return false; 
      } 
    } 
    return true; 
  }
 
  /* 
   * Metoden kontollerer at alle tegn fra den hemmelige strengen forekommer høyst én gang i 
   * den angitte strengen. */
  public static boolean kontrollerForekomster(String innStreng) {
    if (hemmelig.charAt(innStreng) == tegn) antall = 1;  {
      return false;
    }
    {
  
  return true;
    }  
}
  
// Metoden kontrollere at strengen er gyldig:

public static boolean erGyldig(String innStreng, String hemmelig) {

  for(int inn = 0; inn < innStreng.length(); inn++) {
    int teller = 0;
    for(int gyldig = 0; gyldig < charRekke.length; gyldig++) {
      if(innStreng.charAt(inn) != charRekke[gyldig]) {
        teller++;
      }
      if(teller >= 4) {
        return false;
      }
      else {
        teller = 0;
    }
  }

      
      // Metoden teller antall riktige tegn som er på riktig plass i den angitte strengen.
      public static int antallRiktige(String innStreng) {
        int antallRiktige = 0;
        if (erGyldig()(innStreng)) {
          // teller antall tegn på riktig plass
          for (int i = 0; i < innStreng.length(); ++i) {
            if (innStreng.charAt(i) == hemmelig.charAt(i)) {
              ++antallRiktige;
            }
          }
          System.out.println("Strengen innholder " + antallRiktige + " tegn på riktig plass.");
        }
        return antallRiktige;
      }
      
      public static void main(String[] args) {
        //Sett opp lesing fra tastatur
        Scanner tastatur = new Scanner(System.in);
        
        boolean ferdig = false;
        do {
          // Les ny streng
          System.out.println("Angi streng med lengde " + hemmelig.length() + 
                             " som innholder tegn fra {+, -, *, #}:");
          String streng = tastatur.nextLine();
          
          // er programmet ferdig?
          ferdig = (antallRiktige(streng) == hemmelig.length());
        } while (!ferdig);
        
        System.out.println("Gratulerer! Strengen er lik hemmelig streng.");    
      }
}    
}
Mulig den ser litt rotete ut, dette fordi jeg har endret på litt underveis.

Betaler forøvrig gledelig 50.- som takk, til den som kan hjelpe meg å rydde opp koden.
jamen yolo da.
barstuck's Avatar
Alle syntaktiske feil her er enkle å luke ut, og ser for meg mest ut som slurvefeil. Du bør lese bedre gjennom koden din. Hvis du, som du sier, faktisk har lett etter feil i flere timer og ikke ser hva som er feil selv med hjelp av feilmeldingene fra kompilatoren (som som oftest er ganske hjelpsomme, siden de både forteller deg hvilken type feil det er og hvor den oppstod), bør du kanskje lese deg mer opp på syntaks. I tillegg bør du passe på å indentere koden din skikkelig, da vil det være lettere å oppdage når du f.eks. ikke har avsluttet en metode. (Eventuelt bruk en editor med autoindentering...)


Kildene til feilmeldingene, listet etter i hvilke metoder de forekommer:

- antallForekomst: Den tomme for-løkken din er definert utenfor metoden, flytt den opp slik at den er innenfor. I tillegg må metoden returnere en int.

- kontrollerForekomster: "if (hemmelig.charAt(innStreng) == tegn)"
Her referer du til en variabel, tegn, som ikke har blitt initalisert noe sted.

- erGyldig: Samme som kontrollerForekomster, charRekke referer ikke til noe. I tillegg mangler du to krøllparenteser for å avslutte metoden, og du må huske å sørge for at det alltid returneres en boolean, ikke bare hvis teller >= 4.

- antallRiktige: "if (erGyldig()(innStreng))" Her må du fikse på parentesene for metodekallet, og når du har gjort det, må du sørge for at parametrene du gir til erGyldig, stemmer.

I tillegg er det en krøllparentes for mye helt på slutten av klassen.


Koden din kompilerte hos meg etter at jeg hadde fikset disse feilene.
Her er hele koden, fjerna så å si 2 lr 3 metoder, da disse ikke var nødvendig ved å utvide en av dem.
http://pastebin.com/H8BP5a74 // her er hele koden din, commenta ut det som ikke var i bruk, eller hadde 0 funksjon

http://pastebin.com/jza3QArH // her er en ryddet versjon

Under kommer en enda penere versjon, der main kommer først, så alle metoder.

Kode

import java.util.Scanner;

public class MasterMind1 {
//hemmelig streng  
  public static final String hemmelig = "+-*#";
  
  //Programmets main metode.
  public static void main(String[] args) {
    //Sett opp lesing fra tastatur
    Scanner tastatur = new Scanner(System.in);
    boolean ferdig = false;
    
    do {
      // Les ny streng
      System.out.println("Angi streng med lengde " + hemmelig.length() + 
                         " som innholder tegn fra {+, -, *, #}:");
      String streng = tastatur.nextLine();
      
      // er programmet ferdig?
      ferdig = (antallRiktige(streng) == hemmelig.length());
    } while (!ferdig);
    System.out.println("Gratulerer! Strengen er lik hemmelig streng.");    
  }
  
  /* Metoden kontollerer at alle tegn fra den hemmelige strengen forekommer høyst én gang i 
   * den angitte strengen. */
  public static boolean kontrollerForekomster(String innStreng) {
    for(int i = 0; i < innStreng.length(); i++){
      if((innStreng.charAt(i) == '+') ||
         (innStreng.charAt(i) == '*') ||
         (innStreng.charAt(i) == '-') ||
         (innStreng.charAt(i) == '#')){ return true;}
    }
    return false; 
  }
//Teller antall riktige tegn klienten har fått på et gitt forsøk, returnerer antall riktige tegn.
  public static int antallRiktige(String innStreng) {
    int antallRiktige = 0;
    if (kontrollerForekomster(innStreng)) {
      // teller antall tegn på riktig plass
      for (int i = 0; i < innStreng.length(); ++i) {
        if (innStreng.charAt(i) == hemmelig.charAt(i)) {
          ++antallRiktige;
        }
      }
      System.out.println("Strengen innholder " + antallRiktige + " tegn på riktig plass.");
    }
    return antallRiktige;
  }
}