PDA

View Full Version : Gioco C++


HipT
21-02-2007, 11:49
Ciao a tutti.
Premetto che è da tutta la mattina che cerco di usare la funzione "cerca" del forum ma non va',mi viene fuori una pagina bianca.Quindi scusate se l'argomento è già stato trattato:doh: .
Sono quasi giunto al termine del libro "Guida al linguaggio C++" di Schildt.
Volevo sapere per dei giochini-ini-ini tanto per provare a farli in C++,come fare.
Se potete consigliarmi il titolo di un libro/una guida che ne tratta,possibilmente che sia utilizzabile da autodidatta,non come libro di scuola.
E che nozioni di base bisognerebbe avere.
Grazie.
Ciao:mc:

Ps:Scusate la domanda forse banale.Ma le OpenGl e le DirectX vengono usate anche nel 2D o sono nel 3D?:confused:
Ho controllato la sezione guide del forum ma non c'era scritto di che ramo della programmazione parlano.

CoreDump
21-02-2007, 12:11
Ciao a tutti.
Premetto che è da tutta la mattina che cerco di usare la funzione "cerca" del forum ma non va',mi viene fuori una pagina bianca.Quindi scusate se l'argomento è già stato trattato:doh: .
Sono quasi giunto al termine del libro "Guida al linguaggio C++" di Schildt.
Volevo sapere per dei giochini-ini-ini tanto per provare a farli in C++,come fare.
Se potete consigliarmi il titolo di un libro/una guida che ne tratta,possibilmente che sia utilizzabile da autodidatta,non come libro di scuola.
E che nozioni di base bisognerebbe avere.
Grazie.
Ciao:mc:


In fatto di libri lascio la mano a chi è più esperto di me :D, comunque se googli su internet trovi molte guide interessanti,
dipende molto da quello che vuoi realizzare, se parti da zero potresti provare ad usare librerie 2d semplici come le sdl o le allegro
se vuoi subito fare il salto potresti scaricarti l'sdk delle directx ma se come mi pare di aver intuito, poca dimistichezza in ambito c++
per il momento te lo sconsiglio :)

Ps:Scusate la domanda forse banale.Ma le OpenGl e le DirectX vengono usate anche nel 2D o sono nel 3D?:confused:
Ho controllato la sezione guide del forum ma non c'era scritto di che ramo della programmazione parlano.

Ormai si usa quasi sempre il 3d anche per rappresentare parti tipicamente 2d come gli sfondi, sprite, menu etc. ;)

HipT
21-02-2007, 12:21
Avevo provato a googleare:D nella rete ma il problema è che la maggior parte se non tutte le guide ti danno il codice di un gioco già fatto e non lo spiegano,oppure sono risposte su forum a domande del tipo,"cosa ci metto dentro a questo codice per fargli fare questo?".:muro:
Cercavo un libro perchè magari quello spiega vari parti e la loro funzione e poi tu impari ad assemblare le varie funzioni.:fagiano:
Grazie
Ciaoz

Adesso provo a cercare cose su allegro,magari su quelle c'è una guida intera:D

----------------EDIT----------------

Come tutorial su allegro ho trovato questo su questo sito (http://alleg.sourceforge.net/docs.it.html)...ma è in inglese
E questo (http://www.bertinettobartolomeodavide.it/programmazione/allegroh/libro/libro.html) che,dopo aver scaricato il file in pdf e averci dato un'occhiata mi sembra buona.:D :D

CoreDump
21-02-2007, 12:27
Avevo provato a googleare:D nella rete ma il problema è che la maggior parte se non tutte le guide ti danno il codice di un gioco già fatto e non lo spiegano,oppure sono risposte su forum a domande del tipo,"cosa ci metto dentro a questo codice per fargli fare questo?".:muro:
Cercavo un libro perchè magari quello spiega vari parti e la loro funzione e poi tu impari ad assemblare le varie funzioni.:fagiano:
Grazie
Ciaoz

Adesso provo a cercare cose su allegro,magari su quelle c'è una guida intera:D

Capisco che vuoi dire, ma con le librerie credo che troverai quasi sempre solo le spiegazioni delle funzioni/metodi
della libreria corredate con degli esempi ;)

HipT
21-02-2007, 15:54
Posto quì il problema per non aprire un'altra discussione:mc:
Praticamente sto' seguendo una guida.Arrivo ad un punto dove anche se io compilo il progetto,anche non essendo finito,dovrebbe comparirmi una finestra nera.
Ho provato.
All'inizio il log di devC++ mi ha dato questi errori:
make.exe -f "C:\Dev-Cpp\gioco\Makefile.win" all
g++.exe gioco_f1.o -o "gioco.exe" -L"C:/Dev-Cpp/lib"

gioco_f1.o(.text+0x7):gioco_f1.cpp: undefined reference to `vsync'
gioco_f1.o(.text+0x3c):gioco_f1.cpp: undefined reference to `_imp__screen'
gioco_f1.o(.text+0x4f):gioco_f1.cpp: undefined reference to `blit'
gioco_f1.o(.text+0x6f):gioco_f1.cpp: undefined reference to `clear_bitmap'
gioco_f1.o(.text+0x9d):gioco_f1.cpp: undefined reference to `_install_allegro_version_check'
gioco_f1.o(.text+0xa2):gioco_f1.cpp: undefined reference to `install_keyboard'
gioco_f1.o(.text+0xce):gioco_f1.cpp: undefined reference to `set_gfx_mode'

gioco_f1.o(.text+0xe2):gioco_f1.cpp: undefined reference to `create_bitmap'
gioco_f1.o(.text+0xf9):gioco_f1.cpp: undefined reference to `_imp__key'
gioco_f1.o(.text+0x115):gioco_f1.cpp: undefined reference to `destroy_bitmap'
gioco_f1.o(.text+0x146):gioco_f1.cpp: undefined reference to `_WinMain'
collect2: ld returned 1 exit status

make.exe: *** [gioco.exe] Error 1

Execution terminated



Dato che un problema molto simile me l'ha dato quando ho provato a fare un player midi perchè mancava il collegamento alla libreria sono andato su
Propietes-->Project Option-->Parameters-->Linker e li ho messo "allegro".
Compilo il progetto e mi viene questo log:

Compiler: Default compiler
Building Makefile: "C:\Dev-Cpp\gioco\Makefile.win"
Executing make...
make.exe -f "C:\Dev-Cpp\gioco\Makefile.win" all
g++.exe gioco_f1.o -o "gioco.exe" -L"C:/Dev-Cpp/lib" allegro

g++.exe: allegro: No such file or directory

make.exe: *** [gioco.exe] Error 1

Execution terminated

Come faccio a risolvere l'errore?:muro:
Per installare le librerie di allegro sono andato su "Tools" da dev c++ da lì "Ceck Updates" e ho scaricato tutti gli aggiornamenti che si chiamavano Allegro:sofico: Poi si sono autoinstallati,ho solo premuto next,non mi diceva neanche che directory usare quindi penso siano installati correttamente.
Ps:ho provato a fare come dice questo post (http://www.pierotofy.it/pages/extras/forum/2/8982-allegro/) ma mi da' lo stesso errore.
Grazie
Ciao!

CoreDump
21-02-2007, 19:47
--cut--

Come faccio a risolvere l'errore?:muro:
Per installare le librerie di allegro sono andato su "Tools" da dev c++ da lì "Ceck Updates" e ho scaricato tutti gli aggiornamenti che si chiamavano Allegro:sofico: Poi si sono autoinstallati,ho solo premuto next,non mi diceva neanche che directory usare quindi penso siano installati correttamente.
Ps:ho provato a fare come dice questo post (http://www.pierotofy.it/pages/extras/forum/2/8982-allegro/) ma mi da' lo stesso errore.
Grazie
Ciao!

Se hai installato il package allegro su dev-c++ prova a creare un progetto nuovo in quanto il dev-c++ ti propone tra i template anche
quelli allegro ( se installato correttamente ), poi vai a guardare i parametri del compilatore sotto le opzioni del progetto e vedrai che ci
sono molti parametri da aggiungere ;)

HipT
21-02-2007, 19:55
Ho fatto una cosa...Disinstallato dev c++ compresi i file di configurazione.:D
Reinstallato dev c++,scaricato altri 2 aggiornamenti (centravano con allegro ma erano cose tipo "allegro font" e uno "dump with allegro".
E ora è partito senza problemi:D :D
Grazie
Ciaoz

wingman87
21-02-2007, 23:03
Che guida stai seguendo? Interesserebbe anke a me. Thx!

HipT
22-02-2007, 07:34
Sto' usando questa guida (http://www.bertinettobartolomeodavide.it/programmazione/allegroh/libro/libro.html).A me sembra molto buona,spiega bene passo a passo,poi magari metti qualche commento (ne avro' messi 99 su 10 righe:D )
così poi ti trovi meglio per modificare il codice.
Allora.
Vai a questa pagina
(http://www.bertinettobartolomeodavide.it/programmazione/allegroh/libro/libro.html) Vai quasi a fine pagina e scarichi "GUIDA COMPLETA IN FORMATO PDF".
La cosa più difficile è installare allegro:D :D .
Se usi dev c++ lascia stare l'instruzione che ci sono di creare un file. bak ed eseguirlo.Basta che vai su tools-->update-->e scarichi tutto quello che trovi con il nome "allegro":D
Se hai dei problemi chiedi pure
Ciao.

HipT
23-02-2007, 14:14
Una domanda...Ma tra directX e OpenGl.Qual'è la migliore?Che vantaggi portano le directx in confronto alle OpenGl che vanno sia in windows sia in unix?:mbe:
Altra cosa.Sto' scaricando l'sdk delle directX 10 per darci un'occhiata.
Ma su windows Xp funzionano lo stesso?(ho sentito voci che vanno solo su vista:mbe: ).
E le guide all'interno sono in inglese o anche in italiano?
Grazie:mc:

cionci
23-02-2007, 14:45
Meglio se scarichi solo quello delle DX9, almeno per ora credo che sia meglio farsi il callo su quelle...
DirectX funziona solo su Windows (la 10 solo su Vista)...

OpenGL è più o meno portabile fra Windows e Linux..

HipT
23-02-2007, 15:20
Ho scaricato l'SDK (avevo iniziato ieri sera altrimenti 440MB..:D )
Ho dato un'occhiata ma la documentazione compresa è tutta in inglese.
Non è che sai di una guida che ne parli in italiano?:mbe:
Grazie.
Ho dato un'occhiata su google ma trovo solo guide con le 8:mbe:

trallallero
23-02-2007, 15:22
E le guide all'interno sono in inglese o anche in italiano?
:nonsifa: i linguaggi sono in inglese e tu vuoi le guide in italiano ? :D

HipT
23-02-2007, 15:32
EHEH il linguaggio resti pure in inglese ma a cosa serve una funzione lo vorrei in italiano:D :D

CoreDump
23-02-2007, 15:36
Una domanda...Ma tra directX e OpenGl.Qual'è la migliore?Che vantaggi portano le directx in confronto alle OpenGl che vanno sia in windows sia in unix?:mbe:
Altra cosa.Sto' scaricando l'sdk delle directX 10 per darci un'occhiata.
Ma su windows Xp funzionano lo stesso?(ho sentito voci che vanno solo su vista:mbe: ).
E le guide all'interno sono in inglese o anche in italiano?
Grazie:mc:

A parte il fatto della portabilità su più piattaforme ( Linux, MacOs etc ) con le OpenGl come ha detto già Cionci la differenza sta nel
fatto che le directx sono una suite completa, in pratica oltre alla grafica, puoi gestire l'inizializzazione dello schermo, il suono, l'input
etc. etc. con le OpenGl no, in parole povere anche solo per inizializzare lo schermo in OpenGl ti devi affidare ad altre librerie
( Glut, GlFw, SDL o le stesse allegro ), lo stesso per il suono ( OpenAl, FMod etc. ) e via dicendo, insomma il compito delle OpenGl è principalmente
quello di fare la rasterizzazione delle primitive e poco altro, dai un'occhiata qui :

http://it.wikipedia.org/wiki/OpenGL

HipT
23-02-2007, 15:56
Grazie del link.:)
Una domanda.Ho trovato questo libro.Costa anche poco:D
"Programming Role Playing Games with DirectX" ma esiste in italiano?:mbe:

wingman87
23-02-2007, 18:41
Sto' usando questa guida (http://www.bertinettobartolomeodavide.it/programmazione/allegroh/libro/libro.html).A me sembra molto buona,spiega bene passo a passo,poi magari metti qualche commento (ne avro' messi 99 su 10 righe:D )
così poi ti trovi meglio per modificare il codice.
Allora.
Vai a questa pagina
(http://www.bertinettobartolomeodavide.it/programmazione/allegroh/libro/libro.html) Vai quasi a fine pagina e scarichi "GUIDA COMPLETA IN FORMATO PDF".
La cosa più difficile è installare allegro:D :D .
Se usi dev c++ lascia stare l'instruzione che ci sono di creare un file. bak ed eseguirlo.Basta che vai su tools-->update-->e scarichi tutto quello che trovi con il nome "allegro":D
Se hai dei problemi chiedi pure
Ciao.
Grazie mille, la libreria allegro l'ho già installata, appena ho tempo provo questa guida. Ti ringrazio ancora, ciao!

tomminno
23-02-2007, 19:49
Visto che le OpenGL nude e crude sono un pò ostiche, ci sono SDK come OGRE che rendono la vita un pò più facile, oltretutto wrappano OpenGL e DirectX.

trallallero
23-02-2007, 20:08
Grazie del link.:)
Una domanda.Ho trovato questo libro.Costa anche poco:D
"Programming Role Playing Games with DirectX" ma esiste in italiano?:mbe:
se vuoi un consiglio imparati l'inglese, ti viene anche più naturale programmare e non devi imparare a memoria le funzioni perchè capisci dal nome quello che fanno ;)

HipT
23-02-2007, 20:45
se vuoi un consiglio imparati l'inglese, ti viene anche più naturale programmare e non devi imparare a memoria le funzioni perchè capisci dal nome quello che fanno ;)

Ora come ora dal nome riesco a capire a grandi linee quello che fanno.E' che quando spiegano,dove metterla,come usarla ecc. usano termini assurdi:D .
Cerchero di interpretare:D più che altro a 15 anni non ho una cultura sulle lingue straniere da traduttore:muro: magari finita la scuola...:p
Ciaoz

ltmlmotig
23-02-2007, 21:33
un tic-tac-toe è facilmente realizzabile anche se lungo, la parte più difficile è quella relativa alla intelligenza artificiale del programma ( capire che mettendo il cerchio o la croce in un determinato punto vince / blocca il tuo )

trallallero
24-02-2007, 07:03
un tic-tac-toe è facilmente realizzabile anche se lungo, la parte più difficile è quella relativa alla intelligenza artificiale del programma ( capire che mettendo il cerchio o la croce in un determinato punto vince / blocca il tuo )
è stato il primo programma che ho fatto da solo in C col mitico Borland Turbo C++ e non mi è stato difficile implementare la logica. Secondo me non c'è bisogno di intelligenza artificiale (non ne sarei stato e non ne sarei capace) perchè son talmente poche le mosse che le puoi mettere benissimo in una serie di if

HipT
24-02-2007, 07:16
:mbe: Ci stavo propio pensando ieri di fare una specie di Tris con allegro:mbe:
Il problema era appunto far "capire" al computer dove mettere la croce con un po' di senso non mettendole a caso:D .
Pero' trallalero adesso che mi ci fai pensare hai ragione,le mosse sono poche,anche se le mette sensa senso...
Grazie:)

ltmlmotig
24-02-2007, 08:48
è stato il primo programma che ho fatto da solo in C col mitico Borland Turbo C++ e non mi è stato difficile implementare la logica. Secondo me non c'è bisogno di intelligenza artificiale (non ne sarei stato e non ne sarei capace) perchè son talmente poche le mosse che le puoi mettere benissimo in una serie di if

in effetti, lavorando su una matrice, basta (semplificando):

per ogni croce del giocatore umano
- controllare le caselle adiacenti (uno o due controlli) sulle diagonali - ascisse - ordinate
- SE è presente un'altra croce, e il pc NON ha la possibilità di vincere subito,
blocca la mossa ( metti il cerchio )
..

e una parte di codice simile relativa alle mosse non di difesa ma di "attacco"

HipT
24-02-2007, 13:36
E' quello il problema,bloccare la mossa.Oggi in corriera mentre tornavo da suola ci pensavo.Ditemi se mi sono complicato troppo le cose:D Pensavo ad una cosa del tipo:
-data la distanza tra il centro di una casella e l'altra se la distanza tra una croce del giocatore e l'altra è minore di questa (praticamente è attaccata) allora deve bloccare la mossa,ma come?Allora pensavo di fare tipo:
-Se deve bloccare le caselle adiacenti agli assi non c'è problema perchè basta che posizioni un cerchio del computer alla somma delle coordinate x O y.
-Se sta' in diagonale pensavo alla cosa un po' + complessa.
Praticamente calcola la diagonale (dove mettere il cerchio) usando ilteorema di pitagora così:
trova la diagonale del primo triangolo e del secondo,somma le diagonali e trovando la coordinata di dove mettere il cerchio.
Ho messo in allegato un'immagine (fatta con paint :D) di come calcolerebbe dove mettere il cerchio nella diagonale.

E' una soluzione?
Grazie.
Ciao!

cionci
24-02-2007, 14:01
Guarda ci sono tanti tipi di soluzioni...ottimali e non ottimali.

Se ne vuoi una ottimale:

- il gioco si esplora tutte le possibili mosse successive che potrebbero essere generate dal posizionamento del segno in una cella e si sceglie la mossa corrente come quella genera meno possibilità di vincere al concorrente. In questo modo è impossibile perdere
- definisci dei pattern (possono essere derivati anche dal calcolo sopra): con i segni in delle date posizioni lui ha già preimpostato dove mettere il segno. I pattern non sono tanti anche considerando le simmetrie (infatti si riducono ad un quarto del totale ruotando il campo di gioco). Non occorre confrontare cella per cella con il pattern, ma basta farsi un calcolo abbastanza semplice (da studiare) per riepilogare le posizioni attuali tramite un numero (ad esempio potrebbe essere un numero a 9 cifre in base 3 - vuoto, X o O). Poi converti il campo di gioco in questa cifra (una conversione ruotando ogni volta il campo di gioco di 90°) e poi ti vai a vedere nella lista dei pattern se ce n'è uno corrispondente a questa posizione (anche i pattern saranno identificati con il numero che li rappresenta). Nota che se i pattern sono esaustivi allora anche qui è impossibile perdere.

Non ottimale:

- se ci sono due segni avversari su una colonna o su una riga più una cella libera, posiziona il segno nella cella libera, altrimenti posizioni il segno in una cella a caso. Qui il computer può perdere.

HipT
24-02-2007, 14:35
Hem meglio la prima o la terza,sia perchè il computer può perde:D Sia perchè non ho capito la seconda soluzione:cry:
Probabilmente non sono abbastanza preparato per quella:cry:
Una domanda,nella prima soluzione,per fare il controllo di ogni mossa devo inserire degli if annidati?:mbe:
Grazie.
Ciao!

cionci
24-02-2007, 15:14
No dovresti fare una ricorsione fino ad arrivare alla conclusione della partita esplorando tutte le possibili posizioni...probabilmente è un po' lunghetto...

Ad esempio in pseudo codice:

vittoria(caselle)
{
se ci sono tre segni uguali nella stessa riga o colonna
ritorno vero
altrimenti
ritorno falso
}

esplora_soluzioni(caselle)
{
vittorie_avversario = 0
per ogni casella libera in caselle
{
posiziono il segno dell'avversario nella casella libera
se vittoria(caselle) = vero
vittorie_avversario++
altrimenti
{
per ogni casella libera in caselle
{
posiziono il mio segno nella casella libera
se vittoria(caselle) = falso
vittorie_avversario += esplora_soluzioni(caselle)
}
}
}
return vittorie_avversario
}

Per sapere dove posizionare il mio segno:

vittorie_min = INT_MAX
prossima_casella
per ogni casella libera in caselle
{
posiziono il mio segno nella casella libera
vittorie = esplora_soluzioni(caselle);
elimino il mio segno dalla casella libera
se vittoria < vittoria_min
{
prossima_casella = casella libera
vittoria_min = vittoria
}
}

posiziono il mio segno nella prossima_casella

ltmlmotig
24-02-2007, 16:51
esatto.

HipT
24-02-2007, 21:57
Ho un problema,è da circa 2 ore che cerco di fare la presentazione iniziale.
Praticamente dato che con allegro non posso caricare le gif mettevo in successione una serie di BMP (lo so' son pesantissime!:cry: ).
Avevo deciso di inserirci un "timer" (al raggiungimento ti TOT cicli fai...) ma o restava sermpre caricato il primo fotogramma oppure continuavano a cambiare ad una velocità assurda:muro:
I fotogrammi sono 9.Ma per fare la prova ho iniziato con 2.
Posto il codice
#include "allegro.h"
#include "stdio.h"
BITMAP *buf,*intro_1,*intro_2;
int timer,go,gos;
PALETTE colori;
void doppiobuffering()
{
vsync();
blit(buf,screen,0,0,0,0,1280,1024);
clear(buf);
}
void presentazione()
{
if (go==1)
{
while(!key[KEY_SPACE])
{
if (gos==0)
{
blit(intro_1,screen,0,0,0,0,1280,1024);
gos=1;
if (gos==1)
{
timer++;
if (timer>100)
{
blit (intro_2,screen,0,0,0,0,1280,1024);
gos=2;
}

}
}
}
}
}
int main()
{
allegro_init();
install_keyboard();
set_palette(colori);
set_gfx_mode(GFX_AUTODETECT,1280,1024,0,0);
buf=create_bitmap(1280,1024);
intro_1=load_bmp("img/intro/intro_1.bmp",colori);
intro_2=load_bmp("img/intro/intro_2.bmp",colori);
timer=0;
go=1;
clear (buf);
while(!key[KEY_ESC])
{
doppiobuffering();
presentazione();

}

destroy_bitmap(buf);
destroy_bitmap(intro_1);
destroy_bitmap(intro_2);
}
END_OF_MAIN();


GOS serve per non far ripetere un'immagine.
Timer per aspettare prima della prossima visualizzazione.
Il problema è che se metto "if (timer>100)" si vede solo il primo.Se metto "if (timer=100)" invece visualizza subito il secondo (appena premo compila,senza darmi il tempo di vedere il 1°).Ma questo vuol dire che per 100 c'è passato,perchè allora non
non lo visualizza nel primo modo?
Come faccio a fare un timer che praticamente dopo 2 secondi visualizzi il fotogramma successivo?

Ps:Sulla guida che ho usato per fare il primo,c'è usato questo tipo di "timer",incrementava timer finchè non arrivava a 100 per tener visualizzata un'immagine.
P-Ps:D: lo so' che le BMP sono pesanti pero' non posso visualizzare gif con allegro,almeno credo. :cry:
Grazie per tutto.
Ciao!

HipT
25-02-2007, 19:49
mmm.Ho cercato e ho trovato questa libreria da agigungere ad allegro per caricare le gif (comprese le animazioni .gif) al posto delle BMP.
Il problema è che non riesco a installarle:mbe:
Su questo sito (http://algif.sourceforge.net/) nella sezione HOW TO USE dicono comne installarle.
Voi capite cosa bisogna fare?:confused:
dove devo aggiungere le due stringhe per compilare il progetto?
Se io compilo un file con #include <algif.h>
mi dice che non trova la libreria.
Grazie