Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
I skiftet fra din gamle spilleplade-klasse til den nye, har du ændret følgende: char spilleplade[3][3]; til char spilleplade; Så du kan oprette den nødvendige plads dynamisk, med new-operatoren.
Men hvis du skal oprette dit array dynamisk, skal du lige huske at bruge en char-pointer i stedet for blot en char. Altså \"char spilleplade;\" => \"char *spilleplade;\"
og GODT NYTÅR til dig også (og alle andre selvfølgelig ;)
WOW... Den havde jeg ikke lige opdaget, i din kode:
Problemet er at du når du deklarerer din array som \"char *spilleplade\", skal du allokerer det som et \"ET-dimensionelt\" array...
Du kan vist godt ændre det så du kan bruge det som et \"TO-dimensionelt\", men jeg er ikke lige 100% sikker på hvordan, så jeg tror hellere jeg vil forklare hvordan du kan gøre den med det \"ET-dimensionelle\" :)
Desuden bliver det vist en del mere besværligt, med den \"TO-dimensionelle\" løsning: Min læsning kræver KUN 4-5 små ændringer: void Spilleplade::fyldSpilleplade() char * Spilleplade::getSpilleplade() char Spilleplade::getFelt(int x, int y) void Spilleplade::setFelt(int x, int y, char b)
Jeg gentager hele din kode, og skriver kommentarer der hvor jeg har lavet lidt ændringer:
SPILLEPLADE.H: ==============
// Spilleplade.h: interface for the Spilleplade class. // //////////////////////////////////////////////////////////////////////
class Spilleplade { public: char *spilleplade; //Den her havde du nok selv ændret, men nu er den med for god orden skyld void setSidelaengde(int s); void setFelt(int X, int Y, char b); char getFelt(int X, int Y); void fyldSpilleplade(); char * getSpilleplade(); Spilleplade(); virtual ~Spilleplade();
void Spilleplade::fyldSpilleplade() //Ændring 1 { //Alloker den nødvendige plads som et \"ET-dimensionelt\" array spilleplade = new char[sidelaengde * sidelaengde]; //Nu er der ikke længere nogen grund til at bruge to løkker, du skal bare huske at fortsætte //så længe i < sidelængde * sidelængde for(int i = 0;i < sidelaengde * sidelaengde; i++) { spilleplade[i]= \' \'; } }
char * Spilleplade::getSpilleplade() //Ændring 2 { //Du har allerede en char-pointer, så den skal bare returneres, //men jeg vil tro det er en levn fra den gamle løsning return spilleplade; }
char Spilleplade::getFelt(int x, int y) //Ændring 3 { //Når nu du KUN har en dimension at arbejde i, skal du huske at oversætte fra //to dimensioner til en char felt = spilleplade[y * sidelaengde + x]; return felt; }
void Spilleplade::setFelt(int x, int y, char b) //Ændring 4 { //Den samme oversættelse som bruges i getFelt(int x, int y) spilleplade [y * sidelaengde + x] = b; }
tak for dit meget fine svar, Nu er jeg næsten færdig med mit program, jeg får dog denne fejl når jeg prøver at køre programmet, har du nogen ide om hvad det er??
void kontrol::run() { char * besked = \"Indtast navnet på spiller 1: \"; mySkaerm.UdskrivBesked(besked); spiller1.setNavn(mySkaerm.spillerNavn()); spiller1.setBrik(\'X\'); spiller1.setAntalBrikker(3);
char * besked2 = \"Indtast navnet på spiller 2: \"; mySkaerm.UdskrivBesked(besked2); spiller2.setNavn(mySkaerm.spillerNavn()); spiller2.setBrik(\'O\'); spiller2.setAntalBrikker(3);
int temp; temp = mySkaerm.sidelaengde(); mySpilleplade.setSidelaengde(temp);
void kontrol::rykBrik(char b) { bool rb; while(rb) { int fX; int fY; char * besked = \"Indtast koordinaterne på den brik du ønsker at flytte\\n\"; mySkaerm.UdskrivBesked(besked); fX = mySkaerm.getKoordinater(\'X\'); fY = mySkaerm.getKoordinater(\'Y\'); char test = mySpilleplade.getFelt(fX,fY); if (test == b) { int tX; int tY; char * besked = \"Indtast koordinaterne på det sted du ønsker at indsætte brikken\\n\"; mySkaerm.UdskrivBesked(besked); tX = mySkaerm.getKoordinater(\'X\'); tY = mySkaerm.getKoordinater(\'Y\'); if(valider(tX,tY)) { mySpilleplade.setFelt(fX,fY,\' \'); mySpilleplade.setFelt(tX,tY,b); rb = false;
} else { bool ok = false; while(!ok) { char * besked2 = \"Feltet er optaget.\\n\"; mySkaerm.UdskrivBesked(besked2); char * besked = \"Indtast koordinaterne på det sted du ønsker at indsætte brikken\\n\"; mySkaerm.UdskrivBesked(besked); tX = mySkaerm.getKoordinater(\'X\'); tY = mySkaerm.getKoordinater(\'Y\'); ok = valider(tX,tY); } mySpilleplade.setFelt(fX,fY,\' \'); mySpilleplade.setFelt(tX,tY,b); rb = false; } } else { char * besked = \"Dette er ikke din brik\\n\"; mySkaerm.UdskrivBesked(besked); } }
}
void kontrol::indsaetBrik(char b) { bool ud; while(ud) { int X; int Y; X = mySkaerm.getKoordinater(\'X\'); Y = mySkaerm.getKoordinater(\'Y\'); bool ok = valider(X,Y); if (ok) { mySpilleplade.setFelt(X,Y,b); char * besked = \"Brikken er korekt indsat\\n\"; mySkaerm.UdskrivBesked(besked); ud = false; } else { char * besked = \"Brikken kunne ikke indsættes, da feltet ikke var tomt - vælg et andet koordinat\\n\"; mySkaerm.UdskrivBesked(besked); ud = true; } } }
bool kontrol::tjekTrePaaStribe() { char pl1 = mySpilleplade.getFelt(0,0); char pl2 = mySpilleplade.getFelt(0,1); char pl3 = mySpilleplade.getFelt(0,2); if (pl1 == pl2 && pl2 ==pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\"; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(0,0); pl2 = mySpilleplade.getFelt(1,0); pl3 = mySpilleplade.getFelt(2,0); if (pl1 == pl2 && pl2 ==pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(2,0); pl2 = mySpilleplade.getFelt(2,1); pl3 = mySpilleplade.getFelt(2,2); if (pl1 == pl2 && pl2 ==pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(0,2); pl2 = mySpilleplade.getFelt(1,2); pl3 = mySpilleplade.getFelt(2,2); if (pl1 == pl2 && pl2 == pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(2,0); pl2 = mySpilleplade.getFelt(1,1); pl3 = mySpilleplade.getFelt(0,2); if (pl1 == pl2 && pl2 == pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(0,0); pl2 = mySpilleplade.getFelt(1,1); pl3 = mySpilleplade.getFelt(2,2); if (pl1 == pl2 && pl2 == pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(1,0); pl2 = mySpilleplade.getFelt(1,1); pl3 = mySpilleplade.getFelt(1,2); if (pl1 == pl2 && pl2 == pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } else { pl1 = mySpilleplade.getFelt(0,1); pl2 = mySpilleplade.getFelt(1,1); pl3 = mySpilleplade.getFelt(2,1); if (pl1 == pl2 && pl2 == pl3 && pl2 != \' \') { char * besked = \"Der er 3 på stribe, og spillet er slut.\\n\" ; mySkaerm.UdskrivBesked(besked); return false; } } } } } } } } return true; }
Når nu jeg har sat koden ind her, og du kan se metoden tjekTrePaaStribe(), har du så noget bud på hvordan jeg laver den om, så den kan bruges i det dynamiske spil jeg har lavet??
Du skal selvfølgelig nok få point for det også, hvis du har tid til at hjælpe mig.
Angående din link-fejl (LNK2001): ---------------------------------
Nu kan jeg ikke lige finde funktionen \"getSidelaengde\" i din Spilleplade-klasse, men jeg vil næsten gå ud fra at du har tilføjet den til klasse-definitionen (i Spilleplade.h). Fejlen plejer (i mine tilfælde) at skyldes: At funktionen er deklareret At funktionen bliver kaldt: mySkaerm.udskrivSpilleplade(mySpilleplade.getSidelaengde(),mySpilleplade.getSpilleplade()); Men den er IKKE defineret (i Spilleplade.cpp)
Hvis ikke det er det der er galt, har du så mulighed for at sende hele dit projekt til mig (mbulow@mail.tele.dk), så kan jeg kigge på det i sammenhænge :)
(Det vil også gøre det lidt nemmere, hvis jeg skal kunne komme med et bud, på din tjekTrePaaStribe-funktion)
PS!!! Jeg tillader mig altså at poste de andre tre funktioner, som tre selvstændige beskeder, for at få lidt overblik... De er lidt store pga. kommentarerne, men ellers fylder de under 50 linjer :)
/* Check om der med udgangspunkt i fejl (X,Y), retning (dX,dY), er en hel række med de samme brikker (\'X\', \'O\' eller \' \')
Grunden til at jeg vælger at medsende hvilken brik der skal checkes for, er at jeg vil gå ud fra at du, enten kalder funktionen vha. tjekStribenMedXY, eller du selv kalder funktionen, men så checker du vel efter en hel skribe hver gang der bliver sat en brik, og så ved du også hvad der skal ledes efter
Beskrivelse: ============ Alle felterne på den valgte stribe checkes for at finde, et felt med en anden værdi en \"brik\" Findes der én værdi der ikke er identisk med \"brik\", return false Er det ikke gået galt, når vi har checket hele striben, returneres true
Argumentliste: ============== cBrik: Den brik der skal ledes efter X: X koordinatet for hvor striben begynder Y: Y koordinatet for hvor striben begynder dX: Det næste felt, der skal checkes ligger dX ud af x-aksen... (Mulige værdier: -1, 0, 1) dY: Det næste felt, der skal checkes ligger dY ud af y-aksen... (Mulige værdier: -1, 0, 1)
Returværdi: =========== true: Den aktuelle stribe er fyldt med \"cBrik\"-brikker false: Den aktuelle stribe er IKKE fyldt med \"cBrik\"-brikker
/* Check om der går en vinder-stribe igennem feltet (X,Y) Først aflæses der hvilken brik der er i feltet (X,Y), hvorefter den brik bruges til at checke alle tænkelige striber Der checkes vandret, lodret, og begge diagonaler (hvis nødvendigt)
Argumentliste: ============== X: X koordinaten for det felt hvis mulige striber skal checkes Y: Y koordinaten for det felt hvis mulige striber skal checkes
Returværdi: =========== true: Der gik en vinder-stribe gennem dette felt false: Der gik IKKE en vinder-stribe gennem dette felt */ bool kontrol::tjekStribenMedXY(int X, int Y) { char cFeltVaerdi;
if(X >= 0 && X < mySpilleplade.getSidelaengde() && Y >= 0 && Y < mySpilleplade.getSidelaengde()) { //OK, vi har i det mindste et validt koordinatsæt, så langt så godt :) cFeltVaerdi = mySpilleplade.getFelt(X, Y); if(cFeltVaerdi != \' \') //Ingen blanke felter i hel stribe { //Checke rækken med (X,Y) if(tjekEnHelStribe(cFeltVaerdi, 0, Y, 1, 0)) //Næste felt ligger en til højre return true; //Checke søjlen med (X,Y) if(tjekEnHelStribe(cFeltVaerdi, X, 0, 0, 1)) //Næste felt ligger en længere nede return true; //På den ene diagonal vil X og Y altid være ens if(X == Y) if(tjekEnHelStribe(cFeltVaerdi, 0, 0, 1, 1)) return true; //På den anden diagonal vil summen af X og Y altid være én mindre end sidelængden if(X+Y == mySpilleplade.getSidelaengde()-1) if(tjekEnHelStribe(cFeltVaerdi, mySpilleplade.getSidelaengde()-1, 0, 1, -1)) return true; } }
/* Check hele pladen for at finde ud af om der er en vindende stribe Er der det, returneres vinder-brikken, ellers returneres \' \' (Et tomt felt)
Beskrivelse: ============ Checker hele spillepladen igennem efter en vinder-række Først løbes alle koordinaterne igennem, i den første række, og for hvert koordinatsæt, kaldes tjekStribenMedXY, der checker om der løber en vinder-stribe igennem feltet (Findes der en vinder-stribe, returneres spiller-brikken) Bagefter gentages det samme med alle koordinaterne i den første søjle. Blev der ikke fundet en vinder, returneres \' \' (Et tomt felt)
Returværdi: =========== \'X\': Spiller X har en hel stribe på pladen \'Y\': Spiller Y har en hel stribe på pladen \' \': Der er ingen vinder, endnu
Bemærkning: =========== Godt nok checker jeg diagonalerne to gange, men jeg prioriterede læsbarhed fremfor optimering */ char kontrol::tjekHelePladenForStribe() { //Check alle søjler for(int x = 0; x < mySpilleplade.getSidelaengde(); x++) if(tjekStribenMedXY(x, 0)) return mySpilleplade.getFelt(x, 0); //Check alle rækker for(int y = 0; y < mySpilleplade.getSizelaengde(); y++) if(tjekStribenMedXY(0, y)) return mySpilleplade.getFelt(0, y);
Jeg har lavet funktioner med den forudsætning at pladen altid vil være lige stor på begge leder.
Derudover er jeg ABSOLUT IKKE SIKKER på at jeg ikke har lavet en fejl, for jeg har ikke rigtig haft muligheden for at checke det, når jeg ikke har resten af koden, men du skal være velkommen til at råbe højt hvis det kikser for meget til at du selv kan finde fejlen i min kode :)
UPS!!! Jeg kan egentlig se, når jeg tænkter mig lidt om, at \"tjekHelePladenForStribe\" checker hele første søjle og række, sidelaengde gange, og begge diagonaler to gange, så det er måske ikke den bedste funktion at bruge... Men nu kan jeg heller ikke rigtig se nogen grund til overhoved, på noget tidspunkt, at checke hele pladen, for du checker vel hver gang der er blevet sat en brik, og så kan du jo bare bruge \"tjekStribenMedXY\" :)
Hold da helt k***, jeg har godt nok været træt da jeg lavede det her (og er stadig ;)
Du skal lige lave en lille ændring i funktionen \"bool kontrol::tjekStribenMedXY(int X, int Y)\": Linjen: if(tjekEnHelStribe(cFeltVaerdi, mySpilleplade.getSidelaengde()-1, 0, 1, -1)) skal skiftes ud med: if(tjekEnHelStribe(cFeltVaerdi, mySpilleplade.getSidelaengde()-1, 0, -1, 1))
Altså bytte om på 1 og -1 i de sidste to parametre til tjekEnHelStribe. Mankan jo ikke starte i øverste højre hjørne, og bevæge sig ned og til højre :/ DOH
Og hvis du vil ha\' en version af \"char kontrol::tjekHelePladenForStribe()\", der ikke laver for mange checks kan du prøve at skifte den ud med:
Kan du ikke skrive hej som svar, så du kan få dine point.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.