"Trúc xinh" với những lá bài

  • Thread starter Thread starter SA_DQ
  • Ngày gửi Ngày gửi
Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,567
Được thích
22,873
Nghề nghiệp
U80
Xin mời nhấn chuột vô 1 cặp lá bài để tìm sự may mắn. Í là con số 13

Đây tạm gọi là VER 1.0 vì còn rất thô sơ;

Những mong có các bạn, cũng như PTM tiếp tục fát triển!
 

File đính kèm

Xin mời nhấn chuột vô 1 cặp lá bài để tìm sự may mắn. Í là con số 13

Đây tạm gọi là VER 1.0 vì còn rất thô sơ;

Những mong có các bạn, cũng như PTM tiếp tục fát triển!

Hay quá (lật bài), nhưng hỏng hiểu gì hết, bởi 1 cặp số có 13 nút thì lật úp 2 lá bài, mình bấm lại thì báo 10 điểm nữa! Phải chi sau khi có 10 điểm, đảo vị trí ngẫu nhiên những lá bài vừa lật!

Cám ơn bác Sa!
 
Xin mời nhấn chuột vô 1 cặp lá bài để tìm sự may mắn. Í là con số 13

Đây tạm gọi là VER 1.0 vì còn rất thô sơ;

Những mong có các bạn, cũng như PTM tiếp tục fát triển!
Chơi ra mần răng Thầy? chẳng hiểu mô tê chi cả
 
Xin mời nhấn chuột vô 1 cặp lá bài để tìm sự may mắn. Í là con số 13

Đây tạm gọi là VER 1.0 vì còn rất thô sơ;

Những mong có các bạn, cũng như PTM tiếp tục fát triển!
Em góp ý:
- Dùng ClassModule thu gom mấy sự kiện Click ấy vào làm 1, như vậy đở tốn công viết mỗi Object 1 sub
- Dùng ImageList để chứa hình và dùng Image để lấy hình ra... như vậy người ta sẽ khó mà biết sư phụ đã giấu hình ở đâu
- Việc đưa hình vào ImageList có thể làm bằng tay 1 lần duy nhất
------------
Ngoài ra:
- Lý ra khi chọn được 1 cặp có tổng = 13 thì phải xáo bài chứ ---> Nếu không, người ta cứ chọn cặp này hoài và cứ.. được điểm hoài sao?
 
Em gữi sư phụ file ví dụ này!
1> Trong ClassModule
PHP:
Public WithEvents Img As Image
Private Sub Img_Click()
  Dim Num As Long
  Num = Replace(Img.Name, "Image", "")
  Check(Num) = Not Check(Num)
  If Check(Num) Then
    Img.Picture = Sheet1.ImageList1.ListImages.Item(Val(Num)).Picture
  Else
    Img.Picture = Sheet1.ImageList1.ListImages.Item(12).Picture
  End If
End Sub
2> Trong Module
PHP:
Public Img() As New MyClass
Public Check(1 To 10) As Boolean
Sub Auto_Open()
  Dim i As Long, Obj As OLEObject
  For Each Obj In ActiveSheet.OLEObjects
    If InStr(Obj.progID, "Forms.Image") Then
      ReDim Preserve Img(i)
      Set Img(i).Img = Obj.Object
      i = i + 1
    End If
  Next Obj
End Sub
Ở đây em dùng 10 Image để chứa hình, nhưng có dù có bao nhiều hình thì code cũng nhiêu đó thôi ---> Và đó là ưu điểm tuyệt vời khi dùng ClassModule
Nếu sư phụ không thích Image, có thể dùng object khác
 

File đính kèm

Một lý do cần fải xét đến là mới 20 lá bài mà file chú mày lên đến 87K rồi; Chú thử với 55 lá tất cả xem ra sao, có thuyết fục được lão này không đây??

Khà, khà,. . .

Chúc vui!
 
Một lý do cần fải xét đến là mới 20 lá bài mà file chú mày lên đến 87K rồi; Chú thử với 55 lá tất cả xem ra sao, có thuyết fục được lão này không đây??

Khà, khà,. . .

Chúc vui!
Sư phụ ơi, ở đây em chỉ nêu ý kiến dùng ClassModule thôi mà... Đó mới là quan trọng, vì giúp cho code của sư phụ rút gọn đi rất nhiều
Còn chuyện dung lượng thì... ẹc... ẹc... file của sư phụ bao nhiêu hình thì file em cũng bấy nhiêu thôi!
-----------------
Với các Object thuộc dạng Shape ta còn có thêm 1 cách nữa tham khảo:
PHP:
Sub Main()
  ActiveSheet.Shapes(Application.Caller).ZOrder 1
End Sub
Code ngắn đúng 1 dòng! Nói chung, game này về mặt thuật toán thì theo em hoàn toàn có thể làm được với code cực ngắn gọn
- Xáo bài
- Lật bài
- Tính điểm
(3 đoạn)
Sư phụ thử file này xem có giúp gì được không
 

File đính kèm

Cải tiến

Em cải tiến lại game này như sau:
1> Hiện 1 lần 52 lá bài (lật úp)
2> Cứ mỗi lần chơi, ta chọn từng lá bài... Nếu sau 2 lần chọn có tổng số điểm = 14 thì thắng
3> Điểm của lá bài được quy định:
- Con Ách: 1 điểm
- Con hai: 2 điểm
-...
- ...
- Con mười: 10 điểm
- Con bồi: 11 điểm
- Con đầm: 12 điểm
- Con già: 13 điểm
4> Sau khi được điểm thì các con bài sẽ được xáo ngẫu nhiên
Code được viết ngắn gọn thôi:

PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim Dic, Check As Boolean, TPoint As Long
PHP:
Sub Auto_Open()
  Shuffle
End Sub
PHP:
Sub Auto_Close()
  ThisWorkbook.Save
End Sub
PHP:
Sub Play()
  Check = Not Check
  With Sheet1.Shapes(Application.Caller)
    .ZOrder 1
    DoEvents
    TPoint = TPoint + Val(.AlternativeText)
    If Check = False Then
      If TPoint = 14 Then
        MsgBox "Ban duoc 10 diem"
        Shuffle
      Else
        Sleep 500
      End If
      DoEvents
      .Parent.Shapes.Range(Dic.Items).ZOrder 1
      TPoint = 0
    End If
  End With
End Sub
PHP:
Private Sub Shuffle()
  Dim PicRng As Range, PicName As String, PicCel As Range
  Dim i As Long, n As Long, Point As Long
  Set PicRng = Sheet1.Range("B2:N5")
  Set Dic = CreateObject("Scripting.Dictionary")
  Do
    Randomize
    i = Int(Rnd * 52)
    If Not Dic.Exists(i) Then
      PicName = "Pic" & Chr(Int(i / 13) + 65) & Format((i Mod 13) + 1, "00")
      Set PicCel = PicRng(Int(n / 13) + 1, (n Mod 13) + 1)
      Dic.Add i, PicName
      n = n + 1
      With Sheet1.Shapes(PicName)
        Point = Val(Right(.Name, 2))
        .Parent.Shapes("Cover_" & n).AlternativeText = Point
        .Left = PicCel.Left: .Top = PicCel.Top
        .Width = PicCel.Width: .Height = PicCel.Height
      End With
    End If
  Loop Until n = 52
End Sub
Tùy theo yêu cầu, có thể chỉnh sửa lại code ---> Chẳng hạn có thể quy định thêm:
- Sau bao nhiêu lần chọn mà chưa được điểm thì thua --> Chơi lại ván mới
- Khi tổng điểm đạt được mức quy định nào đó thì thắng ---> Cũng chơi lại ván mới
---------------------------
Xin sư phụ SA_DQ góp ý thêm
 

File đính kèm

Lần chỉnh sửa cuối:
(1) Của chú mày 52 lá bài, như tới 4 chất, nên thực tế chỉ cần bấm chuột khoảng chưa chục lần gì đó là fải xào lại rồi.

(2) Đã là bài thì fải tính biến hoá đi chứ, VD với tổng 13 thì ta có nhiều fương án tính điểm như sau:
Con Ác có thể tính là 0, 1 , 10 hay 11 điểm;
1 Con Ka thì như kỳ đà cản mũi, nhưng có 2 con Ka thì được 26 điểm, chẳng hạn . . . (Luật là do ta đề ra mà, hề, hề,. . . )
( Vả lại dân Âu lẫn Á đều "Thích" con này mà, . . !)

Vui nha!
 
(1) Của chú mày 52 lá bài, như tới 4 chất, nên thực tế chỉ cần bấm chuột khoảng chưa chục lần gì đó là fải xào lại rồi.

(2) Đã là bài thì fải tính biến hoá đi chứ, VD với tổng 13 thì ta có nhiều fương án tính điểm như sau:
Con Ác có thể tính là 0, 1 , 10 hay 11 điểm;
1 Con Ka thì như kỳ đà cản mũi, nhưng có 2 con Ka thì được 26 điểm, chẳng hạn . . . (Luật là do ta đề ra mà, hề, hề,. . . )
( Vả lại dân Âu lẫn Á đều "Thích" con này mà, . . !)

Vui nha!
Nói thật, cái vụ bài bạc này em không rành luật lắm
Em chỉ đưa ra thuật toán:
- Xáo bài rồi lưu vị trí vào Dictionary Object (em nghĩ không có món nào hơn được món này)
- Điểm con bài lưu trong AlternativeText
- Assign Macro toàn bộ Object vào chung 1 Sub
----------------
Mục đích cuối cùng của em với code này là RÚT GỌN
Sư phụ và các bạn khác nếu thích chơi thì tự quy định thôi!
 
Lần chỉnh sửa cuối:
Chú biết sao có dân nghiện games không; Vì người viết ra game đó đã chọc đúng chổ ngứa cho 1 người nghiệm đó.
Chú chỉ chú tâm đến thuật toán thì đã là cái cơ bản rồi; nhưng chú pinokiô gì đó của nước Ý fải có lổ mũi như trái cà rốt, ông hề Sac lô fải có mũ fớt (nĩ) vậy mới nêu đặc trưng tính cách . . .
Vui nha
Và đây là file tương tự file của chú mày về cách vận hành. --=0
 

File đính kèm

Lần chỉnh sửa cuối:
VER 1.2 đây, xin mời góp ý

--=0 --=0 --=0 --=0 --
=0 --=0 --=0 --=0 --=0
 

File đính kèm

Em click thật nhanh 16 con bài rồi nhìn và... nhớ ---> Sau khi nó úp xuống, em chọn 1 phát có ngay 10 hoặc 20 điểm liền
Ẹc... Ẹc...
Giải pháp: Bằng cách gì đó chỉ cho người ta click 2 lá thôi, sau khi 2 lá này úp thì mới có thể click tiếp (Em dùng BlockInput)
------------------
Ngoài ra: Hình như từ đầu đến giờ sư phụ chưa nêu ra quy định tính điểm thì phải ---> Ai biết gì đâu mà chơi ???
 
Lần chỉnh sửa cuối:
Em click thật nhanh 16 con bài rồi nhìn và... nhớ ---> Sau khi nó úp xuống, em chọn 1 phát có ngay 10 hoặc 20 điểm liền
Ẹc... Ẹc...
Giải pháp: Bằng cách gì đó chỉ cho người ta click 2 lá thôi, sau khi 2 lá này úp thì mới có thể click tiếp (Em dùng BlockInput)

Muốn chỉ click 2 lá hông cho click thêm thì đơn giản thôi:
PHP:
Public Lan As Byte

PHP:
Sub Auto_Open()
'. . . .Code cũ'
Lan = 0
End Sub

PHP:
Sub AnNut(Num As Double)
 Lan = Lan + 1
If Lan > 2 Then
Lan = 0
TroVe
 Exit Sub
Else
' . . . Code cũ '
End If
End Sub
 
Muốn chỉ click 2 lá hông cho click thêm thì đơn giản thôi:
PHP:
Public Lan As Byte
PHP:
Sub Auto_Open()
'. . . .Code cũ'
Lan = 0
End Sub
PHP:
Sub AnNut(Num As Double)
 Lan = Lan + 1
If Lan > 2 Then
Lan = 0
TroVe
 Exit Sub
Else
' . . . Code cũ '
End If
End Sub
Nghe thì có vẽ hợp lý, nhưng em nghĩ để giải quyết nó không đơn giản thế đâu sư phụ à! Lý do là code chạy có sự tham gia của Delay (Delay quá trình úp bài)
Sư phụ làm thử xem!
(Code của sư phụ SA_DQ dài dòng quá nên em cũng chẳng biết phải sửa chổ nào nữa)
Em thì dùng hàm API để Lock bàn phím, khá đơn giản ---> quá trình kiểm tra tổng điểm chính là lúc nó lock bàn phím
 
Test rồi ndu à, có thấy dư âm của delay, nhưng không đáng kể.
Muốn chắc ăn thì thêm 1 cái Msgbox "Click hoài, click 2 cái thôi", sẽ qua được cái delay.
 
Lần chỉnh sửa cuối:
Test rồi ndu à, có thấy dư âm của delay, nhưng không đáng kể.
Muốn chắc ăn thì thêm 1 cái Msgbox "Click hoài, click 2 cái thôi", sẽ qua được cái delay.
Là thế này nè sư phụ:
- Em click 1 lá, sẽ có 1 biến nhớ số lần = 1
- Em click tiếp 1 lá nữa, số lần = 2
- Nếu số lần = 2 thì XÉT TỔNG ĐIỂM
- Ở quá trình XÉT TỔNG ĐIỂM này, nếu không đạt thì phải Delay (mục đích để người ta kịp nhìn 2 lá bài xem có bị tính ăn gian không)
- Và trong quá trình Delay, đâu có điều gì ngăn cản ta click tiếp... thậm chí là click lia lịa luôn! ---> Mục đích người ta click như vậy để xem trước điểm lá bài và ăn gian
---------------------------------
Em giải quyết sự cố này kiểu khác ---> Có muốn click lia lịa cũng chẳng được
 

File đính kèm

Lần chỉnh sửa cuối:
Em thì dùng hàm API để Lock bàn phím, khá đơn giản ---> quá trình kiểm tra tổng điểm chính là lúc nó lock bàn phím

Có lẽ nên lock chuột chứ nhỉ?
 
-- Ngoài ra:
Hình như từ đầu đến giờ sư phụ chưa nêu ra quy định tính điểm thì phải ---> Ai biết gì đâu mà chơi ???

Luật chơi do ta tự đề ra mà; Như chú đang là tổng 2 con = 14;

Còn mình thì là tổng 2 con = 13; (được 13 điểm)

Nhưng có thêm:

(1) Con ác có thể được tính 1, 10 hay 11 điểm; Trừ khi tính 1 điểm, các cách còn lại chỉ được 10 điểm
Vd con Ác & con đầm:= 13 điểm; Con Ác & con 3 := 10 điểm, . . .
(2) Hai con Già := 26 điểm;
(3) Hai con Ác:= 20 điểm
. . . . . (Chú có thể thêm bớt những điều này)

Ngoài ra trò chơi kết thúc ván khi số điểm đạt hay vượt 100 (hay bao nhiêu đó do qui ước) hoặc quá 100 (. . . ) lần bấm chuột

Chú hoàn thiện tiếp trên file của chú đi nha, theo luật do chú đề ra, chi ly hơn con 14 khô không khốc của chú đi!

Khì, khì,. . . .
 
Web KT

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

Back
Top Bottom