Xếp gạch - Game kinh điển

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

VMH0307

Thành viên tiêu biểu
Tham gia
5/8/11
Bài viết
765
Được thích
605
Kính gửi: các Bác!
Em vừa hoàn thiện xong Game Xếp gạch, kính mời các bác thưởng thức. Em sử dụng event Keydown và Keyup để điều hướng cho game, nhưng hiện tượng Keyup không nhạy (có thể do code của em) nên hay bị dừng hiện tượng Rơi của gạch, để khắc phục điều này em đã cho xảy ra đồng thời việc điều khiển gạch và hiện tượng rơi nên hình có đôi chút giật, mong nhận được sự góp ý của các bác để game được hoàn thiện hơn.
Cám ơn các Bác

P/s:
Em chuyển file game đã chỉnh sửa với sự góp ý của mọi người đính kèm lên trang 1 ^^
 

File đính kèm

Lần chỉnh sửa cuối:
Kính gửi: các Bác!
Em vừa hoàn thiện xong Game Xếp gạch, kính mời các bác thưởng thức. Em sử dụng event Keydown và Keyup để điều hướng cho game, nhưng hiện tượng Keyup không nhạy (có thể do code của em) nên hay bị dừng hiện tượng Rơi của gạch, để khắc phục điều này em đã cho xảy ra đồng thời việc điều khiển gạch và hiện tượng rơi nên hình có đôi chút giật, mong nhận được sự góp ý của các bác để game được hoàn thiện hơn.
Cám ơn các Bác
Nói chung viết mấy code dạng này mà dùng hàm Sleep là THUA ---> Nó nặng nề quá trời luôn
 
Kính gửi: các Bác!
Em vừa hoàn thiện xong Game Xếp gạch, kính mời các bác thưởng thức. Em sử dụng event Keydown và Keyup để điều hướng cho game, nhưng hiện tượng Keyup không nhạy (có thể do code của em) nên hay bị dừng hiện tượng Rơi của gạch, để khắc phục điều này em đã cho xảy ra đồng thời việc điều khiển gạch và hiện tượng rơi nên hình có đôi chút giật, mong nhận được sự góp ý của các bác để game được hoàn thiện hơn.
Cám ơn các Bác

Hay ra phết. Code viết không nhiều có thể thuật toán của bạn cũng khá tốt. Tôi không có time để đọc từng dòng code của bạn bạn nên không góp ý cụ thể được. Quá trình chạy tôi thấy chưa được mịn.

Hướng có thể khắc phục như sau:
1. Cách tô và vẽ hình. Bạn đang dùng Condition Format. Vậy khi điền giá trị cho các hình bạn hãy gán cả mảng hình nó sẽ nhanh và không bị giựt.
Ví dụ
Range("A10:A14", "B14:C14").Value = 1
Như cách trên, một câu lệnh bạn tô một được hình chữ "L", chứ không phải chạy từng ô của chữ L.

2. Hiện tượng đồng hồ cát của chuột phải khử. Bạn nên tham khảo các bài viết về hàm API SetTimer & SkillTimer để thay cho vòng lặp và OnTimer() của Excel, hàm Sleep cũng có thể viết hàm riêng "MySleep(...)" với vòng lặp Do While, trong thân của hàm này gài DoEvents để tiếp nhận các sự kiện đang diễn ra của Excel, như vậy sẽ không bị đồng hồ cát và chạy mịn hơn nhiều.
 
File của bạn cũng khá hay, để hoàn thiện hơn bạn có thể tham khảo file đính kèm, trong đó:
1. Hiện tượng đồng hồ cát của chuột đã được khử (như ý bạn Nguyễn Duy Tuân).
2. Hình dạng "viên gạch" kế tiếp được hiển thị để người chơi chủ động (của bạn chỉ hiển thi viên gạch đang rơi).
3. Màu sắc các viên gạch thay đổi để tạo sự sinh động, bắt mắt.
4. Các chuyển động có vẻ như mịn màng hơn.
(file này tôi sưu tầm, không phải của tôi)
 

File đính kèm

File của bạn cũng khá hay, để hoàn thiện hơn bạn có thể tham khảo file đính kèm, trong đó:
1. Hiện tượng đồng hồ cát của chuột đã được khử (như ý bạn Nguyễn Duy Tuân).
2. Hình dạng "viên gạch" kế tiếp được hiển thị để người chơi chủ động (của bạn chỉ hiển thi viên gạch đang rơi).
3. Màu sắc các viên gạch thay đổi để tạo sự sinh động, bắt mắt.
4. Các chuyển động có vẻ như mịn màng hơn.
(file này tôi sưu tầm, không phải của tôi)

Cám ơn bạn đã chia sẻ. File của mình có hiển thị viên gạch kế tiếp đó ^^


Hay ra phết. Code viết không nhiều có thể thuật toán của bạn cũng khá tốt. Tôi không có time để đọc từng dòng code của bạn bạn nên không góp ý cụ thể được. Quá trình chạy tôi thấy chưa được mịn.

Hướng có thể khắc phục như sau:
1. Cách tô và vẽ hình. Bạn đang dùng Condition Format. Vậy khi điền giá trị cho các hình bạn hãy gán cả mảng hình nó sẽ nhanh và không bị giựt.
Ví dụ
Range("A10:A14", "B14:C14").Value = 1
Như cách trên, một câu lệnh bạn tô một được hình chữ "L", chứ không phải chạy từng ô của chữ L.

2. Hiện tượng đồng hồ cát của chuột phải khử. Bạn nên tham khảo các bài viết về hàm API SetTimer & SkillTimer để thay cho vòng lặp và OnTimer() của Excel, hàm Sleep cũng có thể viết hàm riêng "MySleep(...)" với vòng lặp Do While, trong thân của hàm này gài DoEvents để tiếp nhận các sự kiện đang diễn ra của Excel, như vậy sẽ không bị đồng hồ cát và chạy mịn hơn nhiều.
Cám ơn bác, em có chỉnh sửa lại file của em và gửi lại mọi người theo đính kèm. Em sử dụng Onkey thay cho event keydown, key up, sử dụng thư viện API SetTimer, KillTimer theo sự gợi ý của bác. Thật sự rất hay, loại bỏ được vòng lặp, cài đặt thời gian dễ dàng, code viết cũng thoáng hơn rất nhiều, hình ảnh được mịn hơn và control nhạy hơn, người chơi cảm nhận được tác dụng của phím rõ ràng hơn.
 
Rất thú vị! Chỉ hơi có vấn đề một chút ở phím Down. Nếu bạn cải thiện thêm một chút thì hay hơn: Nhấn phím Down thì viên gạch rơi ngay xuống dưới (chứ không phải rơi từ từ). Cách chơi hiện tại vẫn hơi mất thời gian vì vấn đề này.
Cảm ơn bạn đã chia sẻ.
 
Còn điểm là khi chạm xuống dưới nó ngay lập tức "dính" liền, còn game gốc bạn để ý kỹ sẽ thấy nó còn chừa thời gian để tiếp tục di chuyển.
 
Còn điểm là khi chạm xuống dưới nó ngay lập tức "dính" liền, còn game gốc bạn để ý kỹ sẽ thấy nó còn chừa thời gian để tiếp tục di chuyển.
Chính xác, vấn đề này dẫn đến khi chơi sẽ có nhiều "lỗ hổng"ở phía dưới do không thể dịch chuyển để lấp đầy chỗ trống.
 


Cám ơn bạn đã chia sẻ. File của mình có hiển thị viên gạch kế tiếp đó ^^



Cám ơn bác, em có chỉnh sửa lại file của em và gửi lại mọi người theo đính kèm. Em sử dụng Onkey thay cho event keydown, key up, sử dụng thư viện API SetTimer, KillTimer theo sự gợi ý của bác. Thật sự rất hay, loại bỏ được vòng lặp, cài đặt thời gian dễ dàng, code viết cũng thoáng hơn rất nhiều, hình ảnh được mịn hơn và control nhạy hơn, người chơi cảm nhận được tác dụng của phím rõ ràng hơn.

sao em ấn nút xuống khi vừa chạm là màn hình nó lấp đầy luôn còn chưa xếp đến viên thứ 2
 
Còn điểm là khi chạm xuống dưới nó ngay lập tức "dính" liền, còn game gốc bạn để ý kỹ sẽ thấy nó còn chừa thời gian để tiếp tục di chuyển.

Cám ơn bạn đã góp ý, cách giải quyết cũng khá đơn giản. Chúng ta sẽ tiến hành tạo thêm 1 vòng Timer nữa cho hiện tượng rơi khi gạch đến điểm dừng (nhưng không tăng thêm hàng), có thể viết thêm đoạn code như phần chữ đỏ bên dưới.

Rất thú vị! Chỉ hơi có vấn đề một chút ở phím Down. Nếu bạn cải thiện thêm một chút thì hay hơn: Nhấn phím Down thì viên gạch rơi ngay xuống dưới (chứ không phải rơi từ từ). Cách chơi hiện tại vẫn hơi mất thời gian vì vấn đề này.
Cảm ơn bạn đã chia sẻ.
Cám ơn bạn, vấn đề này mình cũng đã nghĩ tới. Mình muốn giữ nguyên bản của game là khi nhấn nút Down thì gạch sẽ rơi nhanh, khi nhả ra gạch sẽ rơi chậm. Ngoài ra tùy vào sở thích của từng người về nút Down này mình đã chú thích trong code đó, bạn chỉ cần xóa đoạn code màu tím ở dưới đi là xong
Chúc mọi người luôn vui vẻ ^^
Mã:
Private Function Roi()
[COLOR=#ff0000]If Check = False Then
    Range("AC40") = (Range("AC40") + 1) Mod 33[/COLOR]             [COLOR=#006400]'Gan gia tri toa do hang diem roi
[/COLOR][COLOR=#ff0000]Call Hienthi  [/COLOR]                                         [COLOR=#006400]'Kiem tra du lieu tren ban do
[/COLOR][COLOR=#ff0000]End If
[/COLOR]If Range("AC48") = 1 Then                               [COLOR=#006400]'Neu gap diem dung thi kiem tra cac dieu kien
[/COLOR]    [COLOR=#ff0000]If Check = False Then
[/COLOR]       [COLOR=#ff0000]Check = True [/COLOR]                               [COLOR=#006400]'Thiet lap ngat khong dung cho nua
[/COLOR]        [COLOR=#ff0000]Call StartTimer
            Exit Function
[/COLOR]  [COLOR=#ff0000]End If
[/COLOR]Kiemtra:
        If Range("AC49") > 0 Then                           [COLOR=#006400]'Xuat hien hang lien cho phep cat hang
[/COLOR]        Call Cat
            Range("as3") = Range("as3") + 100              [COLOR=#006400] 'Thuong 100 diem
[/COLOR]        If Int(Range("as3") / 1000) = Range("Ac43") Then   [COLOR=#006400]'Kiem tra neu diem so tang them 1000 diem thi tang them Level
[/COLOR]            Range("ac43") = Range("ac43") Mod 10 + 1
            End If
            If Range("AC49") > 0 Then                      [COLOR=#006400] 'Tien hanh lap de cat triet de cac hang lien
[/COLOR]            GoTo Kiemtra
        End If
        End If
            If Range("AC50") = 0 Then
                Call GameOver
                Call Ngaunhien                              [COLOR=#006400]'Thiet lap lai trang thai ban dau
[/COLOR]            Range("AC40") = 0                           [COLOR=#006400]'Thiet lap gach roi o vi tri chinh giua
[/COLOR]            Range("AC39") = 12
                Range("ac43") = Range("as17")               [COLOR=#006400]'Thiet lap Level tu chon
[/COLOR]            Range("as3") = 0                           [COLOR=#006400]'Reset lai diem so
[/COLOR]            [COLOR=#ff0000]Check = False[/COLOR]                                  [COLOR=#006400] 'Mo ngat cho
[/COLOR]            Call StopTimer                              [COLOR=#006400]'Dung roi
[/COLOR]            Exit Function
        End If
        Call Ngaunhien                                      [COLOR=#006400]'Gach dung tai vi tri cuoi cung => tien hanh goi [/COLOR]ngau nhien kieu gach, kieu tu the
        Range("AC40") = 0                                   [COLOR=#006400]'Thiet lap gach roi o vi tri chinh giua
[/COLOR]    Range("AC39") = 12
        Call Xoanho                                         [COLOR=#006400]'Cho phep luu gach o trang thai cuoi cung
[/COLOR]   [COLOR=#ff0000]Check = False[/COLOR]                                         [COLOR=#006400]'Mo ngat cho
[/COLOR]    Call StartTimer
        Exit Function
    End If
    [COLOR=#ff0000]Check = False[/COLOR]                                         [COLOR=#006400]'Mo ngat cho
[/COLOR][COLOR=#800080]Call StartTimer  [/COLOR]                                       [COLOR=#006400]'Tra ve trang thai Roi ban dau khi nut Down khong [/COLOR]nhan
End Function
 
Lần chỉnh sửa cuối:
Cái này có vẻ hấp dẫn đây :D , chơi thử thế nào ^^
 
em ngồi chơi thử thì có một vài ý kiến sau đây:
- vùng xếp gạch nó rộng quá, hình như cái bề rộng nó có tiêu chuẩn quốc tế rồi thì phải
- Cứ ấn nút xuống là điểm số nó tăng vù vù
 
em ngồi chơi thử thì có một vài ý kiến sau đây:
- vùng xếp gạch nó rộng quá, hình như cái bề rộng nó có tiêu chuẩn quốc tế rồi thì phải
- Cứ ấn nút xuống là điểm số nó tăng vù vù
Đúng rồi ấy, ý định của mình là: Khi các gạch thẳng hàng ngang thì điểm được tăng thêm 100 điểm, bình thường khi ấn nút Down 1 lần thì điểm tăng thêm 1 đơn vị, nếu giữ nhấn thì điểm tăng thêm tương ứng, cứ đạt thêm 1.000 điểm thì tăng 1 Level, tương ứng tốc độ rơi tăng lên -> đảm bảo thưởng điểm cho những ai chơi khéo và nhanh ||\

Mình cũng chưa tham khảo chiều dài rộng tiêu chuẩn đâu, hihi, mình cứ chọn màn hình 32x24 thôi, mình đưa ra ý tưởng, mọi người có thể mô- đi - phê được mà, ^^.

Cám ơn mọi người đã góp ý.
 
Web KT

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

Back
Top Bottom