Nyt tais tulla liian iso pala haukattua, kun tuli juuri funktiot ja kaikn näköstä muuta kivaa opiskeltua nii aattelin tehdä jonkin vähän isomman projektin jossa sitten tarvittaisin vähän kaikkea mitä olen oppinut. Mutta eihän se sitten alkuunkaan onnistunut.
Käänäjä valittaa jotai syntaksi virhettä noissa funktioden nimissä.
tää on sit aikas pitkä ja sekava.
// Text adventure.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#include
#include
void alkutekstit(void);
void clrscr();
int taistelu(char pl1.nimi, int pl1.pisteet, int pl1.elama, int pl1.voima);
int isku(int pl1.voima, int pl2.elama);
int isku2(int pl2.voima, int pl1.elama)
typedef struct PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
typedef struct VIHOLLINEN //Vihollisen tiedot
{
char nimi[40];
int elama;
int voima;
} VIHOLLINEN;
void main(void)
{
PELAAJA pl1;
VIHOLLINEN pl2;
//######################################################################
alkutekstit(); //Näytetään alkutekstit
printf("Kerro hahmosi nimi."); //Laitetaan pelaajalle nimi.
gets_s(pl1.nimi);
pl1.pisteet=0; //Määrittää alku arvot
pl1.elama=100;
pl1.voima=10;
printf("Hyvää päivää %s!",pl1.nimi); //tervehtii
taistelu(int pl1.pisteet, int pl1.elama);
}
void alkutekstit(void) //Sisältää alku tekstit.
{
clrscr();
printf("Tervetuloa TextAdventure -tekstipohjaiseen seikkailupeliin!\n");
printf("------------------------\n");
printf("Tehtäväsi on pelata peli läpi!\n");
printf("Onnea!");
}
void clrscr() // tyhjennetään ruutu
{
puts("\e[2J");
}
int taistelu(int pl1.pisteet, int pl1.elama) //taistelu
{
PELAAJA pl1;
VIHOLLINEN pl2;
char i[128];
int isku;
pl2.elämä=65;
pl2.voima=5;
if(pl1.elama > 0)
{
printf("Kuolit! Joudut aloittamaan pelin alusta!")
}
else if(pl2.elama > 0)
{
printf("Voitit!/nVoimasi kasvaa yhdellä.");
break;
}
else
{
printf("Sinun vuorosi iskeä. Paina enter näppäintä iskeäksesi.");
gets_s(i);
int isku(int pl1.voima, int pl2.elama);
printf("Iskit %d. Vihollisellä jäljellä %d elämää.", isku, pl2.elama );
int isku2(int pl2.voima, int pl1.elama);
Printf("Vihollinen iski sinuun %d. Elämää jäljellä %d", isku, pl1.elama);
}
pl1.voima
printf("voimasi on nyt %d", pl1.voima);
return
}
int isku(int pl1.voima, int pl2.elama) //pelaaja iskee vihollista
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl1.voima);
isku=(rand()%10) 1;
pl2.elama =- isku;
return isku, pl2.elama;
}
int isku2(int pl2.voima, int pl1.elama) //vihollinen iskee pelaajaa
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl2.voima);
isku=(rand()%10) 1;
pl1.elama =- isku;
return isku, pl1.elama;
}
Käänäjä valittaa jotai syntaksi virhettä noissa funktioden nimissä.
tää on sit aikas pitkä ja sekava.
// Text adventure.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#include
#include
void alkutekstit(void);
void clrscr();
int taistelu(char pl1.nimi, int pl1.pisteet, int pl1.elama, int pl1.voima);
int isku(int pl1.voima, int pl2.elama);
int isku2(int pl2.voima, int pl1.elama)
typedef struct PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
typedef struct VIHOLLINEN //Vihollisen tiedot
{
char nimi[40];
int elama;
int voima;
} VIHOLLINEN;
void main(void)
{
PELAAJA pl1;
VIHOLLINEN pl2;
//######################################################################
alkutekstit(); //Näytetään alkutekstit
printf("Kerro hahmosi nimi."); //Laitetaan pelaajalle nimi.
gets_s(pl1.nimi);
pl1.pisteet=0; //Määrittää alku arvot
pl1.elama=100;
pl1.voima=10;
printf("Hyvää päivää %s!",pl1.nimi); //tervehtii
taistelu(int pl1.pisteet, int pl1.elama);
}
void alkutekstit(void) //Sisältää alku tekstit.
{
clrscr();
printf("Tervetuloa TextAdventure -tekstipohjaiseen seikkailupeliin!\n");
printf("------------------------\n");
printf("Tehtäväsi on pelata peli läpi!\n");
printf("Onnea!");
}
void clrscr() // tyhjennetään ruutu
{
puts("\e[2J");
}
int taistelu(int pl1.pisteet, int pl1.elama) //taistelu
{
PELAAJA pl1;
VIHOLLINEN pl2;
char i[128];
int isku;
pl2.elämä=65;
pl2.voima=5;
if(pl1.elama > 0)
{
printf("Kuolit! Joudut aloittamaan pelin alusta!")
}
else if(pl2.elama > 0)
{
printf("Voitit!/nVoimasi kasvaa yhdellä.");
break;
}
else
{
printf("Sinun vuorosi iskeä. Paina enter näppäintä iskeäksesi.");
gets_s(i);
int isku(int pl1.voima, int pl2.elama);
printf("Iskit %d. Vihollisellä jäljellä %d elämää.", isku, pl2.elama );
int isku2(int pl2.voima, int pl1.elama);
Printf("Vihollinen iski sinuun %d. Elämää jäljellä %d", isku, pl1.elama);
}
pl1.voima
printf("voimasi on nyt %d", pl1.voima);
return
}
int isku(int pl1.voima, int pl2.elama) //pelaaja iskee vihollista
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl1.voima);
isku=(rand()%10) 1;
pl2.elama =- isku;
return isku, pl2.elama;
}
int isku2(int pl2.voima, int pl1.elama) //vihollinen iskee pelaajaa
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl2.voima);
isku=(rand()%10) 1;
pl1.elama =- isku;
return isku, pl1.elama;
}
Vastaukset 19
Vanhimmat
alussa esittelyt tyyliin
int taistelu(char pl1.nimi, int pl1.pisteet, int pl1.elama, int pl1.voima);
ei ole oikein, ota pisteet pois.
Nyt kääntäjä hyväksyy koodin, mut se ei silti toimi vaan kaatuu siinkun on laittan nimen.
ja valittaa tällästä:
"Run-Time Check Failure #3 - The variable 'pl1' is being used without being defined."
Ja täs ois koodi. Hiukan siistittynä ja jatkettuna. Tämähän on vielä pahasti kesken mutta sitten on hyvä jatkaa kun saa eka yhen kohan toimii:
// Text adventure //
#include "stdafx.h"
#include
#include
#include
#include
#include
void alkutekstit(void);
void clrscr();
int taistelu(int pl1pisteet, int pl1elama, int pl1voima);
int isku(int pl1voima, int pl2elama);
int isku2(int pl2voima, int pl1elama);
typedef struct PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
typedef struct VIHOLLINEN //Vihollisen tiedot
{
char nimi[40];
int elama;
int voima;
} VIHOLLINEN;
void main(void)
{
PELAAJA pl1;
char h[128];
//######################################################################
alkutekstit(); //Näytetään alkutekstit
printf("Kerro hahmosi nimi.\n"); //Laitetaan pelaajalle nimi.
gets_s(pl1.nimi);
pl1.pisteet=0; //Määrittää alku arvot
pl1.elama=100;
pl1.voima=10;
printf("\n\nHyvää päivää %s!",pl1.nimi); //tervehtii
taistelu(pl1.pisteet, pl1.elama, pl1.voima);
gets_s(h);
}
void alkutekstit(void) //Sisältää alku tekstit.
{
clrscr();
printf("Tervetuloa TextAdventure -tekstipohjaiseen seikkailupeliin!\n");
printf("------------------------\n");
printf("Tehtäväsi on pelata peli läpi!\n");
printf("Onnea!\n\n");
}
void clrscr() // tyhjennetään ruutu
{
puts("\e[2J");
}
int taistelu(int pl1pisteet, int pl1elama, int pl1voima) //taistelu
{
PELAAJA pl1;
VIHOLLINEN pl2;
char i[128];
int isku;
int piste_varasto;
pl2.elama=65;
pl2.voima=5;
piste_varasto=pl2.elama;
{
if(pl1.elama > 0) //häviö
{
printf("Kuolit! Joudut aloittamaan pelin alusta!");
// tähän tulee joku juttu et homma alkaa alusta.
}
else if(pl2.elama > 0) //voitto
{
pl1.voima++;
pl1.pisteet += piste_varasto;
printf("Voitit!/nVoimasi on ny %d.\nSait %d pistettä.", pl1.voima, piste_varasto);
}
else //taistelu jatkuu
{
printf("Sinun vuorosi iskeä. Paina enter näppäintä iskeäksesi.");
gets_s(i);
int isku(int pl1voima, int pl2elama);
printf("Iskit %d. Vihollisellä jäljellä %d elämää.", isku, pl2.elama );
printf("Vihollisen vuoro iskeä. Paina enter näppäintä jatkaaksesi.");
gets_s(i);
int isku2(int pl2voima, int pl1elama);
printf("Vihollinen iski sinuun %d. Elämää jäljellä %d", isku, pl1.elama);
}
}
printf("voimasi on nyt %d", pl1.voima);
return pl1.voima, pl1pisteet, pl1elama;
}
int isku(int pl1voima, int pl2elama) //pelaaja iskee vihollista
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl1.voima);
isku=(rand()%10)+1;
pl2.elama =- isku;
return isku, pl2.elama;
}
int isku2(int pl2voima, int pl1elama) //vihollinen iskee pelaajaa
{
PELAAJA pl1;
VIHOLLINEN pl2;
int isku;
srand(pl2.voima);
isku=(rand()%10)+1;
pl1.elama =- isku;
return isku, pl1.elama;
}
Muuta
int taistelu(int pl1pisteet, int pl1elama, int pl1voima)
muotoon
int taistelu(PELAAJA pl1)
ja iskufunktiot muotoon
int isku(PELAAJA pl1, VIHOLLINEN pl2)
ja poista turhat määrittelyt PELAAJA pl1 ja VIHOLLINEN pl2 funktioiden sisältä.
Funktioiden kutsuminen tapahtuu nyt esim. taistelu(pl1);
enkä nyt ihan eitsekkään sitä tajunnu
menepä ohjelmointikurssille, esimerkiksi työväenopistoon. Selviää nuo triviaaliongelmat siellä ihan käden käänteessä.
niin sydämen asia mulle oo et viittisin moiseen vaivautua. Ja kun vasta oon 14 niin elämässä ehtii.
typedef struct PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
typedef struct VIHOLLINEN //Vihollisen tiedot
{
char nimi[40];
int elama;
int voima;
} VIHOLLINEN;
void taistelu(struct PELAAJA *pl1, struct VIHOLLINEN *pl2);
void isku(struct PELAAJA *pl1, struct VIHOLLINEN *pl2);
void isku2(struct PELAAJA *pl1, struct VIHOLLINEN *pl2);
int main(void)
{
PELAAJA pl1;
VIHOLLINEN pl2;
char h[128];
//######################################################################
alkutekstit(); //Näytetään alkutekstit
printf("Kerro hahmosi nimi.\n"); //Laitetaan pelaajalle nimi.
gets_s(pl1.nimi);
pl1.pisteet=0; //Määrittää alku arvot
pl1.elama=100;
pl1.voima=10;
printf("\n\nHyvää päivää %s!",pl1.nimi); //tervehtii
taistelu(&pl1, &pl2);
gets_s(h);
return(0);
}
void taistelu(struct PELAAJA *pl1, struct VIHOLLINEN *pl2) //taistelu
{
char i[128];
int piste_varasto;
pl2->elama=65;
pl2->voima=5;
piste_varasto=pl2->elama;
if(pl1->elama > 0) //häviö
{
printf("Kuolit! Joudut aloittamaan pelin alusta!");
// tähän tulee joku juttu et homma alkaa alusta.
}
else if(pl2->elama > 0) //voitto
{
pl1->voima++;
pl1->pisteet += piste_varasto;
printf("Voitit!/nVoimasi on ny %d.\nSait %d pistettä.", pl1->voima, piste_varasto);
}
else //taistelu jatkuu
{
printf("Sinun vuorosi iskeä. Paina enter näppäintä iskeäksesi.");
gets_s(i);
isku(pl1, pl2);
printf("Iskit %d. Vihollisellä jäljellä %d elämää.", isku, pl2->elama );
printf("Vihollisen vuoro iskeä. Paina enter näppäintä jatkaaksesi.");
gets_s(i);
isku2(pl1, pl2);
printf("Vihollinen iski sinuun %d. Elämää jäljellä %d", isku, pl1->elama);
}
printf("voimasi on nyt %d", pl1->voima);
}
void isku(struct PELAAJA *pl1, struct VIHOLLINEN *pl2) //pelaaja iskee vihollista
{
int isku;
srand(pl1->voima);
isku=(rand()%10)+1;
pl2->elama =- isku;
}
void isku2(struct PELAAJA *pl1, struct VIHOLLINEN *pl2) //vihollinen iskee pelaajaa
{
int isku;
srand(pl2->voima);
isku=(rand()%10)+1;
pl1->elama =- isku;
}
Toiminnasta en mene takuuseen, mutta pitäisi mennä kääntäjästä läpi.
Hyviä oppaita (C-) ohjelmoinnin aloitteluun:
http://cpp.mureakuha.com/cpp/calkeet.htm
http://www.ohjelmointiputka.net/opas.php?tunnus=cohj_1
http://cs.stadia.fi/~silander/ohjelmointi/c_opas-Contents.html
Kiitti avusta!
taistelu funktiossa on viel vähän häikkää mut siirrän tän projektin hiukan sivummalle kunnes olen oppinut vähän lisää.
Tää "Nälkä kasvaa syödessä" -juttu pätee ohjelmointiinkin nimittäin mun piti säästää SDL jutut ja sellaset siihen kunnes osaan nää perus jutut, mut en van voinu pitää näppejäni erossa.
Homma toimii muuten ihan hyvin mutta ihan mitä tahansa yritän kääntää nii tulee tämmönen:
"LINK : fatal error LNK1561: entry point must be defined"
yritin googlella kattoo apua mut en löytäny mitään mist ois mitään ymmärtäny.
sorsasta puuttuu main funktio, pikaisella vilaisulla.
Linkittäjä on siis se vekotin, joka kokoaa käännetystä koodista valmiin ajettavan ohjelman. Se ei nyt löydä kaikki määrittelyjä. Minulla oli seuraavanlaisia virheitä:
C:\temp>gcc koe.c
C:\[...]:koe.c: undefined reference to `alkutekstit'
C:\[...]:koe.c: undefined reference to `gets_s'
Näitä funktiota alkutekstit ja gets_s ei siis löydy mistään. Sinulla on eri kääntäjä kuin tuo gcc, joten sen kirjastoista voipi tuo gets_s löytyä (tai muualta). Siihen en osaa sanoa. Sinulla on kai siihen sopiva #include-rivi tiedossa, kun olet itse sen valinnut käyttöön.
Alkutekstit-funktio pitää määritellä. Sen voi tehdä näin:
void alkutekstit (void)
{
printf ("Ei oo viel alkutekstei.\n");
}
Myöhemmin ne oikeat tekstit voi lisätä :-)
Toisin kun tuo vastaaja toinen sanoi, kyllä siellä se main on. Rivillä 22 näyttää ny tolevan minun cut&pastessani.
..osa koodista johon kyllä lisäsin itse siitä puuttuvat palaset ja kun laittaa "gets" nii käntäjä pistää errorii ja et et pitä käyttää "gets_s" eli sen kanssa ei oo ongelmii.
Ja tää
"LINK : fatal error LNK1561: entry point must be defined"
On ongelmana vain SDL ohjelmissa
tähän ogelmaan ku tule tää virehe ilmotus ku yrittää tehä SDL ohjelmia
"LINK : fatal error LNK1561: entry point must be defined"
Eli googleen hakusanoiksi virheilmoitus ja sdl niin löytyy mm. tämmöistä: http://www.gamedev.net/community/forums/topic.asp?topic_id=356679&whichpage=1
Auttaisi jonkin verran jos kertoisit käyttämäsi kääntäjän/linkkerin.
A_:F>*P?GP#GLG
Eiköhän tuosta käynyt selväksi että kyseessä visual c
MS Visual C 2005 Express. ongelma ratkes linkin ohjeilla.
Tietääks kukaa mite SDL:llää vois tehä ampuminen
tollaseen peliin
http://www.freewebs.com/lahha/Peli.sfx.exe
-Nuolista liikkuu
-1,2,ja 3 vaihtaa alusta
-ESC lopettaa
muuta ei voi viel tehä =)
"
typedef struct PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
"
Tuollaista koodia minäkin olen nähnyt.
Mutta netistä löytämäni C-kielen manuaali ei kerro mitään tuollaisesta rakenteesta, vaan sen mukaan pitäisi olla:
typedef struct //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
missä tuo PELAAJA on siis omalle tyypille annettu nimi. Ilmeisesti myöhemmin ohjelmassa voisi vaikkapa:
int i;
PELAAJA Pelaaja1;
PELAAJA Pelaaja2;
int Pelaajien_lukumaara;
mutta mikä tuo kirjoituksessa mainittu PELAAJA:n ensimmäinen esiintyminen heti struct -sanan jäljessä on, ja mitä merkitystä sillä on ?
Kääntäjä hyväksynee molemmat muodot, mutta miksi dokumentointi mainitsee vain toisen. Käytätkö siis dokumentoimattomia ominaisuuksia, jos niin miksi ?
Vaikka esimerkissäsi molemmat nimet olivat "PELAAJA" niin, käsittääkseni jopa näinkin voisi tehdä:
typedef struct _PELAAJA //pelaajan tiedot
{
char nimi[40];
int pisteet;
int elama;
int voima;
} PELAAJA;
Jos näin tekee, niin tämä on luvallista:
int i;
PELAAJA Pelaaja1;
mutta allaoleva taas EI ole luvallista, vaan johtaa kääntäjävirheeseen:
int i;
_PELAAJA Pelaaja1;
Todellakin ihmettelen, mitä tuo _PELAAJA tuossa struct -määrityksessä (siis viimemainitussa) merkitsee ?
http://www.suomipelit.com/nayta_artikkeli.php?sivu=5&id=23
Typedef määrittelee tyypille aliaksen kun struct määrittelee tyypin. Kirjoittamalla "struct {..}" määrittelet tyypin "struct {...}", eli mitään nimeä tuolle tyypille ei anneta. Halutessasi uuden samanlaisen struktuurin (saman tyyppisen muuttujan) joudut kirjoittamaan tuon tyyppimäärittelyn aina uudestaan. Kuitenkin struktuurin määrittely sallii optionaalisen nimitagin. Voit määritellä "struct piste {...};", jolloin piste on määrätyntyyppinen struct ja voit määritellä muuttujia "struct piste mun_muuttuja;".
Jos taas kirjoitat "typedef struct {...} A;", niin määrittelet merkin A tyypin "struct {...}" aliakseksi, eli voit luoda uusia muuttujia joiden tyyppin on "struct {...}" kirjoittamalla vain "A mun_muuttuja;". Jos määrittelet "typedef struct piste {...} A;", niin määrittelet struktuurille, jolle on annettu nimi "piste", aliaksen A ja voit määritellä muuttujan paitsi "A mun_muuttuja;", niin myös "struct piste mun_muuttuja;". Siis A on alias struktuuriin, jolle on annettu nimi "piste".
Yleensä typedefit struktuurien kanssa tehdään tyyliin "typedef struct _nimi {...} nimi;". Tuo varmistaa aika hyvin ettei tule törmäyksiä nimien kanssa, mutta onhan noita muitakin tapoja.