Trò chơi bài cao hơn hoặc thấp hơn Python

Trong chương này, chúng ta xem xét một ví dụ lớn hơn sử dụng lập trình hướng đối tượng và tìm hiểu về tính năng kế thừa OOP rất hữu ích

8. 1. Thành phần¶

Đến bây giờ, bạn đã thấy một số ví dụ về thành phần. Một trong những ví dụ đầu tiên là sử dụng lời gọi phương thức như một phần của biểu thức. Một ví dụ khác là cấu trúc lồng nhau của các câu lệnh;

Sau khi xem mẫu này và đã tìm hiểu về danh sách và đối tượng, bạn không nên ngạc nhiên khi biết rằng bạn có thể tạo danh sách đối tượng. Bạn cũng có thể tạo đối tượng chứa danh sách [dưới dạng thuộc tính];

Trong chương này, chúng ta sẽ xem xét một số ví dụ về các kết hợp này, sử dụng đối tượng

three_of_clubs = Card[0, 3]
3 làm ví dụ

8. 2. ______03 đối tượng¶

Nếu bạn không quen thuộc với các quân bài thông thường, thì bây giờ là thời điểm tốt để kiếm một bộ bài, nếu không thì chương này có thể chẳng có ý nghĩa gì nhiều. Có năm mươi hai quân bài trong một cỗ bài, mỗi quân bài thuộc một trong bốn bộ và một trong mười ba cấp bậc. Các bộ là Spades, Hearts, Diamonds và Clubs [theo thứ tự giảm dần trong cây cầu]. Các bậc là Át, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Hậu và Vua. Tùy thuộc vào trò chơi mà bạn đang chơi, thứ hạng Át có thể cao hơn Vua hoặc thấp hơn 2

Nếu chúng ta muốn xác định một đối tượng mới để đại diện cho một quân bài, rõ ràng các thuộc tính phải là gì.

three_of_clubs = Card[0, 3]
5 và
three_of_clubs = Card[0, 3]
6. Không rõ ràng loại thuộc tính nên là gì. Một khả năng là sử dụng các chuỗi chứa các từ như
three_of_clubs = Card[0, 3]
7 cho bộ quần áo và
three_of_clubs = Card[0, 3]
8 cho cấp bậc. Một vấn đề với việc triển khai này là sẽ không dễ dàng so sánh các thẻ để xem thẻ nào có thứ hạng hoặc bộ cao hơn.

Một cách khác là sử dụng số nguyên để mã hóa cấp bậc và bộ quần áo. Bằng cách mã hóa, chúng tôi không có nghĩa là những gì một số người nghĩ, đó là mã hóa hoặc dịch thành mã bí mật. Ý nghĩa của một nhà khoa học máy tính khi mã hóa là xác định ánh xạ giữa một chuỗi số và các mục tôi muốn biểu diễn. Ví dụ

Spades   -->  3
Hearts   -->  2
Diamonds -->  1
Clubs    -->  0

Một tính năng rõ ràng của ánh xạ này là các bộ ánh xạ tới các số nguyên theo thứ tự, vì vậy chúng ta có thể so sánh các bộ bằng cách so sánh các số nguyên. Sơ đồ xếp hạng khá rõ ràng;

three_of_clubs = Card[0, 3]
0

Lý do chúng tôi đang sử dụng ký hiệu toán học cho các ánh xạ này là vì chúng không phải là một phần của chương trình Python. Chúng là một phần của thiết kế chương trình, nhưng chúng không bao giờ xuất hiện rõ ràng trong mã. Định nghĩa lớp cho loại

three_of_clubs = Card[0, 3]
3 trông như thế này

three_of_clubs = Card[0, 3]
2

Như thường lệ, chúng tôi cung cấp phương thức khởi tạo nhận tham số tùy chọn cho mỗi thuộc tính

Để tạo một đối tượng đại diện cho 3 Câu lạc bộ, hãy sử dụng lệnh này

three_of_clubs = Card[0, 3]

Đối số đầu tiên,

three_of_clubs = Card[0, 3]
40, đại diện cho kiện Clubs

8. 3. Các thuộc tính của lớp và phương thức
three_of_clubs = Card[0, 3]
41¶

Để in các đối tượng

three_of_clubs = Card[0, 3]
3 theo cách mà mọi người có thể dễ dàng đọc, chúng tôi muốn ánh xạ các mã số nguyên vào các từ. Một cách tự nhiên để làm điều đó là với danh sách các chuỗi. Chúng tôi gán các danh sách này cho các thuộc tính lớp ở đầu định nghĩa lớp

three_of_clubs = Card[0, 3]
4

Các thuộc tính của lớp như

three_of_clubs = Card[0, 3]
43 và
three_of_clubs = Card[0, 3]
44 được định nghĩa bên ngoài bất kỳ phương thức nào và có thể được truy cập từ bất kỳ phương thức nào trong lớp

Bên trong

three_of_clubs = Card[0, 3]
41, chúng ta có thể sử dụng
three_of_clubs = Card[0, 3]
46 và
three_of_clubs = Card[0, 3]
47 để ánh xạ các giá trị số của
three_of_clubs = Card[0, 3]
6 và
three_of_clubs = Card[0, 3]
5 thành các chuỗi. Ví dụ: biểu thức
three_of_clubs = Card[0, 3]
50 có nghĩa là sử dụng thuộc tính
three_of_clubs = Card[0, 3]
6 từ đối tượng
three_of_clubs = Card[0, 3]
52 làm chỉ mục cho thuộc tính lớp có tên
three_of_clubs = Card[0, 3]
46 và chọn chuỗi thích hợp

Lý do cho phần tử đầu tiên của

three_of_clubs = Card[0, 3]
54 trong
three_of_clubs = Card[0, 3]
55 là đóng vai trò giữ chỗ cho phần tử zero-eth của danh sách, phần tử này sẽ không bao giờ được sử dụng. Thứ hạng hợp lệ duy nhất là từ 1 đến 13. Mục lãng phí này không hoàn toàn cần thiết. Chúng ta có thể bắt đầu từ 0, như thường lệ, nhưng sẽ dễ nhầm lẫn hơn khi mã hóa 2 thành 2, 3 thành 3, v.v.

Chúng tôi có một doctest trong phương pháp

three_of_clubs = Card[0, 3]
41 để xác nhận rằng
three_of_clubs = Card[0, 3]
57 sẽ hiển thị là “Queen of Hearts”

8. 4. So sánh thẻ¶

Đối với các kiểu nguyên thủy, có các toán tử điều kiện [

three_of_clubs = Card[0, 3]
58,
three_of_clubs = Card[0, 3]
59,
three_of_clubs = Card[0, 3]
50, v.v. ] so sánh các giá trị và xác định khi nào một giá trị lớn hơn, nhỏ hơn hoặc bằng một giá trị khác. Đối với các loại do người dùng định nghĩa, chúng tôi có thể ghi đè hành vi của các toán tử tích hợp bằng cách cung cấp một phương thức có tên
three_of_clubs = Card[0, 3]
51. Theo quy ước,
three_of_clubs = Card[0, 3]
51 nhận hai tham số,
three_of_clubs = Card[0, 3]
52 và
three_of_clubs = Card[0, 3]
54 và trả về 1 nếu đối tượng đầu tiên lớn hơn, -1 nếu đối tượng thứ hai lớn hơn và 0 nếu chúng bằng nhau

Một số loại được sắp xếp hoàn toàn, nghĩa là bạn có thể so sánh hai phần tử bất kỳ và cho biết phần tử nào lớn hơn. Ví dụ, các số nguyên và số dấu phẩy động được sắp xếp hoàn toàn. Một số tập hợp không có thứ tự, điều đó có nghĩa là không có cách nào có nghĩa để nói rằng một phần tử lớn hơn phần tử khác. Ví dụ, các loại trái cây không có thứ tự, đó là lý do tại sao bạn không thể so sánh táo và cam

Bộ bài chơi được sắp xếp theo thứ tự một phần, có nghĩa là đôi khi bạn có thể so sánh các thẻ và đôi khi không. Ví dụ: bạn biết rằng 3 Câu lạc bộ cao hơn 2 Câu lạc bộ và 3 Câu lạc bộ kim cương cao hơn 3 Câu lạc bộ. Nhưng cái nào tốt hơn, 3 Câu lạc bộ hay 2 Kim cương?

Để làm cho các thẻ có thể so sánh được, bạn phải quyết định cái nào quan trọng hơn, thứ hạng hay chất. Thành thật mà nói, sự lựa chọn là tùy ý. Vì lợi ích của việc lựa chọn, chúng tôi sẽ nói rằng bộ bài quan trọng hơn, bởi vì một bộ bài mới được sắp xếp với tất cả các Câu lạc bộ cùng nhau, tiếp theo là tất cả các Kim cương, v.v.

Với quyết định đó, chúng ta có thể viết

three_of_clubs = Card[0, 3]
51

three_of_clubs = Card[0, 3]
5

Theo thứ tự này, Ách xuất hiện thấp hơn Deuces [2 giây]

8. 5. Bộ bài¶

Bây giờ chúng ta có các đối tượng để đại diện cho các

three_of_clubs = Card[0, 3]
3, bước hợp lý tiếp theo là định nghĩa một lớp để đại diện cho một
three_of_clubs = Card[0, 3]
57. Tất nhiên, một bộ bài bao gồm các quân bài, vì vậy mỗi đối tượng
three_of_clubs = Card[0, 3]
57 sẽ chứa một danh sách các quân bài như một thuộc tính

Sau đây là định nghĩa lớp cho lớp

three_of_clubs = Card[0, 3]
57. Phương thức khởi tạo tạo thuộc tính
three_of_clubs = Card[0, 3]
60 và tạo bộ tiêu chuẩn gồm năm mươi hai thẻ

three_of_clubs = Card[0, 3]
5

Cách dễ nhất để điền vào bộ bài là với một vòng lặp lồng nhau. Vòng lặp bên ngoài liệt kê các bộ quần áo từ 0 đến 3. Vòng lặp bên trong liệt kê các thứ hạng từ 1 đến 13. Vì vòng lặp bên ngoài lặp lại bốn lần và vòng lặp bên trong lặp lại mười ba lần, nên tổng số lần phần thân được thực thi là năm mươi hai [mười ba lần bốn]. Mỗi lần lặp lại sẽ tạo một phiên bản mới của

three_of_clubs = Card[0, 3]
3 với chất và thứ hạng hiện tại, đồng thời nối thẻ đó vào danh sách
three_of_clubs = Card[0, 3]
60

Phương pháp

three_of_clubs = Card[0, 3]
63 hoạt động trên các danh sách nhưng tất nhiên là không hoạt động trên các bộ dữ liệu

8. 6. In bộ bài¶

Như thường lệ, khi chúng ta định nghĩa một loại đối tượng mới, chúng ta muốn một phương thức in nội dung của một đối tượng. Để in một

three_of_clubs = Card[0, 3]
57, chúng tôi duyệt qua danh sách và in từng
three_of_clubs = Card[0, 3]
3

three_of_clubs = Card[0, 3]
6

Ở đây và từ giờ trở đi, dấu chấm lửng [

three_of_clubs = Card[0, 3]
66] chỉ ra rằng chúng ta đã bỏ qua các phương thức khác trong lớp

Để thay thế cho

three_of_clubs = Card[0, 3]
67, chúng ta có thể viết một phương thức
three_of_clubs = Card[0, 3]
41 cho lớp
three_of_clubs = Card[0, 3]
57. Ưu điểm của
three_of_clubs = Card[0, 3]
41 là nó linh hoạt hơn. Thay vì chỉ in nội dung của đối tượng, nó tạo ra một biểu diễn chuỗi mà các phần khác của chương trình có thể thao tác trước khi in hoặc lưu trữ để sử dụng sau này

Đây là phiên bản của

three_of_clubs = Card[0, 3]
41 trả về một chuỗi đại diện của một
three_of_clubs = Card[0, 3]
57. Để thêm một chút thú vị, nó sắp xếp các thẻ theo tầng trong đó mỗi thẻ được thụt vào nhiều hơn một khoảng trống so với thẻ trước đó

three_of_clubs = Card[0, 3]
1

Ví dụ này cho thấy một số tính năng. Đầu tiên, thay vì duyệt qua

three_of_clubs = Card[0, 3]
13 và gán mỗi thẻ cho một biến, chúng tôi đang sử dụng
three_of_clubs = Card[0, 3]
14 làm biến vòng lặp và chỉ mục trong danh sách thẻ

Thứ hai, chúng tôi đang sử dụng toán tử nhân chuỗi để thụt lề mỗi thẻ thêm một khoảng trắng so với thẻ cuối cùng. Biểu thức

three_of_clubs = Card[0, 3]
15 mang lại một số khoảng trắng bằng với giá trị hiện tại của
three_of_clubs = Card[0, 3]
14

Thứ ba, thay vì sử dụng hàm

three_of_clubs = Card[0, 3]
17 để in thẻ, chúng tôi sử dụng hàm
three_of_clubs = Card[0, 3]
18. Truyền một đối tượng làm đối số cho
three_of_clubs = Card[0, 3]
18 tương đương với việc gọi phương thức
three_of_clubs = Card[0, 3]
41 trên đối tượng

Cuối cùng, chúng tôi đang sử dụng biến

three_of_clubs = Card[0, 3]
01 làm công cụ tích lũy. Ban đầu,
three_of_clubs = Card[0, 3]
01 là chuỗi rỗng. Mỗi lần qua vòng lặp, một chuỗi mới được tạo và nối với giá trị cũ của
three_of_clubs = Card[0, 3]
01 để nhận giá trị mới. Khi vòng lặp kết thúc,
three_of_clubs = Card[0, 3]
01 chứa biểu diễn chuỗi hoàn chỉnh của
three_of_clubs = Card[0, 3]
57, trông như thế này

three_of_clubs = Card[0, 3]
0

Và như thế. Mặc dù kết quả xuất hiện trên 52 dòng nhưng đó là một chuỗi dài chứa các dòng mới

8. 7. Xáo bài¶

Nếu một bộ bài được xáo trộn hoàn hảo, thì bất kỳ thẻ nào cũng có khả năng xuất hiện ở bất kỳ đâu trong bộ bài và bất kỳ vị trí nào trong bộ bài đều có khả năng chứa bất kỳ thẻ nào như nhau

Để xáo trộn bộ bài, chúng tôi sẽ sử dụng chức năng

three_of_clubs = Card[0, 3]
06 từ mô-đun
three_of_clubs = Card[0, 3]
07. Với hai đối số số nguyên,
three_of_clubs = Card[0, 3]
08 và
three_of_clubs = Card[0, 3]
09,
three_of_clubs = Card[0, 3]
06 chọn một số nguyên ngẫu nhiên trong phạm vi
three_of_clubs = Card[0, 3]
001. Vì giới hạn trên hoàn toàn nhỏ hơn
three_of_clubs = Card[0, 3]
09, chúng tôi có thể sử dụng độ dài của danh sách làm tham số thứ hai và chúng tôi được đảm bảo nhận được chỉ mục hợp pháp. Ví dụ: biểu thức này chọn chỉ số của một quân bài ngẫu nhiên trong bộ bài

three_of_clubs = Card[0, 3]
00

Một cách dễ dàng để xáo trộn bộ bài là duyệt qua các quân bài và tráo đổi từng quân bài với một quân bài được chọn ngẫu nhiên. Có thể thẻ sẽ bị tráo với chính nó, nhưng điều đó không sao cả. Trên thực tế, nếu chúng ta loại trừ khả năng đó, thứ tự của các quân bài sẽ không hoàn toàn ngẫu nhiên

three_of_clubs = Card[0, 3]
01

Thay vì giả định rằng có 52 quân bài trong bộ bài, chúng tôi lấy độ dài thực tế của danh sách và lưu trữ nó trong

three_of_clubs = Card[0, 3]
003

Đối với mỗi thẻ trong bộ bài, chúng tôi chọn một thẻ ngẫu nhiên trong số các thẻ chưa được xáo trộn. Sau đó, chúng tôi hoán đổi thẻ hiện tại [

three_of_clubs = Card[0, 3]
14] với thẻ đã chọn [
three_of_clubs = Card[0, 3]
005]. Để hoán đổi các thẻ, chúng tôi sử dụng phép gán tuple

three_of_clubs = Card[0, 3]
02

8. 8. Xóa và chia bài¶

Một phương thức khác sẽ hữu ích cho lớp

three_of_clubs = Card[0, 3]
57 là
three_of_clubs = Card[0, 3]
007, lấy một quân bài làm tham số, loại bỏ nó và trả về
three_of_clubs = Card[0, 3]
008 nếu quân bài nằm trong bộ bài và
three_of_clubs = Card[0, 3]
009 nếu không

three_of_clubs = Card[0, 3]
03

Toán tử

three_of_clubs = Card[0, 3]
010 trả về
three_of_clubs = Card[0, 3]
008 nếu toán hạng đầu tiên ở toán hạng thứ hai, phải là một danh sách hoặc một bộ. Nếu toán hạng đầu tiên là một đối tượng, Python sử dụng phương thức
three_of_clubs = Card[0, 3]
51 của đối tượng để xác định đẳng thức với các mục trong danh sách. Vì
three_of_clubs = Card[0, 3]
51 trong lớp
three_of_clubs = Card[0, 3]
3 kiểm tra sự bình đẳng sâu, nên phương thức
three_of_clubs = Card[0, 3]
007 kiểm tra sự bình đẳng sâu

Để chia bài, chúng tôi muốn loại bỏ và trả lại thẻ hàng đầu. Phương pháp danh sách

three_of_clubs = Card[0, 3]
016 cung cấp một cách thuận tiện để làm điều đó

three_of_clubs = Card[0, 3]
04

Trên thực tế,

three_of_clubs = Card[0, 3]
016 loại bỏ lá bài cuối cùng trong danh sách, vì vậy chúng tôi đang chia bài từ dưới cùng của bộ bài

Một thao tác nữa mà chúng ta có thể muốn là hàm boolean

three_of_clubs = Card[0, 3]
018, trả về giá trị true nếu bộ bài không chứa thẻ

three_of_clubs = Card[0, 3]
05

8. 9. Kế thừa¶

Tính năng ngôn ngữ thường được kết hợp với lập trình hướng đối tượng là tính kế thừa. Kế thừa là khả năng định nghĩa một lớp mới là phiên bản sửa đổi của một lớp hiện có

Ưu điểm chính của tính năng này là bạn có thể thêm các phương thức mới vào một lớp mà không cần sửa đổi lớp hiện có. Nó được gọi là kế thừa vì lớp mới kế thừa tất cả các phương thức của lớp hiện có. Mở rộng phép ẩn dụ này, lớp hiện có đôi khi được gọi là lớp cha. Lớp mới có thể được gọi là lớp con hoặc đôi khi là lớp con

Kế thừa là một tính năng mạnh mẽ. Một số chương trình phức tạp nếu không có tính kế thừa có thể được viết ngắn gọn và đơn giản với nó. Ngoài ra, tính kế thừa có thể tạo điều kiện tái sử dụng mã, vì bạn có thể tùy chỉnh hành vi của các lớp cha mà không phải sửa đổi chúng. Trong một số trường hợp, cấu trúc kế thừa phản ánh cấu trúc tự nhiên của bài toán, giúp chương trình dễ hiểu hơn

Mặt khác, tính kế thừa có thể làm cho chương trình khó đọc. Khi một phương thức được gọi, đôi khi không rõ định nghĩa của nó ở đâu. Mã có liên quan có thể nằm rải rác giữa một số mô-đun. Ngoài ra, nhiều thứ có thể được thực hiện bằng cách sử dụng tính kế thừa có thể được thực hiện một cách tao nhã [hoặc hơn thế nữa] mà không cần nó. Nếu cấu trúc tự nhiên của vấn đề không phù hợp với tính kế thừa, thì kiểu lập trình này có thể gây hại nhiều hơn là có lợi.

Trong chương này, chúng ta sẽ chứng minh việc sử dụng quyền thừa kế như là một phần của chương trình chơi bài Cô hầu gái già. Một trong những mục tiêu của chúng tôi là viết mã có thể được tái sử dụng để triển khai các trò chơi bài khác

8. 10. Một quân bài¶

Đối với hầu hết mọi trò chơi bài, chúng ta cần đại diện cho một tay bài. Tất nhiên, một ván bài tương tự như một bộ bài. Cả hai đều được tạo thành từ một bộ thẻ và cả hai đều yêu cầu các thao tác như thêm và xóa thẻ. Ngoài ra, chúng tôi có thể thích khả năng xáo trộn cả bộ bài và tay

Một bàn tay cũng khác với một bộ bài. Tùy thuộc vào trò chơi đang được chơi, chúng tôi có thể muốn thực hiện một số thao tác trên tay không hợp lý đối với bộ bài. Ví dụ: trong bài xì phé, chúng tôi có thể phân loại một ván bài [thẳng, úp, v.v. ] hoặc so sánh nó với một bàn tay khác. Trong bridge, chúng ta có thể muốn tính điểm cho một ván bài để đặt cược

Tình huống này cho thấy việc sử dụng thừa kế. Nếu

three_of_clubs = Card[0, 3]
019 là một lớp con của
three_of_clubs = Card[0, 3]
57, nó sẽ có tất cả các phương thức của
three_of_clubs = Card[0, 3]
57 và có thể thêm các phương thức mới

Trong định nghĩa lớp, tên của lớp cha xuất hiện trong dấu ngoặc đơn

three_of_clubs = Card[0, 3]
06

Câu lệnh này chỉ ra rằng lớp

three_of_clubs = Card[0, 3]
019 mới kế thừa từ lớp
three_of_clubs = Card[0, 3]
57 hiện có

Hàm tạo

three_of_clubs = Card[0, 3]
019 khởi tạo các thuộc tính cho bàn tay, đó là
three_of_clubs = Card[0, 3]
025 và
three_of_clubs = Card[0, 3]
60. Chuỗi
three_of_clubs = Card[0, 3]
025 xác định bàn tay này, có thể là theo tên của người chơi nắm giữ nó. Tên là một tham số tùy chọn với chuỗi trống làm giá trị mặc định.
three_of_clubs = Card[0, 3]
60 là danh sách bài trên tay, khởi tạo cho danh sách trống

three_of_clubs = Card[0, 3]
07

Đối với bất kỳ trò chơi bài nào, cần phải thêm và xóa các quân bài khỏi bộ bài. Việc xóa thẻ đã được xử lý, vì

three_of_clubs = Card[0, 3]
019 kế thừa
three_of_clubs = Card[0, 3]
007 từ
three_of_clubs = Card[0, 3]
57. Nhưng chúng ta phải viết
three_of_clubs = Card[0, 3]
032

three_of_clubs = Card[0, 3]
08

Một lần nữa, dấu chấm lửng chỉ ra rằng chúng ta đã bỏ qua các phương thức khác. Phương thức danh sách

three_of_clubs = Card[0, 3]
63 thêm thẻ mới vào cuối danh sách thẻ

8. 11. Chia bài¶

Bây giờ chúng ta có lớp

three_of_clubs = Card[0, 3]
019, chúng ta muốn chia bài từ lớp
three_of_clubs = Card[0, 3]
57 thành tay. Không rõ ngay lập tức liệu phương pháp này nên được xếp vào lớp
three_of_clubs = Card[0, 3]
019 hay lớp
three_of_clubs = Card[0, 3]
57, nhưng vì nó hoạt động trên một bộ bài và [có thể] nhiều ván bài, nên việc đặt nó vào lớp
three_of_clubs = Card[0, 3]
57 sẽ tự nhiên hơn

three_of_clubs = Card[0, 3]
039 nên khá chung chung, vì các trò chơi khác nhau sẽ có các yêu cầu khác nhau. Chúng tôi có thể muốn xử lý toàn bộ bộ bài cùng một lúc hoặc thêm một thẻ vào mỗi tay

three_of_clubs = Card[0, 3]
039 lấy hai tham số, một danh sách [hoặc bộ] tay bài và tổng số quân bài để chia. Nếu không có đủ thẻ trong cỗ bài, phương pháp này sẽ xử lý tất cả các thẻ và dừng lại

three_of_clubs = Card[0, 3]
09

Tham số thứ hai,

three_of_clubs = Card[0, 3]
003, là tùy chọn;

Biến vòng lặp

three_of_clubs = Card[0, 3]
14 đi từ 0 đến
three_of_clubs = Card[0, 3]
043. Mỗi lần qua vòng lặp, một thẻ sẽ được xóa khỏi bộ bài bằng phương pháp danh sách
three_of_clubs = Card[0, 3]
016, phương pháp này sẽ xóa và trả lại mục cuối cùng trong danh sách

Toán tử mô đun [

three_of_clubs = Card[0, 3]
045] cho phép chúng ta chia bài theo vòng tròn [mỗi lần một lá bài cho mỗi tay]. Khi
three_of_clubs = Card[0, 3]
14 bằng số lượng tay bài trong danh sách, biểu thức
three_of_clubs = Card[0, 3]
047 bao quanh đầu danh sách [chỉ số 0]

8. 12. In một bàn tay¶

Để in nội dung của một bàn tay, chúng ta có thể tận dụng các phương thức

three_of_clubs = Card[0, 3]
048 và
three_of_clubs = Card[0, 3]
41 kế thừa từ
three_of_clubs = Card[0, 3]
57. Ví dụ

three_of_clubs = Card[0, 3]
20

Nó không phải là một ván bài tuyệt vời, nhưng nó tạo ra một cú đánh thẳng

Mặc dù việc kế thừa các phương thức hiện có là thuận tiện, nhưng có thêm thông tin trong một đối tượng

three_of_clubs = Card[0, 3]
019 mà chúng ta có thể muốn đưa vào khi in một đối tượng. Để làm điều đó, chúng ta có thể cung cấp một phương thức
three_of_clubs = Card[0, 3]
41 trong lớp
three_of_clubs = Card[0, 3]
019 ghi đè phương thức trong lớp
three_of_clubs = Card[0, 3]
57

three_of_clubs = Card[0, 3]
21

Ban đầu,

three_of_clubs = Card[0, 3]
01 là một chuỗi xác định bàn tay. Nếu trắng tay, chương trình nối thêm dòng chữ
three_of_clubs = Card[0, 3]
056 và trả về
three_of_clubs = Card[0, 3]
01

Mặt khác, chương trình nối thêm từ

three_of_clubs = Card[0, 3]
058 và biểu diễn chuỗi của
three_of_clubs = Card[0, 3]
57, được tính bằng cách gọi phương thức
three_of_clubs = Card[0, 3]
41 trong lớp
three_of_clubs = Card[0, 3]
57 trên
three_of_clubs = Card[0, 3]
52

Có vẻ lạ khi gửi

three_of_clubs = Card[0, 3]
52, đề cập đến
three_of_clubs = Card[0, 3]
019 hiện tại, đến một phương thức
three_of_clubs = Card[0, 3]
57, cho đến khi bạn nhớ rằng một
three_of_clubs = Card[0, 3]
019 là một loại
three_of_clubs = Card[0, 3]
57. Các đối tượng
three_of_clubs = Card[0, 3]
019 có thể làm mọi thứ ________ 357 đối tượng có thể, vì vậy việc gửi một ________ 1019 đến một phương thức ________ 357 là hợp pháp

Nói chung, việc sử dụng một thể hiện của lớp con thay cho một thể hiện của lớp cha luôn là hợp pháp

8. 13. Lớp
three_of_clubs = Card[0, 3]
072¶

Lớp

three_of_clubs = Card[0, 3]
072 đảm nhận một số công việc cơ bản chung cho tất cả các trò chơi, chẳng hạn như tạo bộ bài và xáo trộn nó

three_of_clubs = Card[0, 3]
22

Đây là trường hợp đầu tiên chúng ta thấy phương thức khởi tạo thực hiện một tính toán quan trọng, ngoài việc khởi tạo các thuộc tính

Để triển khai các trò chơi cụ thể, chúng tôi có thể kế thừa từ

three_of_clubs = Card[0, 3]
072 và thêm các tính năng cho trò chơi mới. Ví dụ, chúng ta sẽ viết một mô phỏng của Old Maid

Mục tiêu của Old Maid là loại bỏ các quân bài trên tay bạn. Bạn làm điều này bằng cách kết hợp các thẻ theo thứ hạng và màu sắc. Ví dụ: 4 quân Câu lạc bộ phù hợp với 4 quân bích vì cả hai bộ đều có màu đen. Jack of Hearts khớp với Jack of Diamonds vì cả hai đều có màu đỏ

Để bắt đầu trò chơi, quân Hậu bị loại khỏi bộ bài để quân Bích không có đối thủ. Năm mươi mốt quân bài còn lại được chia cho những người chơi theo thể thức vòng tròn một lượt. Sau khi chia bài, tất cả người chơi so khớp và loại bỏ càng nhiều thẻ càng tốt

Khi không thể thực hiện thêm trận đấu nào nữa, trò chơi bắt đầu. Đổi lại, mỗi người chơi chọn một thẻ [không nhìn] từ người hàng xóm gần nhất bên trái, người vẫn còn thẻ. Nếu quân bài được chọn khớp với quân bài trên tay người chơi, quân bài đó sẽ bị loại bỏ. Nếu không, thẻ được thêm vào tay người chơi. Cuối cùng, tất cả các trận đấu có thể được thực hiện, chỉ còn lại Queen of Spades trong tay kẻ thua cuộc

Trong mô phỏng trò chơi trên máy tính của chúng tôi, máy tính chơi tất tay. Thật không may, một số sắc thái của trò chơi thực sự bị mất. Trong một trò chơi thực, người chơi có Old Maid sẽ nỗ lực để người hàng xóm của họ chọn thẻ đó, bằng cách hiển thị nó nổi bật hơn một chút hoặc có thể không hiển thị nó nổi bật hơn hoặc thậm chí không hiển thị thẻ đó. . Máy tính chỉ cần chọn ngẫu nhiên thẻ của hàng xóm

8. 14. ____1075 lớp¶

Một ván bài để chơi Old Maid yêu cầu một số khả năng ngoài khả năng chung của một

three_of_clubs = Card[0, 3]
019. Chúng ta sẽ định nghĩa một lớp mới,
three_of_clubs = Card[0, 3]
075, kế thừa từ
three_of_clubs = Card[0, 3]
019 và cung cấp một phương thức bổ sung có tên là
three_of_clubs = Card[0, 3]
079

three_of_clubs = Card[0, 3]
23

Chúng tôi bắt đầu bằng cách tạo một bản sao của danh sách thẻ để chúng tôi có thể duyệt qua bản sao trong khi xóa thẻ khỏi bản gốc. Vì

three_of_clubs = Card[0, 3]
13 được sửa đổi trong vòng lặp, chúng tôi không muốn sử dụng nó để kiểm soát quá trình truyền tải. Python có thể khá bối rối nếu nó duyệt qua một danh sách đang thay đổi

Đối với mỗi thẻ trong tay, chúng tôi tìm ra thẻ phù hợp là gì và đi tìm nó. Thẻ phù hợp có cùng thứ hạng và phù hợp khác cùng màu. Biểu thức

three_of_clubs = Card[0, 3]
081 biến Câu lạc bộ [bộ 0] thành Bích [bộ 3] và Kim cương [bộ 1] thành Trái tim [bộ 2]. Bạn nên hài lòng với bản thân rằng các hoạt động ngược lại cũng hoạt động. Nếu thẻ phù hợp cũng ở trong tay, cả hai thẻ sẽ bị loại bỏ

Ví dụ sau minh họa cách sử dụng

three_of_clubs = Card[0, 3]
079

three_of_clubs = Card[0, 3]
24

Lưu ý rằng không có phương thức

three_of_clubs = Card[0, 3]
083 cho lớp
three_of_clubs = Card[0, 3]
075. Chúng tôi kế thừa nó từ
three_of_clubs = Card[0, 3]
019

8. 15. ______lớp 1086¶

Bây giờ chúng ta có thể chuyển sự chú ý sang chính trò chơi.

three_of_clubs = Card[0, 3]
086 là một lớp con của
three_of_clubs = Card[0, 3]
072 với một phương thức mới gọi là
three_of_clubs = Card[0, 3]
089 lấy danh sách người chơi làm tham số

three_of_clubs = Card[0, 3]
083 được kế thừa từ
three_of_clubs = Card[0, 3]
072, một đối tượng
three_of_clubs = Card[0, 3]
086 mới chứa một bộ bài xáo trộn mới

three_of_clubs = Card[0, 3]
25

Việc viết

three_of_clubs = Card[0, 3]
093 còn lại như một bài tập

Một số bước của trò chơi đã được tách thành các phương pháp.

three_of_clubs = Card[0, 3]
094 lướt qua danh sách bàn tay và gọi
three_of_clubs = Card[0, 3]
079 trên mỗi bàn tay

three_of_clubs = Card[0, 3]
26

three_of_clubs = Card[0, 3]
096 là bộ tích lũy cộng số lượng trận đấu trong mỗi ván bài và trả về tổng số

Khi tổng số trận đấu đạt đến hai mươi lăm, năm mươi thẻ đã bị xóa khỏi tay, điều đó có nghĩa là chỉ còn lại một thẻ và trò chơi kết thúc

Biến

three_of_clubs = Card[0, 3]
097 theo dõi lượt của người chơi. Nó bắt đầu từ 0 và tăng lên một lần mỗi lần;

Phương thức

three_of_clubs = Card[0, 3]
099 lấy tham số cho biết lượt của ai. Giá trị trả về là số trận đấu được thực hiện trong lượt này

three_of_clubs = Card[0, 3]
27

Nếu tay của người chơi trống, người chơi đó đã ra khỏi trò chơi, vì vậy người đó không làm gì và trả về 0

Mặt khác, một lượt bao gồm tìm người chơi đầu tiên ở bên trái có thẻ, lấy một thẻ từ người hàng xóm và kiểm tra các trận đấu. Trước khi quay lại, các quân bài trên tay được xáo trộn để lựa chọn của người chơi tiếp theo là ngẫu nhiên

Phương pháp

three_of_clubs = Card[0, 3]
200 bắt đầu với người chơi ở ngay bên trái và tiếp tục vòng tròn cho đến khi tìm thấy một người chơi vẫn còn bài

three_of_clubs = Card[0, 3]
28

Nếu

three_of_clubs = Card[0, 3]
200 đã từng đi hết vòng tròn mà không tìm thấy thẻ, nó sẽ trả về
three_of_clubs = Card[0, 3]
202 và gây ra lỗi ở nơi khác trong chương trình. May mắn thay, chúng tôi có thể chứng minh rằng điều đó sẽ không bao giờ xảy ra [miễn là phần cuối của trò chơi được phát hiện chính xác]

Chúng tôi đã bỏ qua phương pháp

three_of_clubs = Card[0, 3]
203. Bạn có thể tự viết cái đó

Kết quả sau đây là từ một dạng rút gọn của trò chơi trong đó chỉ có mười lăm quân bài trên cùng [hàng chục và cao hơn] được chia cho ba người chơi. Với bộ bài nhỏ này, trò chơi dừng lại sau bảy trận thay vì 25

three_of_clubs = Card[0, 3]
29

Vì vậy, Jeff thua

8. 16. Bảng thuật ngữ¶

mã hóa

Để biểu diễn một tập hợp giá trị bằng cách sử dụng một tập hợp giá trị khác bằng cách xây dựng ánh xạ giữa chúng

thuộc tính lớp

Một biến được định nghĩa bên trong định nghĩa lớp nhưng bên ngoài bất kỳ phương thức nào. Các thuộc tính của lớp có thể truy cập được từ bất kỳ phương thức nào trong lớp và được chia sẻ bởi tất cả các phiên bản của lớp

bộ tích điện

Một biến được sử dụng trong một vòng lặp để tích lũy một loạt các giá trị, chẳng hạn như bằng cách nối chúng vào một chuỗi hoặc cộng chúng vào một tổng đang chạy

Trò chơi bài cao hơn hay thấp hơn là gì?

Người chơi phải đoán xem mỗi quân bài cao hơn hay thấp hơn quân bài trước đó . Nếu họ đoán tất cả các thẻ theo thứ tự, họ sẽ giành được giải thưởng.

Bạn có thể tạo một trò chơi bài bằng Python không?

Trò chơi bài với Python. Bộ bài của lớp . e. 14 cho quân Át] và số nguyên từ vòng lặp bên trong làm quân bài. Quá trình này tạo ra 52 quân bài – một quân bài cho mỗi tổ hợp chất và giá trị.

Là ace cao hay thấp trong cao hơn hay thấp hơn?

trò chơi bài . Trong các trò chơi dựa trên sự vượt trội của thứ hạng này so với thứ hạng khác, chẳng hạn như hầu hết các trò chơi ăn gian, quân át được tính cao nhất , xếp hạng cao hơn cả quân vua.

Chơi poker mã hóa có khó không?

Xì phé là một trong những trò chơi bài cơ bản khó viết mã nhất , đặc biệt là do các biến thể khác nhau.

Chủ Đề