1. Trang chủ
  2. » Công Nghệ Thông Tin

Trò chơi và hệ nhị phân

6 424 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Trò Chơi Và Hệ Nhị Phân
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Thông Tin
Thể loại Bài Tập
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 6
Dung lượng 209,66 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Hai người chơi hoặc một người và máy tính, lần lượt thực hi

Trang 1

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; dùng font tiếng Việt nào đó; các mảng 1, 2, 3 phải đặt tương ứng):

Vị trí, kích thước của form1 và điều khiển tuỳ bạn bố trí sao cho đẹp và thuận tiện

Nhập code

Trong cửa sổ Code của Form1 bạn nhập các đoạn code theo mã nguồn mẫu (tải về mã nguồn trên website của TGVT-PCW VN) Chiến thuật nhị phân được thể hiện trong thủ tục MayChoi() Sau khi nhập code xong, biên dịch thành tập tin EXE để sử dụng

Trang 2

Hướng dẫn vắn tắt cách chơi

- Khi chạy chương trình bạn chọn một trong hai việc: 'Máy bố trí hạt' hoặc 'Bạn bố trí hạt', và sau

đó nhấn nút lệnh 'Bắt đầu'

- Nếu bạn bố trí hạt trước, bạn gõ số hạt trong TextBox và nhấn nút lệnh 'Số hạt:' trong từng đống

- Sau khi bạn bố trí số hạt đủ ba đống sẽ xuất hiện nút lệnh 'Máy thực hiện' Bạn nhấn nút lệnh này (Vì muốn người thi đấu có thời gian xem máy thực hiện nên ở đây tôi không viết chương trình cho máy tự động lấy hạt, nếu không bạn sẽ không theo dõi kịp) Cứ lần lượt thực hiện cho đến kết thúc

- Nếu bạn muốn lấy hạt: hãy chọn CheckBox trong đống nào đó, mỗi CheckBox được chọn là 1 hạt sẽ xoá Sau đó click nút lệnh 'Xoá hạt chọn'

- Nút lệnh 'Bắt đầu lại' dùng khi bạn muốn chơi lại trò chơi mà không chờ kết thúc

Trang 3

Frame: Thủ tục 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

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ì

(đống còn lại phải có số hạt lớn 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

' Lấy hết các hạt của đống còn lại (nhiều hơn 1):

z = (i + 2) Mod 3

d = Coso10(X(z)) Exit For

End If Next i 'Ngược lại:

Else ' Chú ý: các số viết trong hệ nhị phân nhưng

' cộng theo hệ thập phân!

XX = X(0) + X(1) + X(2) ' Xác định z cho đống nhiều hạt nhất:

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)) ' 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

Trang 4

' 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 Or X((j + 2)

Mod 3) = 1 Then

z = j Mod 3

d = 1

Exit For

End If

' Nếu số hạt đống còn lại lớn hơn 1

thì chọn đống này và lấy đi chỉ chừa

1 hạt:

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ố hạt bằng nhau và

lớn hơn 1 thì:

If X(j Mod 3) > 1 Then

' Nếu đống còn lại là 0, máy sẽ thua

nếu bạn biết chiến thuật,

' chọn d=1 để 'câu giờ' và chờ bạn sơ

suất:

If X((j + 2) Mod 3) = 0 Then

z = j Mod 3

d = 1

Exit For

End If

' Nếu đống còn lại có từ 1 hạt trở lên

thì lấy đi hết số hạt của đống này:

' Bạn 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

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

sơ suất

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 ' Kiểm tra kết quả KetQua.ForeColor = vbBlue

If T(0) + T(1) + T(2) = 1 Then KetQua.Caption = 'Xin lỗi! Bạn đã thua!'

For i = 0 To 2 Xoa(i).Enabled = False Next 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

Trang 5

một đống có 1 hạt:

' (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

Next i KetQua.Caption = 'Bạn chọn và bóc hạt!'

End If MayChoi.Enabled = False End Sub

Trang 6

 

Ngày đăng: 06/11/2013, 09:15

TỪ KHÓA LIÊN QUAN

w