Trò chơi và h nh phân
H nh phân có v trí hết sc quan trng trong máy tính. Có mt trò chơi đơn
gin cho thy h nh phân cũng có mt vai trò quyết định trong chiến thut để
người biết luôn luôn thng. Ta tm gi là trò chơi LY HT.
Trò chơi như sau: có 3 đống ht và ban đầu mi đống phi có ít nht 1 ht. Hai
người chơi (hoc mt người và máy tính), ln lượt thc hin như sau: Vi mt s ht đã cho,
người th nht được quyn b trí 3 đống sao cho mi đống có ít nht 1 ht; người th hai ly mt
s ht theo nguyên tc ch ly trong mt đống nào đó và phi ly ít nht 1 ht hay có th ly tt
c các ht trong đống đó. Sau đó người th nht li phi ly ht theo nguyên tc trên. Hai người
ln lượt ly ht theo nguyên tc đó cho đến khi người nào sau cùng phi ly 1 ht duy nht thì
người đó thua.
Vi s ht là 3 hoc mt s nguyên dương chn và khác 2n
(n là s nguyên dương), bao gi cũng có mt chiến thut để
người được quyn b trí s ht đầu tiên chiến thng. Vi s
ht là mt s nguyên dương l ln hơn 3 hoc s nguyên
dương chn 2n (n là s nguyên ln hơn 1) mà người th
nht b trí, người th hai biết chiến thut luôn luôn chiến
thng (dĩ nhiên phi thc hin đúng chiến thut, không h
sơ sut). Chiến thut này đơn gin, chng minh không quá
khó nhưng cn có kiến thc chuyn đổi mt s nguyên t
h thp phân sang h nh phân và lưu ý cng theo h thp phân ca các s viết theo h nh phân!
Sau đây là trò chơi LY HT viết mt cách đơn gin bng VB 6.0, trong đó s ht gii hn ca
mi đống không quá 25 ht và người chơi vi máy.
To giao din trò chơi
Chy VB 6.0, chn ng dng 'Standard EXE', bn có form tên là Form1. Trong form này bn to
các điu khin sau (ch nêu mt s tính cht chính, các tính cht khác có th s dng mc định;
dùng font tiếng Vit nào đó; các mng 1, 2, 3 phi đặt tương ng):
V trí, kích thước ca form1 và điu khin tu bn b trí sao cho đẹp và thun tin.
Nhp code
Trong ca s Code ca Form1 bn nhp các đon code theo mã ngun mu (ti v mã ngun trên
website ca TGVT-PCW VN). Chiến thut nh phân được th hin trong th tc MayChoi().
Sau khi nhp code xong, biên dch thành tp tin EXE để s dng.
Hướng dn vn tt cách chơi
- Khi chy chương trình bn chn mt trong hai vic: 'Máy b trí ht' hoc 'Bn b trí ht', và sau
đó nhn nút lnh 'Bt đầu'.
- Nếu bn b trí ht trước, bn gõ s ht trong TextBox và nhn nút lnh 'S ht:' trong tng
đống.
- Sau khi bn b trí s ht đủ ba đống s xut hin nút lnh 'Máy thc hin'. Bn nhn nút lnh
này (Vì mun người thi đấu có thi gian xem máy thc hin nên đây tôi không viết chương
trình cho máy t động ly ht, nếu không bn s không theo dõi kp). C ln lượt thc hin cho
đến kết thúc.
- Nếu bn mun ly ht: hãy chn CheckBox trong đống nào đó, mi CheckBox được chn là 1
ht s xoá. Sau đó click nút lnh 'Xoá ht chn'.
- Nút lnh 'Bt đầu li' dùng khi bn mun chơi li trò chơi mà không ch kết thúc.
Frame: Th tc MayChoi()
Dim i As Integer, n As Integer, j As
Integer, k As Integer
Dim XX As Single
Dim Y(0 To 2) As String
Dim YY As Single
Dim a, ZZ
For i = 0 To 2
Hat(i).Enabled = False
SoHat(i).Enabled = False
N
ext i
For i = 0 To 24
If Check0(i).Visible = True And
Check0(i).Value = 1 Then
Check0(i).Value = 0
If Check1(i).Visible = True And
Check1(i).Value = 1 Then
Check1(i).Value = 0
If Check2(i).Visible = True And
Check2(i).Value = 1 Then
Check2(i).Value = 0
N
ext i
' Ghi vào List mt ln:
If h = True Then
List1.AddItem 'BN: ' & vbTab &
SoHat(0).Text & vbTab & SoHat(1)
& vbTab & SoHat(2)
h = False
End If
' Nếu có ít nht hai đống cùng s ht:
If (X(0) - X(1)) * (X(1) - X(2)) *
(X(2) - X(0)) = 0 Then
For j = 0 To 2
If X(j Mod 3) = X((j + 1) Mod 3)
Then
' Nếu hai đống có s ht bng 0 thì
(đống còn li phi có s ht ln hơn
1):
If X(j Mod 3) = 0 Then
If X((j + 2) Mod 3) > 1 Then
z = (j + 2) Mod 3
d = Coso10(X(z)) - 1
Exit For
End If
End If
For i = 0 To 2
If X(i Mod 3) + X((i + 1) Mod 3) = 1
Then
' Ly hết các ht ca đống còn li (nhiu
hơn 1):
z = (i + 2) Mod 3
d = Coso10(X(z))
Exit For
End If
N
ext i
'Ngược li:
Else
' Chú ý: các s viết trong h nh phân
nhưng
' cng theo h thp phân!
XX = X(0) + X(1) + X(2)
' Xác định z cho đống nhiu ht nht:
If X(0) > X(1) And X(0) > X(2) Then z
= 0
If X(1) > X(2) And X(1) > X(0) Then z
= 1
If X(2) > X(0) And X(2) > X(1) Then z
= 2
n = Len(Trim(XX))
' Chuyn đổi thành chui có chiu dài là
n:
Y(z) = CStr(X(z))
Y((z + 1) Mod 3) = String$(n -
Len(Trim(X((z + 1) Mod 3))), '0') &
CStr(X((z + 1) Mod 3))
Y((z + 2) Mod 3) = String$(n -
Len(Trim(X((z + 2) Mod 3))), '0') &
CStr(X((z + 2) Mod 3))
'Tìm ch s ca XX có tr là 1 hoc 3:
For i = 1 To n
If Mid(XX, i, 1) = 1 Or Mid(XX, i, 1) =
3 Then
'Xác định li z khi gp ch s 1 ct i
sau đó thoát ngay vòng lp k:
For k = 0 To 2
If Mid(Y((z + k) Mod 3), i, 1) = 1 Then
z = (z + k) Mod 3
Exit For
End If
N
ext
k
Exit For
' Nếu hai đống có s ht bng 1 thì:
If X(j Mod 3) = 1 Then
' Nếu s ht đống còn li là 0 hay 1
thì chn đống (j mod 3):
If X((j + 2) Mod 3) = 0 Or X((j + 2)
Mod 3) = 1 Then
z = j Mod 3
d = 1
Exit For
End If
' Nếu s ht đống còn li ln hơn 1
thì chn đống này và ly đi ch cha
1 ht:
If X((j + 2) Mod 3) > 1 Then
z = (j + 2) Mod 3
d = Coso10(X(z)) - 1
Exit For
End If
End If
' Nếu hai đống có s ht bng nhau và
ln hơn 1 thì:
If X(j Mod 3) > 1 Then
' Nếu đống còn li là 0, máy s thua
nếu bn biết chiến thut,
' chn d=1 để 'câu gi' và ch bn sơ
sut:
If X((j + 2) Mod 3) = 0 Then
z = j Mod 3
d = 1
Exit For
End If
' Nếu đống còn li có t 1 ht tr lên
thì ly đi hết s ht ca đống này:
' Bn s thua!
If X((j + 2) Mod 3) > 0 Then
z = (j + 2) Mod 3
d = Coso10(X(z))
Exit For
End If
End If
End If
N
ext j
' Ngược li, không có hai đống nào có
s ht bng nhau:
Else
' Nếu có hai đống, mt đống 0 ht và
End If
N
ext i
' Tính tng ca hai đống kia theo h thp
p
hân:
YY = X((z + 1) Mod 3) + X((z + 2) Mod
3)
' Xác định ZZ là s ht ca đống z còn
li sau khi ly đi (theo h nh phân):
ZZ = ''
For i = 1 To Len(Trim(YY))
a = Mid(YY, i, 1)
ZZ = ZZ & (a Mod 2)
N
ext i
ZZ = Val(ZZ)
' Xác định s ht phi ly đi ca đống z:
' Khi XX toàn ch s chn thì máy s
thua, khi đó
' ZZ=X(z), chn d=1 để ch thi cơ bn
sơ sut
If ZZ = X(z) Then
d = 1
Else
d = Coso10(X(z)) - Coso10(ZZ)
End If
End If
End If
g = True
Call Boc
g = False
' Kim tra kết qu
KetQua.ForeColor = vbBlue
If T(0) + T(1) + T(2) = 1 Then
KetQua.Caption = 'Xin li! Bn đã
thua!'
For i = 0 To 2
Xoa(i).Enabled = False
N
ext i
Option1.Visible = True
Option2.Visible = True
ChoiMoi.Visible = False
BatDau.Visible = True
BatDau.SetFocus
h = True
Else
For i = 0 To 2
Xoa(i).Enabled = True
mt đống có 1 ht:
' (Do các X không âm)
If X(0) + X(1) = 1 Or X(1) + X(2) =
1 Or X(2) + X(0) = 1 Then
N
ext i
KetQua.Caption = 'Bn chn và bóc
ht!'
End If
MayChoi.Enabled = False
End Sub