Deviner 1 nombre en fenêtres filles

Description

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;
}
//---------------------------------------------------------------------------

Codes Sources

A voir également

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.