Lập trò chơi Đoán số (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tham gia
14/9/12
Bài viết
312
Được thích
68
Nghề nghiệp
VT
Xin góp vui cùng bài toán. Cảm ơn
 

File đính kèm

Xin góp vui cùng bài toán. Cảm ơn

Tôi thử miêu tả lại:

1.Bạn hãy nhấn nút "bắt đầu" trên sheet để bắt đầu cuộc chơi bằng cách hiển thị Form

2. Hãy chọn khoảng các số nguyên dương và nghĩ trong đầu một con số nguyên dương trong khoảng đó

3. Khi nhấn nút "Bắt đầu" thì máy sẽ đoán con số bạn nghĩ trong đầu. Bạn có 3 lựa chọn:
a. Nếu số đúng thì bạn chọn "Đúng"
b. Nếu số của bạn nhỏ hơn số mà máy đề nghị thì bạn chọn "Nhỏ hơn"
c. Nếu số của bạn lớn hơn số mà máy đề nghị thì bạn chọn "Lớn hơn"

4. Nếu bạn chọn "Lớn hơn" hoặc "Nhỏ hơn" thì máy lại đề nghị con số mới và bạn lại phải lựa chọn.

5. Qua một số lần đề nghị hữu hạn thì máy sẽ đề xuất đúng số mà bạn nghĩ. Nếu lúc đó bạn vẫn không chọn "Đúng" thì máy sẽ phát hiện ra và báo với bạn là: "Bạn không trung thực"

6. Nếu bạn chọn "Đúng" thì vòng chơi kết thúc và lại có thể bắt đầu vòng chơi mới.
------------
Nếu máy nghĩ số (nhấn nút để máy rút thăm một số trong khoảng) và bạn đoán thì bạn bắt chước thuật toán của máy. Cũng có thể "thằng bạn" đóng vai trò của máy
--------------
Code viết vội, chưa test kỹ.
 

File đính kèm

Sau khi test thì thấy nó cũng chạy đúng, nhưng nhiều lần bấm quá không như mình xòe 12 lá bài (3 lần thôi).
 
Lần chỉnh sửa cuối:
Sau khi test thì thấy nó cũng chạy đúng, nhưng nhiều lần bấm quá không như mình xòe 12 lá bài (3 lần thôi).

Tôi thuộc loại người nếu kẻ tầm thường nói thì chậm hiểu, còn sư phụ nói thì như vịt nghe sấm. Chịu.
Nếu bạn chê bai thì chả có gì để nói thêm. Nhưng nếu là góp ý thì xin học hỏi.
Bạn có thể phát triển cụ thể ý của câu: "nhưng nhiều lần bấm quá không như mình xòe 12 lá bài (3 lần thôi)."?
 
Lần chỉnh sửa cuối:
Tôi thuộc loại người nếu kẻ tầm thường nói thì chậm hiểu, còn sư phụ nói thì như vịt nghe sấm. Chịu.
Nếu bạn chê bai thì chả có gì để nói thêm. Nhưng nếu là góp ý thì xin học hỏi.
Bạn có thể phát triển cụ thể ý của câu: "nhưng nhiều lần bấm quá không như mình xòe 12 lá bài (3 lần thôi)."?

Thằng bạn nó lấy 15 lá bài ra (15 chứ không phải 12) chia làm 3 phần nó cho mình chọn (tự nhìn) rồi nó xào lần thứ nhất, lại chia bài rồi sau 3 lần nó hỏi trong 3 phần bài đó có con bài của mình không, thì chắc chắn lần thứ 3 nó nói trúng phóc con bài mình chọn (nếu mình trung thực).

À, em không dám chê đâu nha, em dị ứng với câu này! Nếu cứ nghĩ thế thì không bao giờ em dám nói gì ở bài mà có Thầy viết nữa!
 
Lần chỉnh sửa cuối:
Đóng góp 1 trò đoán số:

* Nội dung:
- Cho 1 số gồm 4 chữ số: 4 chữ số này khác nhau từ 0 đến 9, chữ số 0 đứng ở đầu được chấp nhận
- Bạn hãy đoán ra số đó trong thời gian nhanh nhất
* Kết quả trả về (làm cơ sở để đoán tiếp)
Ví dụ cụ thể:
Chương trình chạy ra số ngẫu nhiên: 2498
- Bạn đoán lần 1 là 1234 => Kết quả 0 Correct - 2 Wrong ( có chữ số 2 & 4 nhưng sai vị trí)
- Bạn đoán lần 2 là 5678 => Kết quả 1 Correct - 0 Wrong ( đúng chữ số 8)
- Bạn đoán lần 3 là 1908 => Kết quả 1 Correct - 1 Wrong ( đúng chữ số 8 & sai vị trí chữ số 9)
- Bạn đoán lần 4 là 4398 => Kết quả 2 Correct - 1 Wrong ( đúng chữ số 8, 9 & sai vị trí chữ số 4)
- Bạn đoán lần 5 là 3498 => Kết quả 3 Correct - 0 Wrong ( đúng chữ số 8, 9 & 4)
- Bạn đoán lần 6 là 2498 => Kết quả 4 Correct - 0 Wrong => CONGRATULATIONS
Bài toán phải suy luận có khi cả chục lần vẫn nhầm (và cũng chỉ cho tối đa 10 lần đoán)

Xin hỏi cho Code cho thời gian Time chơi (Timer) cho vào form thế nào?
Code vừa viết thử, chưa test nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Thằng bạn nó lấy 15 lá bài ra (15 chứ không phải 12) chia làm 3 phần nó cho mình chọn (tự nhìn) rồi nó xào lần thứ nhất, lại chia bài rồi sau 3 lần nó hỏi trong 3 phần bài đó có con bài của mình không, thì chắc chắn lần thứ 3 nó nói trúng phóc con bài mình chọn (nếu mình trung thực).

Vì tôi không bao giờ ham chơi bài, game, chát, phây sờ búc v...v nên nói về những cái đó tôi không hiểu.
Nói về lần bấm thì đúng thôi vì tôi viết qua giao diên để có cái mà test code. Thế thôi. Nhưng xen vào 12 lá bài với 3 lần thì tôi không hiểu. Vì tôi lại nghi hoặc là thuật toán dùng nhiều lần đoán quá chăng. Rằng ai đó cho rằng có thuật toán đoán ít lần hơn chăng.

Nếu cứ nghĩ thế thì không bao giờ em dám nói gì ở bài mà có Thầy viết nữa!

Những ai đã từng đọc các bài của tôi thì biết là tôi không bao giờ lờ đi những góp ý về code như nhiều người khác. Vì code nó như trẻ sơ sinh, mọi cái nhìn rõ mồn một nên không cãi chầy cối được. Hoặc đúng-sai hoặc chuẩn-chưa chuẩn. Không có chuyện trắng đen lẫn lộn được.

Rất nhiều khi người góp ý chỉ ra chỗ chưa chuẩn hay nhầm lẫn thì tôi thường xin lỗi và cám ơn. Tôi không là sư phụ gì cả, vả lại luôn cho rằng ai cũng có lúc mắc phải lỗi. Vì thế không có gì phải hổ thẹn, đâu có phải "lờ đi" như nhiều người là coi như không có lỗi, là mình vẫn vĩ đại đâu. Đâu có phải nói một lời xin lỗi là giá trị của mình giảm đi đâu. Nhưng có nhiều người chọn cách lờ đi.

Về quan điểm, về sở thích có thể đôi co nhưng về code thì đối với tôi mọi người có thể thoải mái góp ý. Tôi đã từng xin lỗi và cám ơn khi nhầm lẫn và có người góp ý rồi, vậy sao lại ngại góp ý? Nhưng đã góp ý thì phải rõ ràng, tránh hiểu lầm.

Mà cứ tôi bạn là được.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Thằng bạn nó lấy 15 lá bài ra (15 chứ không phải 12) chia làm 3 phần nó cho mình chọn (tự nhìn) rồi nó xào lần thứ nhất, lại chia bài rồi sau 3 lần nó hỏi trong 3 phần bài đó có con bài của mình không, thì chắc chắn lần thứ 3 nó nói trúng phóc con bài mình chọn (nếu mình trung thực).....
Lần I: loại 10 còn 5
Lần II:
***Trường hợp a: loại 4, tóm được ngay, khỏi lần 3
***Trường hợp b: loại 3, còn 2
Lần III: tóm được em í thôi mà
Híc
 
Lần I: loại 10 còn 5
Lần II:
***Trường hợp a: loại 4, tóm được ngay, khỏi lần 3
***Trường hợp b: loại 3, còn 2
Lần III: tóm được em í thôi mà
Híc

gọi là LẦN đưa ra - chứ mỗi lần lại có thể xảy ra tối đa 2 câu hỏi (cho 2 phần) , tức là 2 lần hỏi
 
Vì tôi không bao giờ ham chơi bài, game, chát, phây sờ búc v...v nên nói về những cái đó tôi không hiểu.
Nói về lần bấm thì đúng thôi vì tôi viết qua giao diên để có cái mà test code. Thế thôi. Nhưng xen vào 12 lá bài với 3 lần thì tôi không hiểu. Vì tôi lại nghi hoặc là thuật toán dùng nhiều lần đoán quá chăng. Rằng ai đó cho rằng có thuật toán đoán ít lần hơn chăng.
......

Bác băn khoăn làm gì,

Vấn đề đưa ra là sự so sánh khập khiễng: số cây bài cố định (trong khi bài toán của bác siwtom là số không cố định tức là lớp bài toán), 3 lần là bị tráo khái niệm (vì số lần hỏi cho lượt chơi cũng có thể xảy ra tối đa 2 câu hỏi rui - như trả lời bài trên cho bác concogia) nên số lần có thể xảy ra thực chất là >3

Và cuối cùng bản chất vấn đề ngưòi đọc code của bác cần biết là Thuật toán chia đôi - đó mới là cần hiểu, thì họ lại không hiểu hoặc cố tình không hiểu, thật nực cười
 
Lần chỉnh sửa cuối:
gọi là LẦN đưa ra - chứ mỗi lần lại có thể xảy ra tối đa 2 câu hỏi (cho 2 phần) , tức là 2 lần hỏi
Híc, đây là mình đang nói về bài của bạn Nghĩa, sau khi xào bài, chia làm 3 phần, đặt câu hỏi thì là xong một lần ( dĩ nhiên có thể hỏi 1 hoặc nhiều nhất là 2 câu trong một lần, riêng lần thứ 3 - nếu xảy ra - chỉ duy nhất một câu )
Bài này và câu hỏi ở bài #1 chẳng ăn nhập gì với nhau cả bạn ạ
Thân
 
Bài này giống với bài mình đã giải ghê hồn!

Đóng góp 1 trò đoán số:

* Nội dung:
- Cho 1 số gồm 4 chữ số: 4 chữ số này khác nhau từ 0 đến 9, chữ số 0 đứng ở đầu được chấp nhận
- Bạn hãy đoán ra số đó trong thời gian nhanh nhất
* Kết quả trả về (làm cơ sở để đoán tiếp)
Ví dụ cụ thể:
Chương trình chạy ra số ngẫu nhiên: 2498
- Bạn đoán lần 1 là 1234 => Kết quả 0 Correct - 2 Wrong ( có chữ số 2 & 4 nhưng sai vị trí)
- Bạn đoán lần 2 là 5678 => Kết quả 1 Correct - 0 Wrong ( đúng chữ số 8)
- Bạn đoán lần 3 là 1908 => Kết quả 1 Correct - 1 Wrong ( đúng chữ số 8 & sai vị trí chữ số 9)
- Bạn đoán lần 4 là 4398 => Kết quả 2 Correct - 1 Wrong ( đúng chữ số 8, 9 & sai vị trí chữ số 4)
- Bạn đoán lần 5 là 3498 => Kết quả 3 Correct - 0 Wrong ( đúng chữ số 8, 9 & 4)
- Bạn đoán lần 6 là 2498 => Kết quả 4 Correct - 0 Wrong => CONGRATULATIONS
Bài toán phải suy luận có khi cả chục lần vẫn nhầm (và cũng chỉ cho tối đa 10 lần đoán)

Xin hỏi cho Code cho thời gian Time chơi (Timer) cho vào form thế nào?
Code vừa viết thử, chưa test nhiều.

Nó được viết tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?82-trò-chơi-BColor-của-SA_DQ
[thongbao]Hàm Rnd() cho 4 màu ngẫu nhiên trong 6/7 màu để khuất sau 4 ô;
Người chơi chọn 4 trong 6/7 màu & nhấn nút kiểm để máy cho biết kết quả so sánh với 4 màu trên; nếu đúng màu & đúng vị trí sẽ được báo X (& bị trừ 2 điểm- đầu ván biếu 71/76(7) điểm) nếu chỉ đúng màu sẽ báo O ( & trừ 1 điểm)
Trò chơi tiếp tục ở các hàng dưới (qua mỗi hàng bị trừ 3 điểm); Có tổng cộng 10 hàng; ~ người chơi hay chỉ cần khoảng 5-7 dòng là xong ván (khi đó bốn màu đã chọn ở hàng này trùng với 4 màu ngẫu nhiên mà máy đã chọn ban đầu & đúng theo trật tự nữa.
Ngày 29-30/08: Nút 7 dùng để chuyển đổi giữa 6 màu => 7 màu & ngược lại! Khi <> 7, nút có tác dụng dời vị trí [/thongbao]
 
Tôi thử miêu tả lại:

1.Bạn hãy nhấn nút "bắt đầu" trên sheet để bắt đầu cuộc chơi bằng cách hiển thị Form

2. Hãy chọn khoảng các số nguyên dương và nghĩ trong đầu một con số nguyên dương trong khoảng đó

3. Khi nhấn nút "Bắt đầu" thì máy sẽ đoán con số bạn nghĩ trong đầu. Bạn có 3 lựa chọn:
a. Nếu số đúng thì bạn chọn "Đúng"
b. Nếu số của bạn nhỏ hơn số mà máy đề nghị thì bạn chọn "Nhỏ hơn"
c. Nếu số của bạn lớn hơn số mà máy đề nghị thì bạn chọn "Lớn hơn"

4. Nếu bạn chọn "Lớn hơn" hoặc "Nhỏ hơn" thì máy lại đề nghị con số mới và bạn lại phải lựa chọn.

5. Qua một số lần đề nghị hữu hạn thì máy sẽ đề xuất đúng số mà bạn nghĩ. Nếu lúc đó bạn vẫn không chọn "Đúng" thì máy sẽ phát hiện ra và báo với bạn là: "Bạn không trung thực"

6. Nếu bạn chọn "Đúng" thì vòng chơi kết thúc và lại có thể bắt đầu vòng chơi mới.
------------
Nếu máy nghĩ số (nhấn nút để máy rút thăm một số trong khoảng) và bạn đoán thì bạn bắt chước thuật toán của máy. Cũng có thể "thằng bạn" đóng vai trò của máy
--------------
Code viết vội, chưa test kỹ.

Trước tiên xin cảm ơn siwtom. Bạn miêu tả rất đúng ý mình. sáng nay mình đã gửi trả lời sao bây giờ lại không thấy nhỉ hay tại mình không bấm gửi nhỉ. Mình đã chạy thử, đúng là như vậy đấy. Nhưng nếu bỏ mục "hãy chọn câu trả lời đi thì hay hơn". Một lần nữa xin cảm ơn siwtom nhé.
 
Trước tiên xin cảm ơn siwtom. Bạn miêu tả rất đúng ý mình. sáng nay mình đã gửi trả lời sao bây giờ lại không thấy nhỉ hay tại mình không bấm gửi nhỉ. Mình đã chạy thử, đúng là như vậy đấy. Nhưng nếu bỏ mục "hãy chọn câu trả lời đi thì hay hơn". Một lần nữa xin cảm ơn siwtom nhé.

Nếu bạn muốn thì bạn xóa đi. Chả nhẽ mỗi việc đó bạn không làm được?
Alt + F11 --> phải chuột trên UserForm1 chọn View code --> tự tìm hoặc Edit --> Find --> nhập Hay chon cau tra loi --> chỗ nào tìm thấy thì xóa. Có 2 chỗ.

Mà code có dài gì đâu. Cứ đọc từ đầu tới cuối, chả nhẽ không phát hiện ra
MsgBox "Hay chon cau tra loi"
 
Đóng góp 1 trò đoán số:
* Nội dung:
- Cho 1 số gồm 4 chữ số: 4 chữ số này khác nhau từ 0 đến 9, chữ số 0 đứng ở đầu được chấp nhận
- Bạn hãy đoán ra số đó trong thời gian nhanh nhất
* Kết quả trả về (làm cơ sở để đoán tiếp)
. . . .

Mình vừa thử sức với trò chơi của bạn; & cũng fải đến lần gần cuối mới tìm ra lời giải.
Trò này thật là thú vị & cảm ơn bạn rất nhiều!

Mình cho rằng 4 số này cho fép giống nhau thì mức độ khó của trò chơi sẽ nâng lên đáng kể.
(Lúc đó, thay vì chỉ cho 10 lần đoán, thì ta nới lên gấp rưỡi hay gắp đôi.)

Các bạn có thể cùng nhau fát triển trò chơi này trên trang tính đó nhỉ?!
Cũng là cách tu luyện giải thuật trong lập trình VBA nói riêng.

Chúc các bạn vui vẻ nhân dịp xuân về!
 
Phát triển Code trò đoán 4 số

Mình vừa thử sức với trò chơi của bạn; & cũng fải đến lần gần cuối mới tìm ra lời giải.
Trò này thật là thú vị & cảm ơn bạn rất nhiều!

Mình cho rằng 4 số này cho fép giống nhau thì mức độ khó của trò chơi sẽ nâng lên đáng kể.
(Lúc đó, thay vì chỉ cho 10 lần đoán, thì ta nới lên gấp rưỡi hay gắp đôi.)

Các bạn có thể cùng nhau fát triển trò chơi này trên trang tính đó nhỉ?!
Cũng là cách tu luyện giải thuật trong lập trình VBA nói riêng.

Chúc các bạn vui vẻ nhân dịp xuân về!
Đoán 4 chữ số khác nhau đã bở hơi tai rồi bạn ơi. Chơi từ đơn giản đến phức tạp thôi bạn (đoán nhiều lần quá người chơi sẽ ngán và bỏ dở, hic hic).
Bài này dùng tư duy và loại trừ khá hay (Các bạn chơi với em hoặc cháu chưa chắc đã "ăn" được đâu nhé)

Mình đã thêm được timer vào form

1) Khai báo biến t ở đầu Code trong form
Dim t

2) Code cho UserForm_Initialize
Mã:
Private Sub UserForm_Initialize()
t = Timer
With Sheet1
    .Range("Z1:Z4").Value = UniqueRandomNum(0, 9, 4)
    lblNumber = .[Z1] & .[Z2] & .[Z3] & .[Z4]
    lblNumber.Visible = False
End With
End Sub

3) Sau đó cho thời gian vào nếu đoán đúng số
Mã:
Private Sub CommandButton1_Click()
...

If n = 4 Then
lblNumber.Visible = True
MsgBox "CORRECT NUMBER:" & Chr(13) & Number & Chr(13) & Chr(13) & "Play time = " & Timer - t, , "Congratulations!"
Unload Me
End If
....

End Sub

Tuy nhiên code viết hơi bị "non". Các bạn có thể đưa ra giúp giải thuật nào tốt hơn. Hoặc chí ít sửa cho gọn giúp mình đoạn so sánh từng chữ số để lấy vị trí đúng/sai này:
Mã:
With Sheet1
If CLng(txtN1) = .[Z1] Then n = n + 1
If CLng(txtN1) = .[Z2] Or CLng(txtN1) = .[Z3] Or CLng(txtN1) = .[Z4] Then m = m + 1

If CLng(txtN2) = .[Z2] Then n = n + 1
If CLng(txtN2) = .[Z1] Or CLng(txtN2) = .[Z3] Or CLng(txtN2) = .[Z4] Then m = m + 1

If CLng(txtN3) = .[Z3] Then n = n + 1
If CLng(txtN3) = .[Z1] Or CLng(txtN3) = .[Z2] Or CLng(txtN3) = .[Z4] Then m = m + 1

If CLng(txtN4) = .[Z4] Then n = n + 1
If CLng(txtN4) = .[Z1] Or CLng(txtN4) = .[Z2] Or CLng(txtN4) = .[Z3] Then m = m + 1
End With
 

File đính kèm

Lần chỉnh sửa cuối:
Bài này dùng tư duy & loại trừ khá hay

Bỡi cần sử dụng tư duy loại trừ, nên có lúc tôi muốn nhập hai số giống nhau trong 2 ô lại không nhập được;
Ngược lại, có lúc tôi cần để trống 1 hay vài ô để chỉ kiểm tra 1 số nào đó thôi, thì chương trình chưa cho fép

Mong bạn xem xét đến vấn đề này & cho í kiến;

Ngoài cách tính giớ, chúng ta có thể cho điểm người chơi, không khống chế thời gian 1 cách cứng nhắc!

Ví dụ cho điểm như vầy:

Nhập 1 hàng (4 số), khi nhấn nút kiểm sẽ trừ đi 3 điểm; 1 ô "Correct" ta trừ 2 điểm; 1 ô "Wrong": trừ 1 điểm
Để làm việc này, ban đầu ta tặng người chơi 1 số điểm như nhau, như 123 điểm chẳng hạn.

Mong bạn quan tâm đến đề xuất!



,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(Mình vừa chơi được 1 ván rất may, như sau:
Num1|Num2|Num3|Num4||Correct|Wrong
9|8|7|6||0|1
0|1|2|3||2|0
4|5|9|8||1|0
4|7|2|3||2|1
Đ|Đ|Đ|Đ|||
Các bạn đoán xem mình nhập những số nào?)
 
Lần chỉnh sửa cuối:
Bỡi cần sử dụng tư duy loại trừ, nên có lúc tôi muốn nhập hai số giống nhau trong 2 ô lại không nhập được;
Ngược lại, có lúc tôi cần để trống 1 hay vài ô để chỉ kiểm tra 1 số nào đó thôi, thì chương trình chưa cho fép

Mong bạn xem xét đến vấn đề này & cho í kiến;

Ngoài cách tính giớ, chúng ta có thể cho điểm người chơi, không khống chế thời gian 1 cách cứng nhắc!

Ví dụ cho điểm như vầy:

Nhập 1 hàng (4 số), khi nhấn nút kiểm sẽ trừ đi 3 điểm; 1 ô "Correct" ta trừ 2 điểm; 1 ô "Wrong": trừ 1 điểm
Để làm việc này, ban đầu ta tặng người chơi 1 số điểm như nhau, như 123 điểm chẳng hạn.

Mong bạn quan tâm đến đề xuất!



,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(Mình vừa chơi được 1 ván rất may, như sau:
Num1|Num2|Num3|Num4||Correct|Wrong
9|8|7|6||0|1
0|1|2|3||2|0
4|5|9|8||1|0
4|7|2|3||2|1
Đ|Đ|Đ|Đ|||
Các bạn đoán xem mình nhập những số nào?)
7 5 2 3 đúng không bạn ChanhTQ?
Tư duy loại trừ chắc cũng gần giống cách mình hay chơi.
Diễn giải:
- Lần 1: 9 8 7 6 cho 0 số ở vị trí đúng & 1 số ở vị trí sai
- Lần 2: 0 1 2 3 cho 2 số ở vị trí đúng & 0 số ở vị trí sai (=> chắc chắn là 1 chữ số còn lại phải là 4 hoặc 5)
- Lần 3: 4 5 9 8 cho 1 số ở vị trí đúng & 0 số ở vị trí sai (từ thông tin lần 2 => không có số 9 và số 8)
- Lần 4: 4 7 2 3 cho 2 số ở vị trí đúng & 1 số ở vị trí sai (so sánh thông tin ở lần 2, lần 3 & lần 4 => số 2 và số 3 đúng vị trí, số 4 hoặc số 7 sai vị trí => kết hợp với lần 3 thì số 7 sai vị trí => số chính xác là 7523)
Nếu mình là người chơi thì ở lần 4 mình sẽ thử là 7423 để đảo vị trí số 4 so với lần 3 sẽ cho ta nhiều thông tin để sàng lọc hơn?

- Nếu nhập 2 số giống nhau trong 2 ô bạn muốn hiển thị kết quả thế nào => rất là loạn, khó tư duy logic
- Nguyên tắc không cho để ô trống cũng là bắt buộc người chơi phải khéo léo lựa chọn số để sàng lọc, loại trừ, tất nhiên sẽ có 1 phần may mắn.
- Bạn giúp mình thêm cách tính điểm để có thể cho người chơi lựa chọn chế độ (thời gian hoặc tính điểm) & được học hỏi thêm giải thuật/ code. Tks

Chúc mọi người chơi vui vẻ (liệu có nhiều người "thông minh hơn học sinh lớp 5" không ? hihi)
P/S:
Các bạn download file bài #16 và chơi thử rùi Post kết quả xem thế nào :))
trò này tính thời gian mới khó. hic hic
 
Lần chỉnh sửa cuối:
/-(ình như bộ tạo số ngẫu chưa được chú í đúng mức hay sao í!

[Thongbao]Tình cờ gặp lại số cũ nè bạn, chỉ trong ngày!
[/Thongbao]

DoanSo.JPG
 
[Thongbao]Tình cờ gặp lại số cũ nè bạn, chỉ trong ngày!
[/Thongbao]

View attachment 115599

Hàm tạo số ngẫu nhiên này là ứng dụng hàm của anhtuan1066
http://www.giaiphapexcel.com/forum/showthread.php?27286-Tạo-dãy-số-ngẫu-nhiên-không-trùng
Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function

Khi kích hoạt form sẽ tạo bộ số mới không trùng vào Sheet1.[Z1:Z4]
Mã:
Private Sub UserForm_Initialize()
t = Timer
With Sheet1
    [COLOR=#ff0000].Range("Z1:Z4").Value = UniqueRandomNum(0, 9, 4)[/COLOR]
    lblNumber = .[Z1] & .[Z2] & .[Z3] & .[Z4]
    lblNumber.Visible = False
End With
End Sub
Không hiểu sao lại lặp lại bộ số ngẫu nhiên thế nhỉ? Nhờ các bạn kiểm tra giúp

Hic, Vừa chạy thử lại thì không hiểu hàm tạo số ngẫu nhiên của anhtuan1066 cứ tạo ra 1 loại bộ số giống nhau
* Mở file => chơi lần 1 thì bộ số là 7523, chơi lần 2 là 7084 ...
Có phải do sai ở dòng màu đỏ không?
 
Lần chỉnh sửa cuối:
[ThongBao]Hàm tạo số ngẫu nhiên này là ứng dụng hàm của anhtuan1066

Mã:
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      Randomize   '<=|'   
     .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function

Bạn thử vầy coi sao?[/Thongbao]
 
Hàm tạo số ngẫu nhiên này là ứng dụng hàm của anhtuan1066
Hic, Vừa chạy thử lại thì không hiểu hàm tạo số ngẫu nhiên của anhtuan1066 cứ tạo ra 1 loại bộ số giống nhau
* Mở file => chơi lần 1 thì bộ số là 7523, chơi lần 2 là 7084 ...
Có phải do sai ở dòng màu đỏ không?


bỏ cái hàm đấy đi, cũ rùi, giờ bạn dùng cái mới của bac siwtom thuật toán hay hơn và không cần dictionary
Chả cần dùng đít to đít nhỏ đít thon gì cả. Thuật toán hoàn toàn đơn giản (giải thích trong hàm). Số vòng lặp luôn bằng số phần tử cần chọn. Dĩ nhiên phần tử được chọn sẽ không được phép chọn trong các lần tiếp theo, tức phải loại bỏ. Dùng đít to đít nhỏ với Exists hoặc không (bẫy lỗi) sẽ gặp trường hợp trùng thì "phí" một vòng lặp, tức số vòng lặp có thể > số phần tử cần chọn. Hàm dưới đây không dùng thêm công cụ nào cả.
tại link sau: http://www.giaiphapexcel.com/forum/...thức-tính-một-dạng-Tổ-hợp&p=408551#post408551

----------
Nhưng làm như bạn thì lộ đáp án rùi còn đâu, vì gán xuống she et - người ta có thể xem được đáp án,

Sửa lại toàn bộ cho bạn đây,

+ sử dụng Array thay vì sheet
+ thêm đồng hồ thời gian trên form (nếu thích countdown thì cho giá trị max và trừ ngược lại

+ tạm để nút hiện ẩn đáp án để mọi ng học tập kiểm tra chương trình (ai chơi nhớ trung thực nhé hihihiii) - cái nút nên bỏ khi hoàn thiện

+ ..... Nên thêm cách thức nút chịu thua - reset chơi mới ... vv

===> xem trong File kèm
-----------------

sao không thử bài toán ngược đó là chúng ta nghĩ ra số (ghi ra giấy chắc hạn), máy tính đi tìm số đo - bắt cách đưa ra đoán và hỏi ta xem sai đúng vị trí theo con số thế nào ????
 

File đính kèm

Lần chỉnh sửa cuối:
[thongbao]
Bỏ cái hàm đấy đi, cũ rùi, giờ bạn dùng cái mới của bac siwtom thuật toán hay hơn và không cần dictionary [/thongbao]

(1) Nhung trước khi bỏ, bạn thử tìm chổ sai xem sao;

(2) Còn như mình, lùn về trình độ, mình chỉ nghĩ được thuật toán vầy:
lấy chuỗi "0123456789" cắt ráp 4 lần; Cứ sau mỗi lần cắt ráp ta lại xén đi anh đầu tiên làm nguồn.
Vì có 4 số nên mình không quan tâm đến tốc độ cho lắm!

(3) Mình vẫn muốn rằng chương trình cho nhập chuỗi rỗng vô ô nào đó, Bạn nghĩ sao về vấn đề này?

Thân ái & chúc vui!
 
[thongbao]
Bỏ cái hàm đấy đi, cũ rùi, giờ bạn dùng cái mới của bac siwtom thuật toán hay hơn và không cần dictionary [/thongbao]

(1) Nhung trước khi bỏ, bạn thử tìm chổ sai xem sao;!

Cái này chắc phải đợi người hay dùng nó kiểm tra - thì chuẩn hơn, tiếc là vodoi2x không có nhiều thời gian rảnh để làm, và còn giờ có cái mới hay hơn thì ta cứ dùng cái mới đã



(2) Còn như mình, lùn về trình độ, mình chỉ nghĩ được thuật toán vầy:
lấy chuỗi "0123456789" cắt ráp 4 lần; Cứ sau mỗi lần cắt ráp ta lại xén đi anh đầu tiên làm nguồn.
Vì có 4 số nên mình không quan tâm đến tốc độ cho lắm!
!

Đúng là có 4 số có nhiều cách để lấy ngẫu nhiên,

Ví như: có thể dùng string như bạn và khi đó có thể dùng mid với thứ j là ngẫu nhiên --> sau mỗi lần lấy được 1 số thì dùng replace thay số đó bằng "" - cứ thế 4 lần sẽ lấy được đủ số 4 chữ số ngẫu nhiên không trùng thôi. Tuy vậy ở đây lười nên lấy hàm có sẵn luôn.

(3) Mình vẫn muốn rằng chương trình cho nhập chuỗi rỗng vô ô nào đó, Bạn nghĩ sao về vấn đề này?
Thân ái & chúc vui!

Xử lý thế thì được và như thế làm dễ cho người đoán hơn -- Nhưng e rằng khi đó đồng nghĩa giảm độ khó, thách thức của trò chơi - mất đi sự thú vị mà người đặt đề bài mong muốn.

vài lời lạm bàn vậy
 
+ thêm đồng hồ thời gian trên form (nếu thích countdown thì cho giá trị max và trừ ngược lại

+ ..... Nên thêm cách thức nút chịu thua - reset chơi mới ... vv

Đợi mãi chủ xướng khôg thấy phản hổi,
thôi sửa up lên cho các thành viên chơi tiện lợi hơn:

* có thể chơi nhiều ván - khôgn phải chạy lại chuơng trình

* Đã cập nhập cho phép người chơi có thể chấp nhận thua, chơi lại từ đầu

* thêm đồng hồ count down
Click vào đồng hồ - để thay đổi chế độ chơi (chỉ thay đổi được trong thời gian nhỉ - tức là không thể thay đổi khi đã đang trong ván chơi đoán số)
- Không tính thời gian : time+
- Tình thời gian: Count Down 4 phút -đặt số maxtime ở H8


===> xem trong File kèm

pas VBA: GPEGPEGPE
---------------------------------------------
Luật chơi thì tham khảo ở đây
Đóng góp 1 trò đoán số:

* Nội dung:
- Cho 1 số gồm 4 chữ số: 4 chữ số này khác nhau từ 0 đến 9, chữ số 0 đứng ở đầu được chấp nhận
- Bạn hãy đoán ra số đó trong thời gian nhanh nhất
* Kết quả trả về (làm cơ sở để đoán tiếp)
Ví dụ cụ thể:
Chương trình chạy ra số ngẫu nhiên: 2498
- Bạn đoán lần 1 là 1234 => Kết quả 0 Correct - 2 Wrong ( có chữ số 2 & 4 nhưng sai vị trí)
- Bạn đoán lần 2 là 5678 => Kết quả 1 Correct - 0 Wrong ( đúng chữ số 8)
- Bạn đoán lần 3 là 1908 => Kết quả 1 Correct - 1 Wrong ( đúng chữ số 8 & sai vị trí chữ số 9)
- Bạn đoán lần 4 là 4398 => Kết quả 2 Correct - 1 Wrong ( đúng chữ số 8, 9 & sai vị trí chữ số 4)
- Bạn đoán lần 5 là 3498 => Kết quả 3 Correct - 0 Wrong ( đúng chữ số 8, 9 & 4)
- Bạn đoán lần 6 là 2498 => Kết quả 4 Correct - 0 Wrong => CONGRATULATIONS
Bài toán phải suy luận có khi cả chục lần vẫn nhầm (và cũng chỉ cho tối đa 10 lần đoán)
 

File đính kèm

Lần chỉnh sửa cuối:
Xử lý thế thì được và như thế làm dễ cho người đoán hơn -- Nhưng e rằng khi đó đồng nghĩa giảm độ khó, thách thức của trò chơi - mất đi sự thú vị mà người đặt đề bài mong muốn.

Muốn khỏi mất đi thú vị vì giảm độ khó thì ta có thể tăng mức độ khó bằng cách khác, như cho máy chọn số trùng nhau ban đầu.
Khi đó thuật toán không đơn giản như bây giờ!

Vài lời lạm bàn & chúc vui!
 
Muốn khỏi mất đi thú vị vì giảm độ khó thì ta có thể tăng mức độ khó bằng cách khác, như cho máy chọn số trùng nhau ban đầu.
Khi đó thuật toán không đơn giản như bây giờ!

Vài lời lạm bàn & chúc vui!

Vậy ChanhTQ@ thử phương án như thế ở tập tin kèm sau đây

- cho phép để trống ô khi đoán, dĩ nhiên khi đó chỉ xét đúng sai các số hiện hữu

- Chưa xét trường hợp các số trùng nhau

- chưa chắc đã dễ hơn nhiều, vì có khi thêm lựa chọn người chơi càng khó quyết

- Chanh TQ@ thử test và xem có ý kiến sao : hay, khó, hoặc dễ hơn???

các thông tin khác, các bạn xem tại bài #25
 

File đính kèm

Lần chỉnh sửa cuối:
Mình vừa chơi được ván đầu, như sau:


Num1|Num2|Num3|Num4|Correct|Wrong
1|2|3|4|0|0
9|8|7|6|0|3
0|5|||0|1
6|7|8||0|3
8|0|6|7|0|3
Đ| Đ| Đ| Đ|||
 
Mình vừa chơi được ván đầu, như sau:


Num1|Num2|Num3|Num4|Correct|Wrong
1|2|3|4|0|0
9|8|7|6|0|3
0|5|||0|1
6|7|8||0|3
8|0|6|7|0|3
Đ| Đ| Đ| Đ|||

Chắc hẳn số tìm ra được (từ cách loại trừ) là : 7658

May mắn cho ChanhTQ@ là rơi vào trường hợp Wrong hết, hihii, Nhưng bước thứ 3 có vẻ là bước nhầm - đáng lẽ tại bước này nên nhập duy nhât 1 số 0 hoặc 5 mà thôi

----------
Nhưng cần thiết ChanhTQ@ cho ý kiến là để trống thế thì: hay, dở, khó, hoặc dễ hơn??? so với cách cũ
 
Theo mình thì khi bỏ trống được vài ô thì tìm 4 số sẽ nhanh hơn;

Trong trường hợp này thì bước 3 không cần để trống:


N1|N2|N3|N4||Correcst|Wrong
9|8|7|6||0|2
1|2|0|3||0|0
4|5|8|9||1|1
4|7|5|6||0|4
Đ|Đ|Đ|Đ||4|0
Bước cuối cũng còn ăn may!
 
Theo mình thì khi bỏ trống được vài ô thì tìm 4 số sẽ nhanh hơn;
Trong trường hợp này thì bước 3 không cần để trống:

N1|N2|N3|N4||Correcst|Wrong

9|8|7|6||0|2
1|2|0|3||0|0
4|5|8|9||1|1
4|7|5|6||0|4
Đ|Đ|Đ|Đ||4|0
Bước cuối cũng còn ăn may!

Đúng là may mắn số này khó đoán chỉ chắc vị trí số nào chỉ biết gồm 4 số : 4 7 5 6

GAME , nếu giải ngược: tức là cho người đưa ra số, máy tính đóng vai trò đoán số thì rất khó, bạn có ý kiến hay giải pháp gì không?
 

Bài viết mới nhất

Back
Top Bottom