Lập trò chơi Đoán số

Liên hệ QC
[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?
 
Web KT

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

Back
Top Bottom