7 svar
156 visningar
HiMate123 352
Postad: 24 okt 2021 20:51 Redigerad: 24 okt 2021 20:58

Hjälp med en funktion

Hej, 
programmerar ett spel (tic tac toe) och har fastnat på funktion. 
"kontrolleraSpel".
Är väldigt osäker på hur jag ska gå tillväga där och undrar om någon kan ge mig tips på vad jag kan göra :(

 

(Kontrollera gärna min kod också om nån kan)

UPPGIFT:

Ett program måste skapas där två spelare kan spela Tic-Tac-Toe ("Farmer's Chess").
Det måste skrivas / kodas för fem funktioner,

void resetSpel ()
Alla element / mellanslag / "rutor" i gBrett är inställda på "  " (blank / mellanslag).

ritaSpel ()
Skriver ut det aktuella innehållet i spelet med ett utseende som anges nedan.

bool kontrolleraSpel (const int n)
Kontrollerar och returnerar om n finns på tavlan (index 0-8) och om utrymmet / rutten är ledig eller inte.
(Men man sätter inte en markering (X / O) , det görs i / av spelet.)

bool kontrolleraVinnar ()
Hittar och returnerar true / false till om någon spelare har tre i rad (horisontellt, vertikalt eller
på en av de två diagonalerna).

int spelaSpelet ()
Denna funktion är "motor / hjärna" i spelet. Det looper tills nio bitar är inställda, eller så
någon har vunnit (har tre i rad). Det kommer att växla mellan vilken av de två spelarna som sätter det
nästa bit ('X' eller 'O'). Efter varje placering skrivs spelet ut.
Det returnerar spelarens nummer (1, 2) som har vunnit, möjligen 0 (noll) om ingen vinner.

#include <stdio.h>          //  printf, scanf
#include <stdbool.h>        //  bool
#include <ctype.h>          //  toupper
#include <stdlib.h>


#define  ANTRUTER    9      ///<  Antal rutor på spelet.
const int STRLEN  = 80;     ///<  Textlengd

void resetSpel();
bool kontrolleraSpel(const int n);
bool kontrolleraVinnar();
void ritaSpel();
int  spelSpelet();
char gBrett[ANTRUTER];     ///<  spelet.

int main()
{
    char spelar1[STRLEN];           //  Båda spelarnas namn.
    char spelar2[STRLEN];
    char nyttSpel;                  //  Kör programmet / spelet EN gång igen.
	int  vinnar;                 // evt. spelare som har vunnit.

    do  {
      resetSpel();
      ritaSpel();

      printf("\n\nNamn på spelar 1:  ");     gets(spelar1);
      printf("Namn på spelar 2:  ");         gets(spelar2);  printf("\n");

      vinnar = spelSpelet();

      if      (vinner == 1) printf("\nGrattis %s!!\n\n", spelar1);
      else if (vinner == 2) printf("\nGrattis %s!!\n\n", spelar2);
                                     //  'vinner' == 0:
      else    printf("\nIngen vinner den här gången tyvärr.\n\n");

      printf("\n\nEn ny omgång (N/J):  ");
      scanf(" %c", &nyttSpel);  nyttSpel = toupper(nyttSpel);
      getchar();

    }  while (nyttSpel == 'J');

    return 0;
}
/* -------------------------------------------------------------------*/
bool kontrolleraSpel (const int n)
{

}

/* -------------------------------------------------------------------*/

void ritaSpel() {

    printf("\t\nTic Tac Toe\n");
    printf("\t---1-----2-----3---\n");
    printf("\t|  %c  |  %c  |  %c  |\n",gBrett[0], gBrett[1], gBrett[2]);
    printf("\t---4-----5-----6---\n");
    printf("\t|  %c  |  %c  |  %c  |\n",gBrett[3], gBrett[4], gBrett[5]);
    printf("\t---7-----8-----9---\n");
    printf("\t|  %c  |  %c  |  %c  |\n",gBrett[6], gBrett[7], gBrett[8]);
    printf("\t ----------------------\n");

}

/* -------------------------------------------------------------------*/
    void resetSpel(){
        for (int i = 0; i < ANTRUTER; i++)
        gBrett[i] = ' ';
}

// Återställer spelet så att alla rutor är tomma.

/* -------------------------------------------------------------------*/

    bool kontrolleraVinnar()
{
    if (gBrett[0] == gBrett[1] && gBrett[1] == gBrett[2])
    {
        return 1;
    }
    else if (gBrett[3] == gBrett[4] && gBrett[4] == gBrett[5])
        return 1;

    else if (gBrett[6] == gBrett[7] && gBrett[7] == gBrett[8])
        return 1;

    else if (gBrett[2] == gBrett[5] && gBrett[5] == gBrett[8])
        return 1;

    else if (gBrett[1] == gBrett[4] && gBrett[4] == gBrett[7])
        return 1;

    else if (gBrett[0] == gBrett[3] && gBrett[3] == gBrett[6])
        return 1;

    else if (gBrett[2] == gBrett[4] && gBrett[4] == gBrett[6])
        return 1;

    else if (gBrett[0] == gBrett[4] && gBrett[4] == gBrett[8])
        return 1;

    else if (gBrett[0] != '1' && gBrett[1] != '2' && gBrett[2] != '3' &&
        gBrett[3] != '4' && gBrett[4] != '5' && gBrett[5] != '6' && gBrett[6]
        != '7' && gBrett[7] != '8' && gBrett[8] != '9')
        return 0;
}

/*Kontrollerar alla möjliga kombinationer, dvs horisontell, horisontell och tvär.
Om någon av dem är lika, exklusive ' ', anges en vinnare.*/

/* -------------------------------------------------------------------*/

   int spelSpelet() {
    char val
    spelar = (speler % 2) ? 1 : 2;

    printf("Speler %i, Velg ett tall:  ", speler);
    scanf("%i", &val);

    merk = (spelar == 1) ? 'X' : 'O';

        if (val == 1 && gBrett[0] == '1')
            gBrett[0] = merk;

        else if (val == 2 && gBrett[1] == '2')
            gBrett[1] = merk;

        else if (val == 3 && gBrett[2] == '3')
            gBrett[2] = merk;

        else if (val == 4 && gBrett[3] == '4')
            gBrett[3] = merk;

        else if (val == 5 && gBrett[4] == '5')
            gBrett[4] = merk;

        else if (val == 6 && gBrett[5] == '6')
            gBrett[5] = merk;

        else if (val == 7 && gBrett[6] == '7')
            gBrett[6] = merk;

        else if (val == 8 && gBrett[7] == '8')
            gBrett[7] = merk;

        else if (val == 9 && gBrett[8] == '9')
            gBrett[8] = merk;

        else
        {
            printf("Ogiltigt val. Välj igen! ");

            spelar--;
            getch();
        }
        i = kontrolleraVinnar();

        spelar++;
    }while (i ==  - 1);

}

beerger 962
Postad: 24 okt 2021 23:11 Redigerad: 24 okt 2021 23:13

Vad är spelerspelSpelet? Den variabeln är inte initialiserad?

Samma med merk

Kan du kompilera din kod? Du borde få många varningar.

beerger 962
Postad: 24 okt 2021 23:14

För att svara på frågan:

Det är väl bara returnera true om gBrett[n] är antingen 'X' eller 'O'?

HiMate123 352
Postad: 25 okt 2021 09:25

Asså.spelSpelet ska vara typ ”motorn” i spelet. Den ska göra så att spelar 1&2 ska kunna välja vart dom bil placera X och O. 
jag har spenderat 3-4 dagar och fattar inte varför den inte funkar… får typ 7 varning totalt just nu. 

merk ska typ markera X och O. Tex om spelar 1 skriv 1, så ska array [0] markeras tex med X. Om du fattar..

HiMate123 352
Postad: 25 okt 2021 09:26
beerger skrev:

För att svara på frågan:

Det är väl bara returnera true om gBrett[n] är antingen 'X' eller 'O'?

Aa men exakt, det är så den ska göra 

Lindehaven 820 – Lärare
Postad: 25 okt 2021 10:04
HiMate123 skrev:

Asså.spelSpelet ska vara typ ”motorn” i spelet. Den ska göra så att spelar 1&2 ska kunna välja vart dom bil placera X och O. 
jag har spenderat 3-4 dagar och fattar inte varför den inte funkar… får typ 7 varning totalt just nu. 

Den första anledningen till att det inte funkar är att koden inte går att kompilera. Börja med att rätta kompileringsfelen och sedan varningarna:

||=== Build: Debug in Tic Tac Toe by HiMate123 (compiler: GNU GCC Compiler) ===|
main.c||In function 'main':|
main.c|33|error: 'vinner' undeclared (first use in this function); did you mean 'vinnar'?|
main.c|33|note: each undeclared identifier is reported only once for each function it appears in|
main.c|22|warning: variable 'vinnar' set but not used [-Wunused-but-set-variable]|
main.c||In function 'spelSpelet':|
main.c|117|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'spelar'|
main.c|117|error: 'spelar' undeclared (first use in this function)|
main.c|117|error: 'speler' undeclared (first use in this function)|
main.c|120|error: 'val' undeclared (first use in this function)|
main.c|122|error: 'merk' undeclared (first use in this function)|
main.c|156|warning: implicit declaration of function 'getch'; did you mean 'getc'? [-Wimplicit-function-declaration]|
main.c|158|error: 'i' undeclared (first use in this function)|
main.c|161|error: expected identifier or '(' before 'while'|
main.c|163|error: expected identifier or '(' before '}' token|
main.c||In function 'kontrolleraSpel':|
main.c|50|warning: control reaches end of non-void function [-Wreturn-type]|
main.c||In function 'kontrolleraVinnar':|
main.c|108|warning: control reaches end of non-void function [-Wreturn-type]|
main.c||In function 'spelSpelet':|
main.c|161|warning: control reaches end of non-void function [-Wreturn-type]|
||=== Build failed: 9 error(s), 5 warning(s) (0 minute(s), 0 second(s)) ===|

Deklarera de variabler du använder så blir du av med de flesta felen.

Lägg till ett semikolon på rätt ställe så blir du av med error: expected '=', ',', ';', 'asm' or '__attribute__' before 'spelar'.

Lägg till do { på rätt ställe så blir du av med expected identifier or '(' before 'while'.

HiMate123 352
Postad: 25 okt 2021 12:43

Men har du nån ide om hur jag kan skriva bool kontrolleraSpel funktionen? 

Lindehaven 820 – Lärare
Postad: 25 okt 2021 12:49
HiMate123 skrev:
beerger skrev:

För att svara på frågan:

Det är väl bara returnera true om gBrett[n] är antingen 'X' eller 'O'?

Aa men exakt, det är så den ska göra 

@beerger gav dig ett bra tips så du behöver endast skriva koden.

Svara
Close