Dag 3 opgave 6 - version 2

Opgavens ordlyd er:
"HIGH-LOW guessing game

Implement an application that plays the HIGH-LOW guessing game with numbers.
The program should pick a random number between 1 and 100, and then repeatedly prompt the user to guess the number. On each guess, report to the user that he is correct, too low or too high. Continue until the user guesses the correct number or chooses to quit. At the end of each game, prompt the user to see if he wants to play again."

Herudover har jeg tilføjet et lille eksempel fra den bog ("Pro C# 2005 and the .NET 2.0 Platform" af Andrew Troelsen) underviserne har valgt som pensum til faget. Eksemplet er en opbygning af en statuslinie, der ud fra brugerens valg viser enten dags dato eller klokkeslet. Jeg vil ikke her gennemgå denne kode, rettighederne til den kode må jo tilhøre Andrew Troelsen eller forlaget Apress, da jeg afviger meget lidt fra hans kode.
Når jeg alligevel nævner eksemplet her, er det blot for at sikre, at du ikke bliver forvirret over de ekstra kodelinier hvis du kigger i kildekoden.


Koden er at finde nederst på denne side

Gå direkte til koden opgave 6 Form1.cs
Her kan du også downloade koden og selve programmet. Begge dele er lagt ud som .zip-filer.


Gennemgang af opgaveløsningen:

Denne løsning følger den stillede opgave. Da jeg allerede har kommenteret en hel del af opgaven på siden RandomNumber game version 1 vil jeg i gennemgangen her på siden koncentrere mig om forskellen i mellem de to løsninger.

Der er følgende forskelle:

  1. Det tilfældige tal dannes ved start af spillet. Hvis brugeren har gættet rigtigt og vil fortsætte dannes et nyt tilfældigt tal.
  2. GUI fungerer lidt anderledes - det tilfældige tal vises kun for brugeren (i messagebox), når denne afslutter spillet.
  3. Der er foretaget refactoring i koden, der vedrører selve opgaven HIGH-LOW guessing game

Refactoring omfatter:

Ændring i forhold til dannelsen af det tilfældige nummer:

Kodemæssigt sker der her allerede en ændring ved felt-erklæringerne. Her laver jeg et private felt randomNumber (stadig som en int). Dette gør jeg, for at opfylde opgavens krav om at brugeren skal blive ved med at gætte på det samme nummer indtil denne gætter rigtigt eller vælger at forlade spillet.
Nu kan jeg nemlig i formens constructor kalde metoden createNumber() og dermed sikre, at det tilfældige tal som min int randomNumber refererer til er synlig i hele formens scope.

//Default = 0 da generering sætter den til mellem 1 og 100:
private int randomNumber = 0;

        public Form1()
        {
            InitializeComponent();
            //Lav det tilfældige tal, når programmet startes:
            randomNumber = this.createNumber();               
            ........
        }

Næste ændring er i metoden bidBtn_Click(object sender, EventArgs e). I RandomNumber game version 1 kom der relativt tidligt i denne metode et kald til createNumber(), men det var samtidig medvirkende til at brugeren kun havde et gæt pr. tilfældigt tal.

private void bidBtn_Click(object sender, EventArgs e)
{
      try
      {
         DialogResult dr;
         //brugerens gæt:
         int guess = int.Parse(this.guessTxtBox.Text);

         //hvis det indtastede er mindre end eller lig med 100 og ikke er 0:
         if ((guess <= 100) && (guess != 0))
         {
            //tjek om brugerens gæt er korrekt:
            if (guess == randomNumber)
            {
            dr = this.setMessageBoxCaption("Du gættede rigtigt");
            }//tjek om brugerens gæt er for stort:
            else if (guess > randomNumber)
            {
            dr = this.setMessageBoxCaption("Dit tal var for højt");
            }//tjek om brugerens gæt er for lavt:
            else
            {
            dr = this.setMessageBoxCaption("Dit tal var for lavt");
            }
            //hvis brugeren siger ja til at prøve igen, og der blev gættet rigtigt:
            if (dr == DialogResult.Yes && guess==randomNumber)
            {
            //lav nyt tilfældigt tal:
            randomNumber = this.createNumber();
            ......

Når de to betingelser (brugeren siger ja til at prøve igen OG brugerens gæt var korrekt) er opfyldt på samme tid, laves der et nyt tilfældigt tal. Ellers ikke.



GUI på den anden måde:

Det væsentligste er, at hvad der før så sådan ud:
Billede af GUI fra randomNumberGame 1

Nu ser sådan ud:
Billede af GUI fra randomNumberGame 2
Tallet 19 er her demonstrativt omkredset af en rød firkant for at gøre opmærksom på, at tallet kun vises for at teste programmet. Hvis du vælger at installere og køre programmet, vises tallet ikke!
Uret i statusbaren forneden er min udlægning af et eksempel fra Andrew Troelsens bog.

Beskeden til brugeren, når denne har gættet rigtigt ser nu sådan ud:
Billede af GUI fra randomNumberGame 1




Refactoring:

setMessageBoxCaption(string s)
Når brugeren har gættet på et tal kommer der en lille meddelelsesboks op. Her kan brugeren vælger Yes/No (på min maskine da mit Windowsprogram er engelsksproget og disse knappers tekst bestemmes af den lille detalje). Derudover giver denne lille boks besked til brugeren om, hvorvidt der blev gættet korrekt, for lavt eller for højt. Det er disse tre muligheder som jeg har lavet refactoring på.

Selve metoden ser sådan ud:

private DialogResult setMessageBoxCaption(string s)
      {
      DialogResult dr;
      return dr = MessageBox.Show(Form1.ActiveForm, "Vil du prøve igen?", s, 
      -->MessageBoxButtons.YesNo);
      }

Som det ses i det første kodeuddrag her på siden, så indeholder string s en af følgende "Du gættede rigtigt", "Dit tal var for højt" eller "Dit tal var for lavt".
Forskellen mellem at kalde den nye metode 3 gange eller at undlade den og i stedet kalde MessageBox.Show(Form1.ActiveForm, "Vil du prøve igen?", "vilkårlig streng", MessageBoxButtons.YesNo) 3 gange med hver sin streng er ikke forrygende eller revolutionær. Efter min mening gør det blot koden mere læsevenlig.

cleanGuessTxtBox()

private void cleanGuessTxtBox()
	{
	this.guessTxtBox.Text = "";//tøm textboxens indhold
	this.guessTxtBox.Focus();//sæt fokus på textboxen/curser flyttes til textbox
	}

Igen er det ikke en kæmpe ting jeg har lavet, men endnu en gang får jeg gjort koden læsevenlig. De to kodelinier inde i metoden var før gentaget 3 forskellige steder. Nu kaldes metoden de tre steder og gevinsten er kun, at da metoden har et sigende navn, er det nemt at overskue hvad det er der sker i metoden bidBtn_Click(object sender, EventArgs e).



Henriette Rømer Dreier - 24. februar 2006







Download den samlede kode som .zip-fil


OBS:
Dette installationsprogram er udelukkende lavet for at lære, hvordan installationsprogrammer kan laves ved brug af Microsoft Visual Studio 2005.
Programmet ER en Windows applikation.
Der gives ingen garanti for at programmet kan installeres og køres på din maskine.
Enhver installation af programmet er på DIT EGET ansvar.
Programmet er ikke udviklet med henblik på kommercielt brug og må ikke anvendes hertil.

Programmet kan slettes igen fra Windows ved brug af "kontrolpanel" og "tilføj/fjern programmer".
Jeg ANBEFALER at anvende denne metode, da jeg ikke giver nogen garanti for, at sletning direkte i stifinder (directory) fjerner alle programdele.

Download programmet som .zip-fil


Indhold af Form1.cs

Indhold af Form1.Designer.cs

Valid CSS!

Valid XHTML 1.0!