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.
  8 998
Hallo freaks. Jeg har holdt på med et tre på rad spill i c og har hatt litt problemer. Ideen er at jeg skal kunne spesifisere antall ruter og programmet vil funke uansett. Derfor kan jeg ikke bruke switch for å sjekke alle kombinasjonene som vil gjøre att ene spilleren vinner.

Til no har jeg kun skrevet kode til å sjekke om det er tre på rad sidelengs. Måten programmet gjør det på er se på ruten til venstre og spilleren sin brikke er der går den videre å sjekker den til høyre for den. Hvis det på et sted mangler en brikke breaker løkken. Hvis den har nådd helt til høyre vil den printe "(den sin tur det er) vinner".

Problemet er att det ikke virker. Brukte først 1 og 0 for å representere de forskjellige brikkene. Da funket det som det skulle. Fant ut at det var en dårlig ide siden verdiene i brettarray måtte ha noen verdier, naturlighvis null hvis ingenting annet er spesifisert. Så jeg bokstaver, x og o. Da fokket allt seg. For det første vil noen ganger brikkene bli plassert både der jeg sier det og på tilfeldig sted samtidig. For det andre vil ikke programmet reagere når det er 3 på rad. Hvis dere kan hjelpe meg med dette hadde det verdt utrolig fint. Har dessverre ikke kommentart koden min, dette er et skoleprosjekt så kommentarene jeg skrev var siktet mot læreren min som ikke har brukt c før, håper jeg forklarte det okei her. takk for hjelpen.

Kode

#include <stdio.h>
#define ruter 3

int main(void)
        {
        char brett[ruter-1][ruter-1];
        int spill = 1;             
        int x,y;
        char b;
        printf("for å flytte skriv (x-koordinat)/(y-koordinat)\n");

        for(x=0;x<=ruter-1;x++)
                {
                for(y=0;y<=ruter;y++)
                        {
                        brett[x][y]=' ';                 
                        } 
                }

        while(spill)
                {
                start:
                if(b=='x'){b='y';}
                else{b='x';}
                for(y=0;y<=ruter-1;y++)
                        {
                        for(x=0;x<=ruter-1;x++)
                                {
                                printf("{%c}",brett[x][y]);
                                } 
                         printf("\n"); 
                        }

                printf("%c sin tur\n",b);
                scanf("%d/%d",&x,&y);
                brett[x-1][y-1]=b;
                 for(x=0;x<=ruter-1;x++)
                        {
                        for(y=0;y<=ruter-1;y++)
                                {
                                if(brett[x][y]==b)
                                        {
                                        if(x == (ruter-1))
                                                {
                                                printf("%c vant\n",b);return 0;
                                                }
                                        }
                                else    {goto start;}
                                }
                        }
                }
        }
Sist endret av vidarlo; 17. februar 2018 kl. 21:47. Grunn: Kode-formatering
TL;DR, uten å ha giddet å studere koden nøye, så ser jeg fort at det er en del nybegynner feil her. Skal gi deg en kjapp innføring i ryddig kode.

Deklarere en macro

Kode

#define ruter 3
Alle macroer i C skal deklareres med bare store bokstaver, dette gjør det enkelt å skille macroer fra andre variabler.

Kode

#define RUTER 3
Samme gjelder også variabler deklarert med «const»-keyword

Kode

const int RUTER = 3;
Sett hakeparentesen på samme kolonne som linjen over

Og avslutt blokken ved å sette hakeparentesen på samme kolonne som du startet den på, på denne måte er det enkelt å se hvor blokken starter og slutter. Man kan enkelt trekke en strek rett ned. Se bilde:



Ikke bland enkel- og flerlinje blokker

Dette gjør det mye vanskeligere å lese koden. F.eks

Kode

if(brett[x][y]==b)
{
        if(x == (ruter-1))
        {
                printf("%c vant\n",b);return 0;                                 
        }
}
else    {goto start;}
Her har du en if-setning med flerlinjet blokk, mens du avslutter med en enkel linje else-blokk, bruk heller flerlinje blokk på else setningen også.

Kode

if(brett[x][y]==b)
{
        if(x == (ruter-1))
        {
                printf("%c vant\n",b);return 0;                                 
        }
}
else
{
        goto start; 
}
Det er greit å bruke enkel-linjer blokker hvis du gjør det hele veien, slik som her:

Kode

if(b=='x'){b='y';}
else{b='x';}
Personlig så liker jeg å sette dem opp slik at det er tydelig hva som er hva, slik:

Kode

if(b=='x') {b='y';}
else       {b='x';}
Men dette er smak å behag.

Ikke ha flere setninger på samme linje

Kode

printf("%c vant\n",b);return 0;
Splitt dem heller over på flere linjer:

Kode

printf("%c vant\n",b);
return 0;
Og til slutt, goto er fy-fy

Kode

goto start;
Dette tilhører steinalderen, bruk loops fremfor.

Tror jeg fikk med de fleste visuelle feil her, mulig det er noen jeg har oversett.
Sist endret av 0xFF; 17. februar 2018 kl. 22:36.
takk for tips, hva bør jeg bruke istedefor goto? kan ikke bruke break siden jeg skal ut av flere løkker.
Sitat av 0xFF Vis innlegg
Sett hakeparentesen på samme kolonne som linjen over
Vis hele sitatet...
Det er faktisk mange noenlunde anerkjente måter å gjøre dette på. Trådstarteren ser ut til å bruke Whitesmiths stil. Men jeg er helt enig i at dette virker rotete, selv om jeg klart foretrekker K&R over Allman som du bruker.


Men til programmet. Jeg vil anbefale å prøve å skrive så ryddig og lettlest kode som mulig, slik at det blir mye enklere å unngå og å finne feil. Noen eksempler er at du bruker en variabel som heter "b". Man skjønner når man leser koden at den representerer hvilken spiller som er aktiv, men det er jo ikke særlig lesbart. Hvorfor ikke kalle den "player" eller "active_player"? En annen ting er at det blir forvirrende med x og y. For dette brukes både som spillernavn, og som markering på brettet (selv om du sa du bruker 'x' og 'o'), og som input-variabler for koordinater, og som tellevariabler i løkkene. Noe av dette gir mening å slå sammen, andre av dem er mer hensiktsmessig å holde fra hverandre.

Jeg forstår heller ikke sjekken din mot slutten. Når du looper gjennom brettet, også sjekker du om den aktuelle ruta har blitt fylt inn av den aktive spilleren, og hvis den har blitt det så sjekker du om ruta er på den ene kanten av brettet (x == ruter-1), og hvis det er tilfellet så har man vunnet. Det er nok dette som gjør at spillet ikke virker, og den litt lave lesbarheten som gjør at du ikke så det umiddelbart selv. Så ikke undervurder lesbarhet. Velg en flyt og en navnegivning av variabler, konstanter og funksjoner som gjør koden mest mulig lesbar, som gjør det mest mulig opplagt hva du gjør og mener.

For øvrig, en enkel måte å bli kvitt den goto-en på, er å trekke ut ting i funksjoner. Du gjør enkelte distinkte ting i løpet av programflyten: Du skriver ut instruksjoner; du initialiserer brettet; du avgjør hvilken spiller det er sin tur; du skriver ut brettet; du ber om input fra aktiv spiller; og du sjekker brettet for tre like. Alt dette kan trekkes ut som separate funksjoner, og hva du velger å trekke ut er selvsagt opp til deg. Men om du sjekker brettet med en funksjon som returnerer en verdi som avhenger av om spilleren vant, så trenger du ikke å bryte ut av løkkene på samme måte, du kan bare returnere fra inni løkka.
char brett[ruter-1][ruter-1]
Skal vel være
char brett[ruter][ruter]
Takk for hjelpen folkens, men programmet mitt virker fremdeles ikke selvom det nå er mer leselig. Hvis dere har noe ideer til hvordan jeg kan få det til og virke er jeg takknemlig.
Sitat av anon7618 Vis innlegg
Takk for hjelpen folkens, men programmet mitt virker fremdeles ikke selvom det nå er mer leselig. Hvis dere har noe ideer til hvordan jeg kan få det til og virke er jeg takknemlig.
Vis hele sitatet...
Det er ganske vanskelig å si hva som ikke virker i den nye koden din uten å se den nye koden din..
Sitat av anon7618 Vis innlegg
takk for tips, hva bør jeg bruke istedefor goto? kan ikke bruke break siden jeg skal ut av flere løkker.
Vis hele sitatet...
putt:
bool break_flag=False;
et eller annet sted på starten

Putt:

if(break_flag)
break;

I slutten av ytterste for løkke.

Og bytt ut goto start med:

bool_flag=True;
break;

Beklager om jeg bommet på syntax. Lenge siden jeg har kodet c.
Men slik bruker hvertfall jeg og gjøre det.
Takk for hjelpen tenag det fikset programmet mitt, hat slitt med det i ett par timer no hehe. Jeg tenkte at siden arrays begynner på 0 ville arrayen bestått av 3*3 ruter, ja du skjønner vel. :-)