Number reversal game: Difference between revisions
Content added Content deleted
(→{{header|Vlang}}: Rename "Vlang" in "V (Vlang)") |
No edit summary |
||
Line 1,539: | Line 1,539: | ||
You took 9 attempts.</pre> |
You took 9 attempts.</pre> |
||
=={{header|Delphi}}== |
|||
{{works with|Delphi|6.0}} |
|||
{{libheader|SysUtils,StdCtrls}} |
|||
This program simulates a console application in an event-drivern, GUI application. It does this by creating a special helper object that manages the TMemo control. The helper-object waits for keystrokes and returns when the user has pressed a key or the program aborts. Notice how the object is created and destroyed every time you wait for a key stroke. This a common practice in Delphi and it works because the creation of an object is a low overhead opeation. That allows you to eliminate global variables and isolate resources to specific parts of the program. |
|||
<syntaxhighlight lang="Delphi"> |
|||
type TKeyWaiter = class(TObject) |
|||
private |
|||
FControl: TWinControl; |
|||
protected |
|||
procedure HandleKeyPress(Sender: TObject; var Key: Char); |
|||
public |
|||
KeyChar: Char; |
|||
ValidKey: boolean; |
|||
Abort: boolean; |
|||
constructor Create(Control: TWinControl); |
|||
function WaitForKey: char; |
|||
end; |
|||
{ TMemoWaiter } |
|||
type TControlHack = class(TWinControl) end; |
|||
constructor TKeyWaiter.Create(Control: TWinControl); |
|||
{Save the control we want to wait on} |
|||
begin |
|||
FControl:=Control; |
|||
end; |
|||
procedure TKeyWaiter.HandleKeyPress(Sender: TObject; var Key: Char); |
|||
{Handle captured key press} |
|||
begin |
|||
KeyChar:=Key; |
|||
ValidKey:=True; |
|||
end; |
|||
function TKeyWaiter.WaitForKey: char; |
|||
{Capture keypress event and wait for key press control} |
|||
{Spends most of its time sleep and aborts if the user} |
|||
{sets the abort flag or the program terminates} |
|||
begin |
|||
ValidKey:=False; |
|||
Abort:=False; |
|||
TControlHack(FControl).OnKeyPress:=HandleKeyPress; |
|||
repeat |
|||
begin |
|||
Application.ProcessMessages; |
|||
Sleep(100); |
|||
end |
|||
until ValidKey or Application.Terminated or Abort; |
|||
Result:=KeyChar; |
|||
end; |
|||
{===========================================================} |
|||
type TNumbers = array [0..8] of integer; |
|||
function WaitForKey(Memo: TMemo; Prompt: string): char; |
|||
{Wait for key stroke on TMemo component} |
|||
var KW: TKeyWaiter; |
|||
begin |
|||
{Use custom object to wait and capture key strokes} |
|||
KW:=TKeyWaiter.Create(Memo); |
|||
try |
|||
Memo.Lines.Add(Prompt); |
|||
Memo.SelStart:=Memo.SelStart-1; |
|||
Memo.SetFocus; |
|||
Result:=KW.WaitForKey; |
|||
finally KW.Free; end; |
|||
end; |
|||
procedure ScrambleNumbers(var Numbers: TNumbers); |
|||
{Scramble numbers into a random order} |
|||
var I,I1,I2,T: integer; |
|||
begin |
|||
for I:=0 to 8 do Numbers[I]:=I+1; |
|||
for I:=1 to 100 do |
|||
begin |
|||
I1:=Random(9); |
|||
I2:=Random(9); |
|||
T:=Numbers[I1]; |
|||
Numbers[I1]:=Numbers[I2]; |
|||
Numbers[I2]:=T; |
|||
end; |
|||
end; |
|||
function GetNumbersStr(Numbers: TNumbers): string; |
|||
{Return number order as a string} |
|||
var I: integer; |
|||
begin |
|||
Result:=''; |
|||
for I:=0 to High(Numbers) do |
|||
begin |
|||
if I<>0 then Result:=Result+' '; |
|||
Result:=Result+IntToStr(Numbers[I]); |
|||
end; |
|||
end; |
|||
procedure ReverseNumbers(var Numbers: TNumbers; Count: integer); |
|||
{Reverse the specified count of numbers from the start} |
|||
var NT: TNumbers; |
|||
var I,I1: integer; |
|||
begin |
|||
NT:=Numbers; |
|||
for I:=0 to Count-1 do |
|||
begin |
|||
I1:=(Count-1) - I; |
|||
Numbers[I1]:=NT[I]; |
|||
end; |
|||
end; |
|||
function IsWinner(Numbers: TNumbers): boolean; |
|||
{Check if is number is order 1..9} |
|||
var I: integer; |
|||
begin |
|||
Result:=False; |
|||
for I:=0 to High(Numbers) do |
|||
if Numbers[I]<>(I+1) then exit; |
|||
Result:=True; |
|||
end; |
|||
procedure ReverseGame(Memo: TMemo); |
|||
{Play the reverse game on specified memo} |
|||
var C: char; |
|||
var Numbers: TNumbers; |
|||
var S: string; |
|||
var R: integer; |
|||
begin |
|||
Randomize; |
|||
ScrambleNumbers(Numbers); |
|||
while true do |
|||
begin |
|||
S:=GetNumbersStr(Numbers); |
|||
C:=WaitForKey(Memo,S+' Number To Reverse: '); |
|||
if Application.Terminated then exit; |
|||
if C in ['x','X'] then break; |
|||
R:=byte(C) - $30; |
|||
ReverseNumbers(Numbers,R); |
|||
if IsWinner(Numbers) then |
|||
begin |
|||
S:=GetNumbersStr(Numbers); |
|||
Memo.Lines.Add(S+' - WINNER!!'); |
|||
break; |
|||
end; |
|||
end; |
|||
end; |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
8 5 2 9 7 4 6 3 1 Number To Reverse: 4 |
|||
9 2 5 8 7 4 6 3 1 Number To Reverse: 9 |
|||
1 3 6 4 7 8 5 2 9 Number To Reverse: 6 |
|||
8 7 4 6 3 1 5 2 9 Number To Reverse: 8 |
|||
2 5 1 3 6 4 7 8 9 Number To Reverse: 5 |
|||
6 3 1 5 2 4 7 8 9 Number To Reverse: 6 |
|||
4 2 5 1 3 6 7 8 9 Number To Reverse: 3 |
|||
5 2 4 1 3 6 7 8 9 Number To Reverse: 5 |
|||
3 1 4 2 5 6 7 8 9 Number To Reverse: 3 |
|||
4 1 3 2 5 6 7 8 9 Number To Reverse: 4 |
|||
2 3 1 4 5 6 7 8 9 Number To Reverse: 2 |
|||
3 2 1 4 5 6 7 8 9 Number To Reverse: 3 |
|||
1 2 3 4 5 6 7 8 9 - WINNER!! |
|||
</pre> |
|||
=={{header|Egel}}== |
=={{header|Egel}}== |