Gissningslek
Antag
att det är två deltagare i leken.
Deltagare1 skriver in ett heltal mellan 0-9 och därefter
ska deltagare2 gissa vilket tal som skrevs in.
Vi ska istället för readln använda readkey.
Med readkey läser datorn in tecknet utan att man måste
"mata in" det med entertangenten.
Anledningen är att vi inte vill att talet ska synas på
skärmen för då blir leken så enkel.
(Man kan i och för sig tjyvkika på tangentbordet...)
readkey fungerar lite annorlunda eftersom den använder
sig av tilldelningsoperatorn, man kan bara läsa in ett
tecken dessutom får det det ASCII tecken tecknet svarar
mot.
ASCII tecknet för 0 är nr 48. Så om värdet
är 48 vet vi att det är 0 som matats in. De andra
siffrorna kommer efter i rätt ordning därför
kan vi göra om ASCII värdet till det tal det motsvarar
genom att subtrahera med 48. Det blir tydligare i koden förhoppningsvis.
Om
deltagare2 gissar ett för stort tal ska "För
stort, försök igen" skrivas ut, om talet är
för litet ska "För litet, försök
igen" skrivas ut.
När rätt tal är gissat ska "Rätt!"
skrivas ut.
Nä
vi nu börjar koda ska vi ställa oss frågan:
Vilken loop ska vi välja?
Om vi använder lathunden från förra
sidan ser vi att vi inte ska loopa ett bestämt antal
gånger eftersom vi inte vet hur många gissningar
det behövs innan rätt tal gissas.
Dessutom
måste ju deltagare få gissa åtminstone en
gång, dvs loopen ska upprepas minst en gång.
Utifrån detta ser vi att det är repeat until loopen
som passar bäst.
Då
börjar vi koda!
Koden finns att hämta här
ifall du vill.
program
gissa_tal;
uses Crt32;
{$APPTYPE Console}
var ch:char;
giss, talet:integer;
begin
clrscr;
writeln('Ge ett tal anvandare1');
ch:=readkey; {ch blir alltså
det ASCII tecken som} {siffran
motsvarar}
talet:=ord(ch)-48; {vi gör
om ASCII tecknets nr}
{i
ASCII tabellen till siffran}
{det
motsvarar,}
{tecknet
0 har plats 48}
{ord(ch)
ger platsen/numret}
{tecknet
har i ASCII tabellen}
clrscr;
repeat
begin
writeln('Gissa
talet!');
readln(giss);
if
(giss < talet) then
writeln('For
litet, forsok igen!')
else
if
(giss > talet) then
writeln('For
stort, forsok igen')
else
writeln('Ratt!');
end;
until (giss=talet);
readln;
end.
När
du har testat det här programmet och förstår
hur det fungerar tycker jag att du ska modifiera det så
att användare2 bara har t ex fyra gissningar på
sig innan det rätta svaret skrivs ut.
Kommer du inte på hur man gör tror jag du kan hitta
hjälp i avsnittet om sammansatta villkor.
Lycka till!
Det
har visat sig att readkey inte fungerar korrekt på vissa
datorer. Siffran som ska gissas syns när användare2
ska gissa.
Då får man göra programmet lite dummare och
använda den vanliga readln för att mata in den "okända"
siffran. Det kräver dock att användare2 inte tjyvkikar.
I detta alternativ slipper vi dessutom krånglet med
att omvandla tecknet till den siffra som är "okänd".
Alternativ
kod då readkey inte fungerar korrekt:
Koden finns här
att hämta.
program
gissa_tal2;
uses Crt32;
{$APPTYPE Console}
var giss, talet:integer;
begin
clrscr;
writeln('Ge ett tal anvandare1!');
writeln('Anvandare2, tjyvkika
inte!');
readln(talet);
clrscr; {vi rensar skärmen
direkt efter inmatningen}
repeat
begin
writeln('Gissa
talet!');
readln(giss);
if
(giss < talet) then
writeln('For
litet, forsok igen!')
else
if
(giss > talet) then
writeln('For
stort, forsok igen')
else
writeln('Ratt!');
end;
until (giss=talet);
readln;
end.
|