hngiatuong
CMC
- 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
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)."?
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).
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 I: loại 10 còn 5Thằ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
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.
......
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 )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
Đó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.
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é.
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)
. . . .
Đ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).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ề!
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
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
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
Bài này dùng tư duy & loại trừ khá hay
7 5 2 3 đúng không bạn ChanhTQ?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:
Các bạn đoán xem mình nhập những số nào?)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
Đ|Đ|Đ|Đ|||
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
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