Le jeu très basique qui consiste à deviner un nombre en un nombre de coups minimums. plusieurs options disponibles, gestion des scores.
utilisation de multi fenêtres filles, du pointeur this
Source / Exemple :
le fichier Ufille.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Ufille.h"
#include "Umenu.h"
#include "Unit1.h"
#include "Unom.h"
#include "Uoptions.h"
#include "Uscore.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFchild *Fchild;
//---------------------------------------------------------------------------
__fastcall TFchild::TFchild(TComponent* Owner)
: TForm(Owner)
{
tabedit[0] = Edit1;
tabedit[1] = Edit2;
tabedit[2] = Edit3;
tabedit[3] = Edit4;
tabedit[4] = Edit5;
tabedit[5] = Edit6;
tabedit[6] = Edit7;
tabedit[7] = Edit8;
tabedit[8] = Edit9;
tabedit[9] = Edit10;
tablabel[0] = Label1;
tablabel[1] = Label2;
tablabel[2] = Label3;
tablabel[3] = Label4;
tablabel[4] = Label5;
tablabel[5] = Label6;
tablabel[6] = Label7;
tablabel[7] = Label8;
tablabel[8] = Label9;
tablabel[9] = Label10;
tablabel[10] = Label11;
tablabel[11] = Label12;
tablabel[12] = Label13;
tablabel[13] = Label14;
tablabel[14] = Label15;
tablabel[15] = Label16;
tablabel[16] = Label17;
tablabel[17] = Label18;
tablabel[18] = Label19;
tablabel[19] = Label20;
Label2->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label10->Visible = false;
Edit2->Visible = false;
Edit3->Visible = false;
Edit4->Visible = false;
Edit5->Visible = false;
Edit6->Visible = false;
Edit7->Visible = false;
Edit8->Visible = false;
Edit9->Visible = false;
Edit10->Visible = false;
cpt = 0;
srand ((unsigned)time (&temps));
nb = rand()%(Foptions->MAX+1);
t1 = time(0);
}
//---------------------------------------------------------------------------
void __fastcall TFchild::FormClose(TObject *Sender, TCloseAction &Action)
{ // ferme la fiche fille et libère toute la mémoire allouée à la fiche
Action = caFree;
}
//---------------------------------------------------------------------------
void __fastcall TFchild::BitBtnvaliderClick(TObject *Sender)
{
int nblu; // nombre proposé par le joueur
test alex;
if (alex.isnum(tabedit[cpt]->Text)==false)
{
Application->MessageBox("La saisie doit être des chiffres.", "Erreur", MB_ICONERROR);
tabedit[cpt]->Clear();
return;
}
nblu = StrToInt(tabedit[cpt]->Text);
if ((nblu<0) || (nblu>Foptions->MAX))
{
AnsiString msga = "Le nombre doit être compris entre 0 et " + IntToStr(Foptions->MAX) + ".";
Application->MessageBox (msga.c_str(), "Erreur", MB_ICONERROR);
tabedit[cpt]->Clear();
return;
}
cpt++;
if (nblu==nb && cpt<= Foptions->ESSAI)
{
t2=time(0); // prise du temps
AnsiString msg = "Gagné en ";
if (cpt==1)
msg=msg + "1 coup et ";
else
msg = msg + IntToStr(cpt) + " coups et ";
Fnom->Labelnom->Caption = msg + tempo(t2-t1) + " Vous entrez dans la liste des meilleurs. Veuillez saisir votre nom :";
Fnom->ShowModal();
// inscription dans le tableaux des scores
if (cpt<10)
{
cptbis = "0" + IntToStr(cpt); // écrit 0x si le nombre de tentatives est < 10
}
else
cptbis = IntToStr(cpt);
switch (Foptions->MAX)
{
case 1000 : // le jeu était à 1000
{
Fscore->ListBox1->Items->Add(cptbis);
Fscore->ListBox2->Items->Add(temposcore(t2-t1));
Fscore->ListBox3->Items->Add(strlwr(Fnom->Editnom->Text.c_str())); // convertit le nom entré en minuscule
Fscore->ListBox4->Items->Add(IntToStr(Foptions->MAX));
Fscore->tricroissant (Fscore->ListBox1, Fscore->ListBox2, Fscore->ListBox3, Fscore->ListBox4, Fscore->ListBox1->Items->Count);
// permet de ne garder que les 100 meilleurs
if (Fscore->ListBox1->Items->Count > 100)
Fscore->meilleur (Fscore->ListBox1, Fscore->ListBox2, Fscore->ListBox3, Fscore->ListBox4, Fscore->ListBox1->Items->Count);
break;
}
case 100 : // le jeu était à 100
{
Fscore->ListBox5->Items->Add(cptbis);
Fscore->ListBox6->Items->Add(temposcore(t2-t1));
Fscore->ListBox7->Items->Add(strlwr(Fnom->Editnom->Text.c_str())); // convertit le nom entré en minuscule
Fscore->ListBox8->Items->Add(IntToStr(Foptions->MAX));
Fscore->tricroissant (Fscore->ListBox5, Fscore->ListBox6, Fscore->ListBox7, Fscore->ListBox8, Fscore->ListBox5->Items->Count);
// permet de ne garder que les 100 meilleurs
if (Fscore->ListBox5->Items->Count > 100)
Fscore->meilleur (Fscore->ListBox5, Fscore->ListBox6, Fscore->ListBox7, Fscore->ListBox8, Fscore->ListBox5->Items->Count);
break;
}
case 10 : // le jeu était à 10
{
Fscore->ListBox9->Items->Add(cptbis);
Fscore->ListBox10->Items->Add(temposcore(t2-t1));
Fscore->ListBox11->Items->Add(strlwr(Fnom->Editnom->Text.c_str())); // convertit le nom entré en minuscule
Fscore->ListBox12->Items->Add(IntToStr(Foptions->MAX));
Fscore->tricroissant (Fscore->ListBox9, Fscore->ListBox10, Fscore->ListBox11, Fscore->ListBox12, Fscore->ListBox9->Items->Count);
// permet de ne garder que les 100 meilleurs
if (Fscore->ListBox9->Items->Count > 100)
Fscore->meilleur (Fscore->ListBox9, Fscore->ListBox10, Fscore->ListBox11, Fscore->ListBox12, Fscore->ListBox9->Items->Count);
break;
}
}
Fnom->Editnom->Clear();
BitBtnvalider->Enabled = false;
BitBtnannuler->Enabled = false;
return;
}
else
{
if (cpt!=Foptions->ESSAI)
{
tablabel[cpt]->Visible = true;
tabedit[cpt]->Visible = true;
tabedit[cpt]->SetFocus();
}
if (nblu < nb)
tablabel[9+cpt]->Caption = "Votre nombre est trop petit ...";
if (nblu > nb)
tablabel[9+cpt]->Caption = "Votre nombre est trop grand ...";
if (cpt==Foptions->ESSAI)
{
AnsiString msgbis = "Le nombre était : " + IntToStr (nb);
Application->MessageBox(msgbis.c_str(), "Perdu", 0);
BitBtnvalider->Enabled = false;
BitBtnannuler->Enabled = false;
return;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TFchild::BitBtnannulerClick(TObject *Sender)
{
if (cpt!=10)
tabedit[cpt]->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TFchild::BitBtnaideClick(TObject *Sender)
{
Application->HelpCommand (HELP_FINDER, 0);
}
//---------------------------------------------------------------------------
AnsiString TFchild::tempo (long tps)
{
AnsiString retour;
long mn, sec;
sec = tps%60;
mn = (tps-sec)/60;
if (tps==0)
{
retour = IntToStr(sec) + " seconde !";
}
else
if (mn==0)
retour = IntToStr(sec) + " secondes !";
else
if (mn==1 && sec==0)
retour = IntToStr(mn) + " minute !";
else
if (mn==1 && sec==1)
retour = IntToStr(mn) + " minute et " + IntToStr(sec) + " seconde !";
else
if (mn==1 && sec>1)
retour = IntToStr(mn) + " minute et " + IntToStr(sec) + " secondes !";
else
if (mn>1 && sec==0)
retour = IntToStr(mn) + " minutes !";
else
if (mn>1 && sec==1)
retour = IntToStr(mn) + " minutes et " + IntToStr(sec) + " seconde !";
else
retour = IntToStr(mn) + " minutes et " + IntToStr(sec) + " secondes !";
return (retour);
}
//----------------------------------------------------------------------------
AnsiString TFchild::temposcore (long tpsscore)
{
// fonction qui convertit un nombre en un format de temps pour l'afficher dans les scores
AnsiString retourscore, retourhscore, retourmnscore, retoursecscore;
long hscore, mnscore, secscore, t;
t = tpsscore%3600; // variable intermédiaire
hscore = (tpsscore - t)/3600; // nb d'heures
secscore = t%60; // nb de secondes
mnscore = (t - secscore)/60; // nb de minutes
if (hscore<10)
{
retourhscore = "0" + IntToStr(hscore); // écrit 0x si le nombre est < 10
}
else
retourhscore = IntToStr(hscore);
if (mnscore<10)
{
retourmnscore = "0" + IntToStr(mnscore); // écrit 0x si le nombre est < 10
}
else
retourmnscore = IntToStr(mnscore);
if (secscore<10)
{
retoursecscore = "0" + IntToStr(secscore); // écrit 0x si le nombre est < 10
}
else
retoursecscore = IntToStr(secscore);
retourscore = retourhscore + " : " + retourmnscore + " : " + retoursecscore;
return (retourscore);
}
//----------------------------------------------------------------------------
void __fastcall TFchild::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (Fmenu->MDIChildCount==0)
{
Fmenu->Fentre1->Enabled = false;
Fmenu->Cascades1->Enabled = false;
Fmenu->mosaques1->Enabled = false;
}
else
{
Fmenu->Fentre1->Enabled = true;
Fmenu->Cascades1->Enabled = true;
Fmenu->mosaques1->Enabled = true;
}
if (BitBtnvalider->Enabled==true && BitBtnannuler->Enabled==true)
Fmenu->Options1->Enabled = false;
else
Fmenu->Options1->Enabled = true;
}
//---------------------------------------------------------------------------
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.