Nada

LÖSNING TILL DATALOGIÖVNING 12 - FIKTIV J-UPPGIFT

Det viktigaste är kanske inte själva programmet utan arbetssättet. I det här fallet skulle specen kunna se ut så här: SKÄRMEN: Enligt exemplet.

ALGORITM:Skriv ut uppmaningen. Läs igenom ordlistan och räkna orden. Läs filen en gång till men stoppa efter ett slumpat antal ord och ta det som hemligt ord. Låt programmet gå i en slinga tills antingen hela ordet är gissat eller nio felgissningar gjorts. I varje varv frågar vi efter en bokstav och kollar om den finns bland dom ogissade och om den finns i hemliga ordet. Vi klipper bort bokstaven från dom ogissade och klistrar in den i det synliga ordet.

MINNE: String hemligtord, synligtord, ogissade int steg (antal gjorda felgissningar)

ANROP: Hela slumpningen kan skötas med anropet hemligtord=slumpord(). I första versionen kan slumpord returnera ett givet ord.

Följande lösning är den enklaste tänkbara, inte alls någon förebild. Den har till exempel inga kommentarer och man måste starta om programmet om man vill gissa flera ord. Men det är alltid lämpligt att först försöka få en finesslös version att fungera. Slumptal kan tillverkas på flera sätt. Jag har valt det som jag tycker är enklast, Math.random(), som ger ett double-tal mellan 0 och 1.

// LÖSNING TILL J-UPPGIFT HÄNGNING    /Henrik Eriksson 99-05-01

import java.io.*; 
import java.awt.*; 

class Hangman1                                                          {
  static String hemligtord = "SLUMP"                                    ;
  static String synligtord = "-----"                                    ;
  static String ogissade = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"              ;
  public static void main(String[] args)                                {
    System.out.println("Gissa mitt ord, annars hänger jag dej!")        ;
    while(!hemligtord.equals(synligtord))                               {
      System.out.println(synligtord)                                    ;
      System.out.print(ogissade+": ")                                   ;
      char tkn=Mio.GetChar()                                            ;
      Mio.GetLine()                                                     ;
      int i=ogissade.indexOf(tkn)                                       ;
      if(i<0) continue                                                  ;
      ogissade=ogissade.substring(0,i)+ogissade.substring(i+1)          ;
      i=hemligtord.indexOf(tkn)                                         ;
      if(i<0) continue                                                  ;
      synligtord=synligtord.substring(0,i)+tkn+synligtord.substring(i+1);}
    System.out.println("Ordet var "+hemligtord)                         ;}}
//----------------------------------------------------------------------

class Hangman2                                                          {
  static String hemligtord                                              ;
  static String synligtord = ""                                         ;
  static String ogissade = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"              ;
  static String[] detalj={"stolpen","tvärslån","staget","repet","huvet",
  "kroppen","ena armen","andra armen","ena benet","andra benet"}        ;
  static int steg = 0                                                   ;
  static String slumpord()                                              {
    String filnamn="ordlista"                                           ;
    BufferedInputStream ordfil = Mio.OpenRead(filnamn)                  ;
    int n=0                                                             ;
    while(!Mio.EOF(ordfil))                                             {
      n++                                                               ;
      Mio.GetLine(ordfil)                                               ;}
    ordfil = Mio.OpenRead(filnamn)                                      ;
    int index=(int)(Math.random()*n)                                    ;
    for(int i=0;i<index;i++) Mio.GetLine(ordfil)                        ;
    return Mio.GetLine(ordfil).toUpperCase()                            ;}
  public static void main(String[] args)                                {
    hemligtord=slumpord()                                               ;
    for(int i=0;i<hemligtord.length();i++) synligtord+="-"              ;
    System.out.println("Gissa mitt ord, annars hänger jag dej!")        ;
    while(!hemligtord.equals(synligtord))                               {
      System.out.println(synligtord)                                    ;
      System.out.print(ogissade+": ")                                   ;
      char tkn=Mio.GetChar()                                            ;
      Mio.GetLine()                                                     ;
      int i=ogissade.indexOf(tkn)                                       ;
      if(i<0)                                                           {
	System.out.print("Otillåten gissning! ")                        ;
	continue                                                        ;}
      ogissade=ogissade.substring(0,i)+ogissade.substring(i+1)          ;
      int j=hemligtord.indexOf(tkn)                                     ;
      if(j<0)                                                           {
	System.out.println("Jag ritar "+detalj[steg++])                 ;
	if(steg==detalj.length) break                                   ;
	continue                                                        ;}
      synligtord=synligtord.substring(0,j)+tkn+synligtord.substring(j+1);}
    System.out.println("Ordet var "+hemligtord+"!")                     ;}}
//----------------------------------------------------------------------

class Hangman3                                                          {
  static String hemligtord                                              ;
  static String synligtord = ""                                         ;
  static String ogissade = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"              ;
  static String slumpord()                                              {
    String filnamn="ordlista"                                           ;
    BufferedInputStream ordfil = Mio.OpenRead(filnamn)                  ;
    int n=0                                                             ;
    while(!Mio.EOF(ordfil))                                             {
      n++                                                               ;
      Mio.GetLine(ordfil)                                               ;}
    ordfil = Mio.OpenRead(filnamn)                                      ;
    int index=(int)(Math.random()*n)                                    ;
    for(int i=0;i<index;i++) Mio.GetLine(ordfil)                        ;
    return Mio.GetLine(ordfil).toUpperCase()                            ;}
  public static void main(String[] args)                                {
    Frame fönster = new Frame("Hangman")                                ;
    fönster.setVisible(true)                                            ;
    Galge galge=new Galge()                                             ;
    fönster.add(galge)                                                  ;
    galge.repaint()                                                     ;
    fönster.setSize(300,400)                                            ;
    fönster.setBackground(Color.yellow)                                 ;
    hemligtord=slumpord()                                               ;
    for(int i=0;i<hemligtord.length();i++) synligtord+="-"              ;
    TextField ogissat = new TextField(ogissade)                         ;
    fönster.add(ogissat,"North")                                        ;
    while(!hemligtord.equals(synligtord))                               {
      galge.ord=synligtord                                              ;
      galge.repaint()                                                   ;
      System.out.println(synligtord)                                    ;
      System.out.print(ogissade+": ")                                   ;
      char tkn=Mio.GetChar()                                            ;
      Mio.GetLine()                                                     ;
      int i=ogissade.indexOf(tkn)                                       ;
      if(i<0) continue                                                  ;
      ogissade=ogissade.substring(0,i)+ogissade.substring(i+1)          ;
      ogissat.setText(ogissade)                                         ;
      i=hemligtord.indexOf(tkn)                                         ;
      if(i<0)                                                           {
	galge.steg++                                                    ;
	galge.repaint()                                                 ;
	continue                                                        ;}
      synligtord=synligtord.substring(0,i)+tkn+synligtord.substring(i+1);}
    galge.ord=synligtord                                                ;
    galge.repaint()                                                     ;
    System.out.println("Ordet var "+hemligtord+"!")                     ;}}

class Galge extends Canvas                                              {
  int steg=0                                                            ;
  String ord=""                                                         ;
  public void paint(Graphics g)                                         {
System.out.print(ord+" "+steg);
    g.drawString(ord,20,350)                                            ;
    g.drawArc(0,250,100,50,0,180)                                       ;
    if(steg>0) g.drawLine(50,50,50,250)                                 ;
    if(steg>1) g.drawLine(50,50,200,50)                                 ;
    if(steg>2) g.drawLine(50,100,100,50)                                ;
    if(steg>3) g.drawLine(200,50,200,70)                                ;
    if(steg>4) g.drawOval(185,70,30,30)                                 ;
    if(steg>5) g.drawLine(200,100,200,170)                              ;
    if(steg>6) g.drawLine(185,170,200,120)                              ;
    if(steg>7) g.drawLine(215,170,200,120)                              ;
    if(steg>8) g.drawLine(175,250,200,170)                              ;
    if(steg>9) g.drawLine(225,250,200,170)                              ;}}