Trò chơi và hệ nhị phân
Hệ nhị phân có vị trí hết sức quan trọng trong máy tính. Có một trò chơi đơn
giản cho thấy hệ nhị phân cũng có một vai trò quyết định trong chiến thuật để
người biết luôn luôn thắng. Ta tạm gọi là trò chơi LẤY HẠT.
Trò chơi như sau: có 3 đống hạt và ban đầu mỗi đống phải có ít nhất 1 hạt. Hai
người chơi (hoặc một người và máy tính), lần lượt thực hiện như
sau: Với một số hạt đã cho,
người thứ nhất được quyền bố trí 3 đống sao cho mỗi đống có ít nhất 1 hạt; người thứ hai lấy một
số hạt theo nguyên tắc chỉ lấy trong một đống nào đó và phải lấy ít nhất 1 hạt hay có thể lấy tất
cả các hạt trong đống đó. Sau đó người thứ nhất lại phải lấy hạt theo nguyên tắc trên. Hai ngườ
i
lần lượt lấy hạt theo nguyên tắc đó cho đến khi người nào sau cùng phải lấy 1 hạt duy nhất thì
người đó thua.
Với số hạt là 3 hoặc một số nguyên dương chẵn và khác 2n
(n là số nguyên dương), bao giờ cũng có một chiến thuật để
người được quyền bố trí số hạt đầu tiên chiến thắng. Với số
hạt là một số nguyên dương lẻ lớn hơn 3 hoặc số nguyên
dương chẵn 2n (n là số nguyên lớn hơn 1) mà người thứ
nhất bố trí, người thứ hai biết chiến thuật luôn luôn chiến
thắng (dĩ nhiên phải thực hiện đúng chiến thuật, không hề
sơ suất). Chiến thuật này đơn giản, chứng minh không quá
khó nhưng cần có kiến thức chuyển đổi một số nguyên từ
hệ thập phân sang hệ nhị phân và lưu ý cộng theo hệ thập phân của các số viết theo hệ nhị phân!
Sau đây là trò chơi LẤY HẠT viết một cách đơn giản bằng VB 6.0, trong đó số hạt giới hạn của
mỗi đống không quá 25 hạt và người chơi với máy.
Tạo giao diện trò chơi
Chạy VB 6.0, chọn ứng dụng 'Standard EXE', bạn có form tên là Form1. Trong form này bạn tạo
các điều khiển sau (chỉ nêu một số tính chất chính, các tính chất khác có th
ể sử dụng mặc định;
Dim a, ZZ
For i = 0 To 2
Hat(i).Enabled = False
SoHat(i).Enabled = False
Next 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
Next i
' Ghi vào List một lần:
If h = True Then
List1.AddItem 'BẠN: ' & vbTab &
SoHat(0).Text & vbTab & SoHat(1)
& vbTab & SoHat(2)
h = False
End If
' Nếu có ít nhất hai đống cùng số hạt:
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ố hạt bằng 0 thì
= 1
If X(2) > X(0) And X(2) > X(1) Then z
= 2
n = Len(Trim(XX))
' Chuyển đổi thành chuỗi có chiều 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ố của XX có trị là 1 hoặc 3:
For i = 1 To n
If Mid(XX, i, 1) = 1 Or Mid(XX, i, 1) =
3 Then
'Xác định lại z khi gặp chữ số 1 ở cột i
sau đó thoát ngay vòng lặp 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
Next k
Exit For
' Nếu hai đống có số hạt bằng 1 thì:
If X(j Mod 3) = 1 Then
' Nếu số hạt đống còn lại là 0 hay 1
thì chọn đống (j mod 3):
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
Next j
' Ngược lại, không có hai đống nào có
số hạt bằng nhau:
Else
' Nếu có hai đống, một đống 0 hạt và
End If
Next i
' Tính tổng của hai đống kia theo hệ thập
phân:
YY = X((z + 1) Mod 3) + X((z + 2) Mod
3)
' Xác định ZZ là số hạt của đống z còn
lại sau khi lấy đi (theo hệ nhị phân):
ZZ = ''
For i = 1 To Len(Trim(YY))
a = Mid(YY, i, 1)
ZZ = ZZ & (a Mod 2)
Next i
ZZ = Val(ZZ)
' Xác định số hạt phải lấy đi của đống z:
' Khi XX toàn chữ số chẵn thì máy sẽ
thua, khi đó
' ZZ=X(z), chọn d=1 để chờ thời cơ bạn
If X(0) + X(1) = 1 Or X(1) + X(2) =
1 Or X(2) + X(0) = 1 Then
Next i
KetQua.Caption = 'Bạn chọn và bóc
hạt!'
End If
MayChoi.Enabled = False
End Sub