Gå til innhold

Er det noen som kan fortelle meg hvorfor dette programmet ik


Anbefalte innlegg

// Login.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <iostream.h>

 

int main(int argc, char* argv[])

{

 

 

char Abb[4] = "Hei";

 

char Nei[10];

 

cout << "Logon: ";

cin >> Nei;

 

if (Nei == Abb) {

cout << "Login success" << endl << endl;

}

else {

 

cout << "Login falure..." << endl << endl;

}

return 0;

 

}

 

hver gang jeg tester det får jeg bare logon falure... er det noen som hvet hva som er galt?

 

[ Denne Melding var redigert av: mais på 2002-05-27 19:07 ]

Lenke til kommentar
Videoannonse
Annonse

Den klassiske c-feilen :smile:

 

Når du skriver "if (Nei == Abb) ... "

 

sammenlikner du addressene til vairablene 'Nei' og 'Abb', og de vil aldri være like.

 

Skriv isteden:

 

if (strcmp(Nei, Abb) == 0) ...

 

'strcmp' returnerer 0 hvis strengene er like.

 

For å bruke funksjonen må du slenge på

 

#include <string.h>

 

i begynnelsen av programmet ditt

Lenke til kommentar
  • 1 måned senere...

Skulle like gjerne skrive en post, så da tar jeg med et kode-eksempel... Hva er galt her?

 

Code:

#include <iostream.h>
#include <string.h>

int main()
{
char passWord[8] = "mittpass";
char login[8];
cout << "Login: ";
cin >> login;
if (strcmp(login, passWord) == 0)
cout << "Login succeeded! Good welcome, Citizen!n";
else
cout << "Incorrect password!n";
return 0;
}

 

Som i mais' program, det kompilerer glatt men uansett hva jeg skriver inn får jeg "Incorrect password". Hva er galt..?

 

Et lite spm til.. Går det an å skrive:

if (!strcmp(login, passWord))

 

Hvis stringene er like evalueres strcmp(...) til 0. if(0) evalueres til false. Så hvis strcmp IKKE evalueres til 0 bør det jo da blir true. Som å skrive if (!0). Funker det?

Lenke til kommentar

Tror du må ha størrelsen 9 på char arrayene dine. Det siste elementet (som blir lagt til automatisk) er, hvis jeg husker rett, tegnet "". "Null-terminert char array"

 

Quote:


Den 2002-07-01 17:57, Myubi skrev:

Skulle like gjerne skrive en post, så da tar jeg med et kode-eksempel... Hva er galt her?


Code:


#include <iostream.h>
#include <string.h>

int main()
{
char passWord[8] = "mittpass";
char login[8];
cout << "Login: ";
cin >> login;
if (strcmp(login, passWord) == 0)
cout << "Login succeeded! Good welcome, Citizen!n";
else
cout << "Incorrect password!n";
return 0;
}

 

Som i mais' program, det kompilerer glatt men uansett hva jeg skriver inn får jeg "Incorrect password". Hva er galt..?

 

Et lite spm til.. Går det an å skrive:

if (!strcmp(login, passWord))

 

Hvis stringene er like evalueres strcmp(...) til 0. if(0) evalueres til false. Så hvis strcmp IKKE evalueres til 0 bør det jo da blir true. Som å skrive if (!0). Funker det?

 


Lenke til kommentar

Mais & Myubi:

 

Hør på Langbein, men i tillegg må dere bruke cin.getline(streng, strengLengde) i stedet for cin >> ... .

 

 

 

Myubi:

 

Husk at nullterminatoren også er et tegn i strengen, slik at du må bruke passWord[9].

 

Quote:

Et lite spm til.. Går det an å skrive:

if (!strcmp(login, passWord))


 

Ja. Det ser ryddigere ut, og er dessuten mye mer 1337 :smile:

 

 

 

Mais:

 

Det heter "failure", ikke "falure". :wink:

 

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-01 19:36 ]

Lenke til kommentar

Takk, mente det var no cin.ettellerannet, visste bare ikke HVA!

 

Ett spørsmål til, hva er galt med:

 

// Testing if board is filled.

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

{

for (int j = 0; j < 3; j++)

{

if (none == gameBoard[j]) // Counts open squares

finished++;

}

}

 

if (0 == finished) // Ends game if board is full

{

run = FALSE;

cout << "Game over!n";

return 0;

}

 

Det er et lite tic tac toe-spill jeg driver med. none er en enumerajon. Idéen bak kodebiten ovenfor er at den skal telle antall tomme felt på brettet, og for hvert tomme felt skal den legge til 1 til finished. Så til slutt sjekker den om finished er 0 eller ikke. Hvis finished er null har den ikke funnet noen tomme felt, og dermed er spillet over. (FALSE er også en enumerasjon. Hele spillet er inne i en while(run)-loop, run er satt til TRUE.

 

Hvis mer av koden er nødvendig så si ifra.

 

Noen som har noen forslag til hvordan jeg skal få sjekket om noen har fått tre på rad, forresten?

 

_________________

Linux inside.

 

[ Denne Melding var redigert av: Myubi på 2002-07-01 23:09 ]

Lenke til kommentar

Hmm, jeg kan ikke umiddelbart se noen feil med koden. Hva er det som skjer, eller hva er det som ikke skjer? Er du sikker på at feilen ligger i denne kodebiten?

 

Det hadde kanskje hjulpet (meg, i hvert fall :smile: ) om du hadde postet hele kildekoden. Hvis den er lang, kan du jo poste en link til en side der du legger den, eller eventuellt maile meg ([email protected]).

 

Uansett, for å sjekke om noen har tre på rad, tror jeg du bør lagre brikkeplasseringene for spillerne i hver sin matrise. Deretter kan du bruke noe liknende det jeg har skrevet under.

 

(Koden under er ikke nødvendigvis bra skrevet, ferdig eller kjørbar, men er kun ment å hjelpe deg i gang.)

 

Alle kodesnuttene sjekker for diverse varianter av 3 på rad i en 3*3 matrise ved navn player1.

 

 

1. Dette sjekker for 3 på rad enten vannrett eller loddrett, avhengig av om du skriver

 

if (player1[j][k] == 1)

 

eller

 

if (player1[k][j] == 1)

 

 

Code:

int player1Win = 0, antallPaaRad = 0;


for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
if (player1[j][k] == 1)
antallPaaRad++;
}

if (antallPaaRad == 3)
{
player1Win = 1;
break;
}

antallPaaRad = 0;
}

 

 

2. Dette sjekker for 3 på rad langs den ene diagonalen...

 

Code:

for (int j = 0; j < 3; j++)
{
if (player1[j][j] == 1)
antallPaaRad++;
}

 

 

3. ...og dette sjekker for 3 på rad langs den andre diagonalen.

 

Code:

for (int j = 0; j < 3; i++)
{
if (player1[j][2-j] == 1)
antallPaaRad++;
}

 

Merk: på de to siste gadd jeg ikke å inkludere en sjekk på om antallPaaRad var lik 3 eller ikke. Dette klarer du glatt selv, håper jeg :smile:

 

 

Jeg regner med at dette kan sette deg igang med å lage din egen tre-på-rad-sjekk.

 

Mvh.

THX 1138

 

 

 

Redigert:

Hmm.. etter mye redigering håper jeg at dette ser riktig ut. Problemet var at noen av i-ene med firkant-brackets faktisk ble tolket som at jeg ville skrive i kursiv, selv om de var innenfor code-brackets! Rart. Sikkert meg som gjorde noe feil :razz:

 

Redigert igjen:

Nå har jeg rett og slett byttet ut alle i-er med j-er, og alle j-er med k-er. Håper det går denne gangen...

 

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-02 01:09 ]

Lenke til kommentar

Quote:


Den 2002-07-02 00:32, THX 1138 skrev:

Det hadde kanskje hjulpet (meg, i hvert fall :smile: ) om du hadde postet hele kildekoden. Hvis den er lang, kan du jo poste en link til en side der du legger den, eller eventuellt maile meg (
).


 

// --------------------------------------------------------

// Tic tac toe

//

// Author: Lars ... (LS)

// Created (Start): 01/07/2002 (LS)

//

// Version: 0.1

//

// A simple Tic tac toe-game.

// --------------------------------------------------------

 

#include <iostream.h>

 

// Enumerations

enum BOOL { FALSE, TRUE };

enum Piece { none, blue, red }; // Enumerates pieces, to tell

// what is on a square by it's

// value.

 

// Main thing

int main()

{

// Initializes gameBoard with all empty squares.

Piece gameBoard[3][3] = { none,none,none, none,none,none, none,none,none };

// Other initializations

int tempX, tempY;

int run = TRUE, turn = blue, error = FALSE, finished = 0;

// Instructions

cout << "Welcome to Tic tac toe!n";

cout << "Note that: n";

cout << "0 = No piecen";

cout << "1 = Blue piecen";

cout << "2 = Red piecenn";

cout << "Also, the game doesn't recognize a winner.n";

cout << "You must play 'till the board is full, and see n";

cout << "for yourself who the winner is.n";

 

// Gameplay

while (run)

{

 

// Testing if board is filled.

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

{

for (int j = 0; j < 3; j++)

{

if (none == gameBoard[j]) // Counts open squares

finished++;

}

}

 

if (0 == finished) // Ends game if board is full

{

run = FALSE;

cout << "Game over!n";

return 0;

}

 

do // Enter co-ords and check if square is occupied

{

cout << "nBoard: n";

for (int i = 0; i < 3; i++) // Prints board to screen

{

for (int j = 0; j < 3; j++)

cout << gameBoard[j] << " ";

cout << "n";

}

 

if (blue == turn)

cout << "Blue's turn.n";

else

cout << "Red's turn.n";

cout << "nEnter co-ords (1-3):n";

cout << "X: ";

cin >> tempX;

cout << "Y: ";

cin >> tempY;

if (gameBoard[tempX-1][tempY-1] == red || gameBoard[tempX-1][tempY-1] == blue)

{

error = TRUE;

cout << "This square is occupied!n";

}

else

error = FALSE;

} while (error);

 

if (tempX > 3 || tempY > 3) // Tests if value is legal. (Exits if not)

{

cout << "Illegal value! Must be 1-3!n";

run = FALSE;

return 0;

}

 

// Test whose turn it is, place piece accordingly and change turn.

if (blue == turn)

{

gameBoard[tempX-1][tempY-1] = blue;

turn = red;

}

else

{

gameBoard[tempX-1][tempY-1] = red;

turn = blue;

}

 

}

return 0;

}

[/code]

 

Jeg bare kopierte og limte inn fra notisblokk, så det er ikke sikkert det ser så veldig pent ut her. Koden over var den jeg dytta sammen i går kveld. Jeg har altså ikke begynt å sjekke etter hvem som har vunnet enda. Det skal jeg sette i gang med nå :smile:

 

Quote:


Den 2002-07-02 00:32, THX 1138 skrev:

Uansett, for å sjekke om noen har tre på rad, tror jeg du bør lagre brikkeplasseringene for spillerne i hver sin matrise. Deretter kan du bruke noe liknende det jeg har skrevet under.


 

Matrise = Array..? Eller?

 

Quote:


(Koden under er ikke nødvendigvis bra skrevet, ferdig eller kjørbar, men er kun ment å hjelpe deg i gang.)


 

Bra det, jeg gjør dette for å lære, så..! :smile:

 

Det som skjer/ikke skjer, er at..

 

Code:

if (0 == finished) // Ends game if board is full
{
run = FALSE;
cout << "Game over!n";
return 0;
}

 

..aldri inntreffer.

_________________

Linux inside.

 

[ Denne Melding var redigert av: Myubi på 2002-07-02 18:28 ]

Lenke til kommentar

Hehe! :smile:

 

Dette var uten tvil den aller enkleste debuggingen jeg noensinne har vært med på. Du kommer nok også til å synes at dette er morsomt.

 

Du har tenkt helt riktig, du har bare gjort en bitte liten tabbe.

 

Følgende kode teller (som du sikkert vet) antall åpne felter igjen.

 

Redigert:

Jeg hadde det samme problemet igjen, med at i med firkant-brackets ble tolket som kursiv, selv inne i code-brackets. Derfor har jeg også her byttet ut i med j og j med k.

 

Code:

for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
if (none == gameBoard[j][k]) // Counts open squares
finished++;
}
}

 

Deretter setter denne kodebiten run = FALSE om antall åpne felter er lik 0...

 

Code:

if (0 == finished) // Ends game if board is full
{
run = FALSE;
cout << "Game over!n";
return 0;
}

 

Hittil er alt bare fryd og gammen. Men, hva tror du skjer når dette blir gjentatt flere ganger? Jo, finished vil bare øke og øke! Så når du kommer til runden der det ikke er flere åpne felter, kommer den første kodesnutten ganske riktig ikke til å legge til noe til variabelen finished, men variabelen vil jo ikke være lik 0, siden den allerede har en verdi. :smile:

 

Løsningen er enkel: du må simpelthen legge til

finished = 0;

før du teller antall åpne felter. Dette vil løse hele problemet ditt (jeg har selv prøvd å kompilere det).

 

 

Quote:


Matrise = Array..? Eller?


 

Ja, en matrise (eng.: matrix) er et to-dimensjonalt array, akkurat som i dette eksempelet fra ditt eget program:

 

Code:

Piece gameBoard[3][3] = { none,none,none, none,none,none, none,none,none };

 

Jeg trekker forøvrig tilbake det jeg sa om at du trenger en matrise for hver spiller. Du kan selvsagt kjøre noe liknende tre-på-rad-testen jeg beskrev i min forrige post, to ganger, og sjekke for blue den ene gangen og red den andre gangen.

 

 

Programmet ditt så helt fint ut ellers, og blir sikkert enda bedre med en tre-på-rad-sjekk. Lykke til videre!

 

Mvh.

THX 1138

 

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-02 19:37 ]

Lenke til kommentar

Så vidt jeg kan se så settes aldri finished tilbake til 0.

 

Dvs at første gang teller den opp og finner x ledige plasser, neste gang begynner den å teller opp fra x og vil dermed aldri kunne bli 0 (hvis den ikke blir det første gangen).

Lenke til kommentar

Ferdig! :smile:

 

Code:

// --------------------------------------------------------
// Tic tac toe
//
// Author: Lars ... (LS)
// Created (Start): 01/07/2002 (LS)
// Created (Finish): 02/07/2002 (LS)
//
// Version: 1.0
//
// A simple Tic tac toe-game.
// --------------------------------------------------------

#include <iostream.h>

// Enumerations
enum BOOL { FALSE, TRUE };
enum Piece { none, blue, red }; // Enumerates pieces, to tell
// what is on a square by it's
// value.

// Main thing
int main()
{
// Initializes gameBoard with all empty squares.
Piece gameBoard[3][3] = { none,none,none, none,none,none, none,none,none };

// Other initializations
int tempX, tempY; // Co-ords input

// Various flags
int run = TRUE, turn = blue, error = FALSE;
int Winner = none;
int finished = 0, inRow = 0;


// Instructions
cout << "nWelcome to Tic tac toe!nn";
cout << "There are two players, blue and red.n";
cout << "You are playing as them both (or you n";
cout << "could be joined by a friend, consider itn";
cout << "multiplayer :wink:nn";

cout << "Note that: n";
cout << "0 = No piecen";
cout << "1 = Blue piecen";
cout << "2 = Red piecenn";

// Gameplay
while (run)
{

// Testing if board is filled.
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (none == gameBoard[i][j]) // Counts open squares
finished++;
}
}

// Ends game if board is full
if (0 == finished)
{
run = FALSE;
cout << "nBoard: n";
for (int i = 0; i < 3; i++) // Prints board to screen
{
for (int j = 0; j < 3; j++)
cout << gameBoard[i][j] << " ";
cout << "n";
}

cout << "Draw!n";
break;
}
finished = 0;


// CHECKING FOR WINNER
// Checks the combinations, to see if
// there are three equal-coloured pieces in a row.

// Red winner?
for (int i = 0; i < 3; i++)
{

for (int j = 0; j < 3; j++)
{
if (red == gameBoard[i][j])
inRow++;
}

if (3 == inRow)
{
Winner = red;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (red == gameBoard[i][j])
inRow++;
}

if (3 == inRow)
{
Winner = red;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (red == gameBoard[j][j])
inRow++;
}

if (3 == inRow)
{
Winner = red;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (red == gameBoard[j][2-j])
inRow++;
}

if (3 == inRow)
{
Winner = red;
break;
}
inRow = 0;
}


// Blue winner?
for (int i = 0; i < 3; i++)
{

for (int j = 0; j < 3; j++)
{
if (blue == gameBoard[i][j])
inRow++;
}

if (3 == inRow)
{
Winner = blue;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (blue == gameBoard[j][i])
inRow++;
}

if (3 == inRow)
{
Winner = blue;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (blue == gameBoard[j][j])
inRow++;
}

if (3 == inRow)
{
Winner = blue;
break;
}
inRow = 0;
}

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

for (int j = 0; j < 3; j++)
{
if (blue == gameBoard[j][2-j])
inRow++;
}

if (3 == inRow)
{
Winner = blue;
break;
}
inRow = 0;
}



// Checks the winner-flag, and if it is blue or red it will end the game.
if (blue == Winner)
{
cout << "nBoard: n";
for (int i = 0; i < 3; i++) // Prints board to screen
{
for (int j = 0; j < 3; j++)
cout << gameBoard[i][j] << " ";
cout << "n";
}

cout << "Blue wins!n";
break;
}

if (red == Winner)
{
cout << "nBoard: n";
for (int i = 0; i < 3; i++) // Prints board to screen
{
for (int j = 0; j < 3; j++)
cout << gameBoard[i][j] << " ";
cout << "n";
}

cout << "Red wins!n";
break;
}

// END CHECKING FOR WINNER


do // Enter co-ords and check if square is occupied
{
cout << "nBoard: n";
for (int i = 0; i < 3; i++) // Prints board to screen
{
for (int j = 0; j < 3; j++)
cout << gameBoard[i][j] << " ";
cout << "n";
}

if (blue == turn)
cout << "nBlue's turn.";
else
cout << "nRed's turn.";
cout << "nEnter co-ords (1-3):n";
cout << "X: ";
cin >> tempX;
cout << "Y: ";
cin >> tempY;
if (gameBoard[tempY-1][tempX-1] == red || gameBoard[tempY-1][tempX-1] == blue)
{
error = TRUE;
cout << "This square is occupied!n";
}
else
error = FALSE;
} while (error);

if (tempX > 3 || tempY > 3) // Tests if value is legal. (Exits if not)
{
cout << "Illegal value! Must be 1-3!n";
run = FALSE;
return 0;
}

// Test whose turn it is, place piece accordingly and change turn.
if (blue == turn)
{
gameBoard[tempY-1][tempX-1] = blue;
turn = red;
}
else
{
gameBoard[tempY-1][tempX-1] = red;
turn = blue;
}

}
return 0;
}

 

Hvis det er noen "good programming practices" noen av dere har å lære meg, eller hvis det er noen jeg mangler, så si gjerne ifra..! Eller hvis det er noen som har no forslag til noe som kan være bedre, evt. hvordan jeg skal få gjort det bedre.

Lenke til kommentar

Attention: Jeg har som vanlig byttet ut i-er med j-er, og j-er med k-er, for å unngå at i med firkant-brackets tolkes som kursiv. Jeg ser forsåvidt at det har gått greit for deg, men pga. dårlige erfaringer med dette fra før, velger jeg å ta denne forholdsregelen. Dette problemet er forøvrig av en ytterst merkelig art, i og med at det bare slår til from time to time (særlig når du minst venter det!).

 

 

 

Heeyyy! Dette ser bra ut, jo! Jeg har bare én liten ting å utsette:

 

Code:

// First diagonal
for (j = 0; j < 3; j++)
{

for (int k = 0; k < 3; k++)
{
if (red == gameBoard[k][k])
inRow++;
}

if (3 == inRow)
{
Winner = red;
break;
}
inRow = 0;
}

Hehe! Nok en slurve-feil, ser det ut til. Det har jo ingen praktisk betydning, men hvis du tenker nøye over det, er det virkelig nødvendig å trippel-sjekke for tre på rad? :smile: For at det ikke skal være noen tvil om hva jeg snakker om; her er slik det burde vært:

Code:

// First diagonal
for (int j = 0; j < 3; j++)
{
if (red == gameBoard[j][j])
inRow++;
}

if (3 == inRow)
Winner = red;

inRow = 0;

 

 

Ellers kan det være en god idé å putte f.eks win-testene dine i egne funksjoner, slik at det blir enklere å lese. Dette har ingenting å si for hvordan koden eksekveres, men har derimot mye å si for lesbarheten. Her er et eksempel på hvordan dette kunne ha sett ut (jeg har ikke puttet noen argumenter i noen av funksjonskallene, men det er bare fordi jeg er lat) :

Code:

while (run)
{
isBoardFilled();

endIfBoardFull();

redWinner();

blueWinner();

endIfWinner();

determineWhoseTurnItIsGetTheCoordsAndPlaceThePieceOrWhateverOtherRidiculouslyLongFunctionNameYouCanThinkOf();

// ........

Osv., osv., osv. You get the idea :smile:

 

 

Hvis du ikke vet noenting om funksjoner, kan følgende kanskje hjelpe deg:

 

1. En funksjon har en type, eller hva det nå er det heter, slik som int, char, osv. Dette sier hva returtypen vil være.

 

2. En funksjon må deklareres før int main(). Du kan velge om du vil skrive hele funksjonen her, eller om du bare vil deklarere den her (eks.: int minFunksjon();), og skrive funksjonen etter int main().

 

Det siste ser ryddigere ut (synes jeg), og er det jeg har valgt å bruke. (Nå er jeg faktisk litt lat når det gjelder å bruke funksjoner, klasser også, for den saks skyld, men det er ingen grunn til at ikke du skal lære deg å bruke dem!)

 

3. En funksjon kan ta argumenter. Du bestemmer selv hvilke typer disse skal være når du deklarerer funksjonen. Eks.: int minFunksjon(int nArg1, double dArg2);

 

Redigert:

(Bare en liten update før jeg legger meg.)

Argumentene er de eneste variablene, i tillegg til de globale variablene (variabler som er deklarert før int main()), du har tilgang til inne i funksjonen.

 

4. En funksjon kan returnere en variabel eller verdi. Eks.: return Winner;

 

6. Her er en enkel funksjon:

Code:

int summerToTall(int nTall1, int nTall2)
{
nSum = nTall1 + nTall2;
return nSum;
}

Hvis du da f.eks vil vise summen av 6 + 3, skriver du:

Code:

cout << summerToTall(6, 3);

eller

Code:

summerToTall(6, 3);
cout << nSum;

 

 

 

Uansett, dette så som sagt bra ut. Mangelen på bruk av funksjoner minnet meg egentlig om min egen kode-stil :razz:

 

Keep up the good work!

 

Mvh.

THX 1138

 

 

<font class=editedby>[ Denne Melding var redigert av: THX 1138 på 2002-07-03 02:33 ]</font>

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-03 04:43 ]

Lenke til kommentar

Bare noen nye forslag...

 

 

1. Det kunne vært en fordel om man fikk en ny sjanse etter å ha skrevet en "illegal value" :smile:

 

 

2. Det hadde muligens vært fint med clearscreen mellom spillerbyttene. En enkel måte å implementere dette på i windows (konsoll-mode), er å inkludere windows.h, slik at du kan bruke dos-kommandoer. Etterpå kan du nemlig bare skrive system("cls") når du vil cleare screenen (godt norsk, eller hva? :razz:).

 

Hvis du gjør dette, må du forresten fjerne linja

enum BOOL { FALSE, TRUE };

Denne er nemlig allerede definert i windows.h

 

Hvis du bruker linux eller noe, får du nesten selv finne ut hvordan du får clearscreen.

 

 

3. AI! Ikke det at jeg tror kunstig intelligens gjør spillet mer spennende (noen må gjøre en feil for at det skal være mulig å vinne, og det er bare mennesker som gjør feil), men det hadde vært en ypperlig øvelse for deg som holder på å lære c++.

 

 

4. En forandring i selve spillet kunne kanskje gjort det mer spennende. Hva med flere felter? Eller miner i noen av feltene? Fantasien kjenner ingen begrensninger.

 

 

 

Mvh.

THX 1138

 

 

Btw, hva slags kompilator bruker du? Jeg bruker Visual C++ 6.0, og jeg måtte fjerne int foran alle i-ene inne i for-løkkene (unntatt i den første, selvsagt), fordi Visual C++ kalte dette for "multiple declaration".

Lenke til kommentar

--> Funksjoner

Jada, jeg vet hvordan funksjoner funker :smile: Før jeg satte inne hvem-vinner-testen var koden såpass kort og grei at jeg ikke orka å bruke funksjoner. Får se om jeg ikke ordner funksjoner senere i kveld. :smile:

 

Quote:


Hehe! Nok en slurve-feil, ser det ut til. Det har jo ingen praktisk betydning, men hvis du tenker nøye over det, er det virkelig nødvendig å trippel-sjekke for tre på rad? For at det ikke skal være noen tvil om hva jeg snakker om; her er slik det burde vært:


 

Var littegrann usikker på om jeg forsto hva du mente, men jeg har vaffal fjerna den ene for-loopen i alle diagonal-testene!

 

Quote:


1. Det kunne vært en fordel om man fikk en ny sjanse etter å ha skrevet en "illegal value"


 

Hovedgrunnen til at jeg fikk programmet til å avslutte var at jeg ikke orka mer styr med å risikere noen buffer overflows. Og før jeg fikk programmet til å avslutte (legge til finished = 0;) var det fint å ha en måte å komme seg ut av spillet på. Men, jeg kan vel fikse på det nå!

 

Til forslag 2:

Kjører windows på denne maskina (for den er ikke min). Skal (forsøke) å implementere dette også. I linux tror jeg kanskje det er så lett som å skrive Clear();, men jeg er ikke sikker. (drill.hackerslab.org - Level 4 - bruk IFS og PATH til å utnytte at en kar har lagt til Clear() i et spill)

 

3) Tenkte på at det ville vært fint å ha noen å spille mot, men jeg tenkte at det ville vært alt for avansert for meg!! Hvordan gjør jeg det?

 

4) Dette har jeg ikke tenkt på. Det ville vært kult med noen artige elementer, men jeg frykter at det vil bli litt vel avansert for meg, kanskje. (Men, med hjelp fra deg bør jeg vel få det til, og kanskje lære litt i samme slengen!)

 

Når det gjelder kompilator bruker jeg Borland C++ 5.5 til slike applikasjoner (uten GUI). Jeg har Borland C++Builder 5 (Enterprise) også, men pga alle DLL'ene orker jeg ikke å bruke det så mye. Jeg liker å plage alle jeg kjenner med programmene mine. :wink:

 

-- Myubi

Lenke til kommentar

Kjapt spm (orker ikke å leite meg fram og se om jeg finner det i no bok): Hvordan sender jeg hele gameBoard som argument til en funksjon?

 

liksom:

Code:

int TestIfFull(Piece gameBoard[3][3])
{
int finished = 0;
// Testing if board is filled.
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (none == gameBoard[i][j])
finished++;
}
}
return finished;
}

(Bare at det funker ikke.. så vidt jeg vet)

Lenke til kommentar

*gjesp*

Ahh! Ingenting er som å sove til du våkner. Men, hvorfor er det mørkt ute? Uæh! Klokka er snart ett på natta jo :eek:. Det betyr at jeg må ha sovet i nesten 20 timer! Kan ikke være normalt...

 

Men, jeg får vel sette igang å skrive noe fornuftig, så ikke en moderator sletter innlegget mitt :smile:.

 

Hmm... Jeg tror jeg svarer på det siste inlegget ditt først, og poster et nytt inlegg når jeg har fått tenkt litt på dette med AI (og når jeg har fått meg litt mat).

 

Oisann! Jeg skrev visst noe feil i lista over hva som kjennetegner funksjoner. I punkt 4 skrev jeg at en funksjon kan returnere en variabel eller verdi. Det riktige er vel at en funksjon kan returnere en verdi. Selv om du bruker variabelen finished både i og utenfor funksjonen, kan du se på variabelen på innsiden og utsiden som to forskjellige variabler. Så når du skriver return finished, er det verdien av finished som returneres. For å sette variabelen finished på utsiden lik verdien som returneres, skriver du rett og slett følgende:

Code:

finished = TestIfFull(gameBoard);

Ellers så var det du hadde skrevet helt riktig (jeg har selv prøvd å kompilere det). Så dersom du enten putter koden fra din siste post før int main(), eller etter, men deklarerer funksjonen før, som dette...

Code:
int TestIfFull(Piece gameBoard[3][3]);

...så skulle ting virke helt greit.

 

Jeg regner med at du visste de siste tingene jeg skrev, men jeg valgte å føye det til, sånn for sikkerhets skyld.

 

Nå skal jeg ta meg litt mat, og tenke litt gjennom det AI-greiene, og så poster jeg eventuelle idéer senere.

 

Mvh.

THX 1138

 

Redigert:

En liten skrivefeil, bare.

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-04 01:14 ]

Lenke til kommentar

Slapp av, jeg kan (faktisk) funksjoner :wink: Ihvertfall såpass basic'e! Blir litt vanskeligere når man "pass by reference"'er, men...

 

Jeg gjorde det på "L337"-måten :wink: og skreiv:

 

Code:

if (!TestIfFull(gameBoard))
{
run = FALSE;
cout << "nBoard: n";
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
cout << gameBoard[i][j] << " ";
cout << "n";
}

cout << "Draw!n";
break;
}

 

Så slipper jeg å ha no finished i main() :smile:

 

Hvordan hindrer jeg at et program lukkes, forresten?

Så langt har jeg pleid å bruke:

 

...

int exit;

cin >> exit;

return 0;

}

 

Men hvordan skal man EGENTLIG gjøre det?

 

Mvh.,

Myubi

 

PS: Passe tid å stå opp på.. :grin:

Lenke til kommentar

Slik! Etter en passe lang programmerings-økt har jeg:

 

- Lagt til clearscreen

- Rydda opp litt i koden og kommentarene

- Lagd TestIfFull, RedWinner og BlueWinner-funksjoner

(RedWinner/BlueWinner tester for tre på rad)

Jeg syns foreløpig at resten av koden passer fint inn i main.. Får se i morra om jeg ikke lager én eller to funksjoner til. Spørsmål: Finnes det en "avslutt applikasjon"-kommando, som jeg kan bruke til å lukke programmet fra en funksjon? Kom på en liten lur idé nå, men er for trøtt til å skrive den..

 

Nei, nå må jeg i seng! Koden flyter sammen.. :???:

 

Mvh.,

Myubi

Lenke til kommentar

Hmm... jeg sovnet visst på sofaen etter å ha spist en slags gryterett jeg varmet opp etter å ha skrevet et lite inlegg. Det betyr at jeg med unntak av en kort "pause" har sovet i til sammen.... 32 timer!!! Jeg bør nok komme meg til en lege og få sjekket blodtrykk/-sukker/-mengde eller noe :razz:

 

In the meantime...

Quote:


Hvordan hindrer jeg at et program lukkes, forresten?


Hmm, er ikke sikker på om jeg forstår spørsmålet helt. Kan du forklare det litt bedre?

 

Quote:


Spørsmål: Finnes det en "avslutt applikasjon"-kommando, som jeg kan bruke til å lukke programmet fra en funksjon?


Ja, men jeg er ikke sikker på om den avslutt-kommandoen jeg kan virker i noe annet enn Windows/DOS. Uansett, hvis du inkluderer stdlib.h eller cstdlib (ikke .h) kan du bruke kommandoen exit();. Denne kan ta ett argument av typen int, og dette blir da error-koden som programmet avslutter med. Nå er det faktisk lenge siden jeg har brukt noen annen error-kode enn 0 (som return 0; i int main()), så jeg husker ikke helt hvordan dette opplegget virker. 0 betyr i hvert fall at programmet avslutter uten feil, så du vil nok bruke exit(0); mest. Jeg vet forresten ikke hvorfor du kan velge mellom å inkludere stdlib.h eller cstdlib. Det er muligens noen kompilatorer som bare har den ene (vill gjetning), så derfor tok jeg med begge.

 

Quote:


Jeg syns foreløpig at resten av koden passer fint inn i main.. Får se i morra om jeg ikke lager én eller to funksjoner til.


Stemmer sikkert. Grunnen til at jeg foreslo at du skulle bruke funksjoner var fordi jeg tenkte du kanskje ikke visste hvordan du skulle bruke dem. Jeg bruker aldri flere funksjoner enn det jeg synes er absolutt nødvendig. Men husk, funksjoner er viktige! Neste innlegg fra min side vil være et langt essay om funksjoner :grin:. Neida..

 

Neste skritt på veien til å bli en Supreme Overlord of C++, eller noe, er..... klasser. Lær deg å bruke dem, og du vil forstå hva som menes med "objektorientert". Her er det imidlertid lite jeg kan lære deg. I have a confession to make... jeg hoppet faktisk glatt over kapitlene om klasser (og en god del andre ting) da jeg lærte meg C++. "Problemet" mitt er at jeg har erfaring fra noen andre programmeringsspråk fra før, og derfor satte jeg igang med å lage programmer lenge før jeg hadde lært det jeg burde. Med tiden har jeg lest deler av diverse tutorials, og på den måten lært meg mer, litt etter litt. Men det er fortsatt mye jeg ikke kan. Jaja, jeg orket bare ikke å gå og holde på denne fryktelige hemmeligheten lenger... :razz:

 

Nå får jeg sette igang med å gjøre det jeg sa jeg skulle i mitt forrige innlegg, nemlig tenke litt gjennom det AI-greiene, og så poste eventuelle idéer senere.

 

Mvh.

THX 1138

 

Redigert:

Bare en liten og/å-feil.

 

Redigert igjen:

Windows skrives vel med stor W...

 

[ Denne Melding var redigert av: THX 1138 på 2002-07-04 15:14 ]

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...