Vinnaren i pepparkakshustävlingen!
2020-01-14, 14:54
  #1
Medlem
Carbonatas avatar
Jag har lekmannamässiga kunskaper i främst PHP men även lite i JavaScript sedan innan, men är däremot helt ny inom Java. Nu är det så att jag har fått i uppgift att skriva ett luffarschack-spel som ska köras i konsolen. För nuvarande har jag kommit en bit på vägen med mitt program, nedan följer vad jag redan har skrivit:

- Spelplanen, i form av en tvådimensionell array
- En metod för att skriva ut spelplanen i konsolen
- En metod för att skriva ut spelbrickorna på spelplanen

Här är min kod hittills:

Kod:
package tictactoe;
import java.util.Scanner;

public class Tictactoe {

    public static void main(String[] args) {

        char[][] gameboard = {
            {'-', '-', '-'},
            {'-', '-', '-'},
            {'-', '-', '-'}
        };

        char turn = 'X';
        int position;

    }

    public static void printGameboard(char[][] gameboard) {

        for(int i = 0; i < 3; i++) {

            for(int j = 0; j < 3; j++) {
                System.out.print(gameboard[i][j] + " ");
            }
            
            System.out.println();

        }
    }

    public static void placePiece(char[][] gameboard, int position, char turn) {

        switch(position) {

            case 1:
            gameboard[0][0] = turn;
            break;

            case 2:
            gameboard[0][1] = turn;
            break;

            case 3:
            gameboard[0][2] = turn;
            break;

            case 4:
            gameboard[1][0] = turn;
            break;

            case 5:
            gameboard[1][1] = turn;
            break;

            case 6:
            gameboard[1][2] = turn;
            break;

            case 7:
            gameboard[2][0] = turn;
            break;

            case 8:
            gameboard[2][1] = turn;
            break;

            case 9:
            gameboard[2][2] = turn;
            break;

        }
    }
}

Som ni ser så har jag tre variabler i min main-metod. Spelplanen, spelarens tur (antingen X eller O) samt vilken position spelaren väljer att placera X/O på. Eftersom att turn = 'X'; så innebär det att spelare X börjar per default. Variabeln för spelarens valda position är hittills bara deklarerad men har inget värde. Det är nu jag börjar bli lite osäker på hur jag ska implementera nästa steg...

Istället för att ha all kod i main-metoden, så har jag istället skapat metoder för de olika nödvändiga komponenterna, som sedan ska anropas i main-metoden. Det jag vill göra härnäst är en slags "spärr" som ser till att användaren enbart kan mata in talen 1-9 (dessa symboliserar de 9 rutorna på spelplanen). Jag skapade en separat klass för att experimentera lite med detta, vilken ser ut såhär:

Kod:
package integerValidation;
import java.util.Scanner;

public class IntegerValidation {

    public static void main(String[] args) {
        
        int number;
        Scanner input = new Scanner(System.in);
        System.out.print("Please enter a number between 1-9: ");
        
        if(input.hasNextInt() == true) {
        
            number = input.nextInt();

            if(number >= 1 && number < 10) {
                System.out.print("Correct! The number is between 1-9."):
            }

            else {
                System.out.print("Incorrect! The number must be between 1-9.")
            }
        }

        else {
            System.out.print("Incorrect! You didn't even enter a number.");
        }
    }
}

Nu till mitt problem

Programmet som testar huruvida det användaren matar in först och främst är ett tal, och i andra hand att det är ett tal mellan 1-9 verkar fungera. Jag har däremot svårigheter att implementera detta i mitt luffarschack-program. Även detta bör ju rimligtvis vara en separat metod utanför main-metoden, som sedermera anropas i main-metoden. I och med detta så ska ju inte variabeln position deklareras i main-metoden, utan i validateInput()-metoden.

Min teori är att validateInput()-metoden bör returnera ett boolean-värde baserat på om inmatningen är godkänd eller inte, men jag har inte den blekaste aning om hur man bär sig åt för att göra detta. Jag har ännu inte riktigt förstått alla keywords som står framför diverse metoder, men om jag inte missförstått någonting så står i alla fall void för att metoden inte har något return-värde. Bör i sådana fall min validateInput()-metod definieras som "public static boolean validateInput()"?

Och om det nu stämmer att denna metod bör returnera ett boolean-värde, hur skulle man i sådana fall skriva om den? I den första if-satsens condition borde jag ju returnera true, men hur fungerar det med de andra två else-satserna? I den första if-satsens else så vill jag ju returnera false, men även i den nästlade if-satsens else... Det ställer till det i huvudet på mig!

Insåg nu att det blev ett riktigt jävla mastigt inlägg, ber om ursäkt för detta. Tack på förhand för all hjälp
Citera
2020-01-14, 15:18
  #2
Medlem
Innan jag kommenterar något annat i din kod måste jag fråga: Varför har du två olika main-metoder?

Jag avråder dig från att skapa en särskild klass för heltalsvalidering. Det är lämpligare att göra en metod för detta ändamål.
__________________
Senast redigerad av RainOfMisery 2020-01-14 kl. 15:32.
Citera
2020-01-14, 15:26
  #3
Medlem
Om du vill ha en metod som returnerar en boolean så gör du som följande:

Kod:
 
public boolean isThisTrue(int x) {
     return(x > 0 && x < 10);
}

Metoden i fråga tar då in en int x (baserat på användarens inmatning i den metod där du frågar efter det) och returnerar true i de fall då x är större än 0 och mindre än 10. I alla andra fall returnerar den false.

Du kan då skriva en if-sats e.g.
Kod:
 if(isThisTrue(userInput)) {
     //Dostuff
} else while(!isThisTrue(userInput)){
      System.out.println("Fel: det inmatade talet måste vara inom range 1-9");
      userInput = input.nextInt();
}

Nu har jag inte några jättekunskaper inom Java, men något i ovan stil borde fungera för ditt ändamål.

På tal om ingenting så såg jag nu föregående postares fråga och som jag tolkar det så är det inte två klasser i samma program, utan två separata program. Om så inte är fallet så måste du tänka om då du ej bör ha två mainklasser.
Citera
2020-01-14, 15:53
  #4
Medlem
Carbonatas avatar
Citat:
Ursprungligen postat av RainOfMisery
Innan jag kommenterar något annat i din kod måste jag fråga: Varför har du två olika main-metoder?

Jag avråder dig från att skapa en särskild klass för heltalsvalidering. Det är lämpligare att göra en metod för detta ändamål.

Sorry, jag var lite otydlig i trådstarten. Den andra main-metoden är ett helt separat Java-projekt som jag skapade i syfte att testa min kod för att verkligen se till att den fungerar innan jag lägger till den som en egen metod i första main-metoden. De har alltså ingenting med varandra att göra, jag ville bara visa min kod.
Citera
2020-01-14, 16:03
  #5
Medlem
Carbonatas avatar
Citat:
Ursprungligen postat av Zzarox
Om du vill ha en metod som returnerar en boolean så gör du som följande:

Kod:
 
public boolean isThisTrue(int x) {
     return(x > 0 && x < 10);
}

Metoden i fråga tar då in en int x (baserat på användarens inmatning i den metod där du frågar efter det) och returnerar true i de fall då x är större än 0 och mindre än 10. I alla andra fall returnerar den false.

Du kan då skriva en if-sats e.g.
Kod:
 if(isThisTrue(userInput)) {
     //Dostuff
} else while(!isThisTrue(userInput)){
      System.out.println("Fel: det inmatade talet måste vara inom range 1-9");
      userInput = input.nextInt();
}

Nu har jag inte några jättekunskaper inom Java, men något i ovan stil borde fungera för ditt ändamål.

På tal om ingenting så såg jag nu föregående postares fråga och som jag tolkar det så är det inte två klasser i samma program, utan två separata program. Om så inte är fallet så måste du tänka om då du ej bör ha två mainklasser.

Allright! Saken är bara den att jag måste köra den första if-satsen innan variabeln kan tilldelas ett värde.

Kod:
if(input.hasNextInt() == true)

Detta betyder att "om det som matas in är en integer, returnera true. Om detta condition stämmer så kan sedan detta värde tilldelas till min variabel, vilket jag gör för att förhindra att användaren matar in en string, vilket skulle resultera i att beräkningen i den nestade if-satsen inte skulle kunna exekveras.

Jag ska kika på din kod iaf, tack! Och precis, jag var lite otydlig tidigare men jag har alltså inte två main-metoder i samma .java-dokument

Vad är det för skillnad på public static boolean och enbart public boolean när man deklarerar en klass?
Citera
2020-01-14, 16:44
  #6
Medlem
Carbonatas avatar
Här är metoden jag kommit fram till hittills:

Kod:
public static boolean inputValidation(Scanner input) {

    System.out.print("Enter your position: ");

    if(input.hasNextInt() == true) {

        int position = input.nextInt();

        if(position >= 1 && position < 10) {
            return true;
        }

        else {
            return false;
        }
    }

    else {
        return false;
    }
}

Alltså, om användaren matar in en integer, så deklareras variabeln position och tilldelas det inmatade värdet. Därefter kontrolleras om talet befinner sig inom det accepterade omfånget. Gör den inte det så returneras false inuti den nestade if-satsen, och else i den ursprungliga if-satsen returnerar false om inmatningen inte är en integer.

Jag får dock följande felmeddelanden när jag försöker anropa min metod i main-metoden:

- position cannot be resolved to a variable
- Syntax error on token "int", delete this token

Såhär ser det ut när jag callar metoden i main-metoden:

Kod:
if(validateInput(input) == true) {
    placePiece(gameboard, int position, turn);
}

Förresten så är metoden placePiece() placerad ovanför validateInput() i min IDE, men det ska väl inte spela någon roll, eller? Felmeddelandena tror jag beror på att placePiece()-metoden inte har tillgång till position-variabeln, som ju deklareras i validateInput()-metoden. Hmmmmm...
Citera
2020-01-14, 22:31
  #7
Medlem

Ett exempel på hur man kan lösa det, nu behövs bara en funktion som kollar ifall någon har vunnit.
Citera
2020-01-18, 13:57
  #8
Medlem
Carbonatas avatar
Citat:
Ursprungligen postat av coffeemug

Ett exempel på hur man kan lösa det, nu behövs bara en funktion som kollar ifall någon har vunnit.

Nice! Som jag förstår det så är det validMove()-metoden som ser till att användaren enbart kan knappa in talen 1-9? Har bara hunnit kika på din kod lite snabbt men ska kolla lite mer noggrant sedan när jag har tid
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback