Làm thế nào để bạn tạo mã oẳn tù tì trong python?

Khi bạn học lập trình lần đầu tiên, bạn tìm kiếm — hoặc, có lẽ, được giao — các dự án củng cố các khái niệm cơ bản. Nhưng bạn có thường xuyên xem lại những dự án mới bắt đầu đó dưới góc nhìn của một lập trình viên nâng cao không, khi bạn đã có thêm kiến ​​thức và kinh nghiệm?

Trong bài viết này, tôi muốn làm điều đó. Tôi muốn xem lại một dự án phổ biến dành cho người mới bắt đầu — triển khai trò chơi "Oẳn tù tì" bằng Python — với kiến ​​thức tôi có được từ gần tám năm kinh nghiệm lập trình Python

Luật chơi "Oẳn tù tì"

Trước khi đi sâu vào viết mã, hãy tạo tiền đề bằng cách phác thảo cách chơi "Oẳn tù tì". Hai người chơi mỗi người chọn một trong ba mục. đá, giấy hoặc kéo. Những người chơi đồng thời tiết lộ lựa chọn của họ cho nhau và người chiến thắng được xác định theo các quy tắc sau

  1. rock beats kéo
  2. Kéo cắt giấy
  3. Giấy đập đá

Lớn lên, bạn bè của tôi và tôi đã sử dụng "Oẳn tù xì" để giải quyết tất cả các loại vấn đề. Ai sẽ chơi đầu tiên trong trò chơi điện tử một người chơi?

Những yêu cầu

Hãy đặt ra một số yêu cầu để thực hiện. Thay vì xây dựng một trò chơi toàn diện, chúng ta hãy tập trung viết một hàm có tên là

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 chấp nhận hai đối số chuỗi — sự lựa chọn của mỗi người chơi là
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
4,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
5 hoặc
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
6 — và trả về một chuỗi cho biết người chiến thắng (e. g. ,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
7) hoặc nếu trận đấu có kết quả hòa (e. g. ,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
8)

Dưới đây là một số ví dụ về cách

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 được gọi và những gì nó trả về

>>> play("rock", "paper")
'paper wins'

>>> play("scissors", "paper")
'scissors wins'

>>> play("paper", "paper")
'tie'


Nếu một hoặc cả hai đối số không hợp lệ, nghĩa là chúng không phải là một trong các đối số của

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
4,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
5 hoặc
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
6, thì
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 sẽ đưa ra một số loại ngoại lệ

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 cũng nên có tính chất giao hoán. Tức là,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
35 sẽ trả về cùng thứ như
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
36

Giải pháp "Người mới bắt đầu"

Để đặt đường cơ sở để so sánh, hãy xem xét cách người mới bắt đầu có thể triển khai hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3. Nếu người mới bắt đầu này giống như tôi khi lần đầu tiên học lập trình, có lẽ họ sẽ bắt đầu viết ra cả đống câu lệnh
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
38

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
7

Nói đúng ra, không có gì sai với mã này. Nó chạy không có lỗi và đáp ứng tất cả các yêu cầu. Nó cũng tương tự như một số triển khai xếp hạng cao cho tìm kiếm Google "oẳn tù tì. "

Tuy nhiên, các lập trình viên có kinh nghiệm sẽ nhanh chóng nhận ra một số mã có mùi. Đặc biệt, mã lặp đi lặp lại và có nhiều đường dẫn thực thi có thể

Muốn nhiều hơn như thế này?

Một email vào thứ Bảy hàng tuần với một mẹo hữu ích.
Luôn mất ít hơn 5 phút thời gian của bạn.

Theo dõi ngay

Đang xử lý đơn đăng ký của bạn Tuyệt vời. Kiểm tra hộp thư đến của bạn và xác nhận đăng ký của bạn Đã xảy ra lỗi khi gửi email

Giải pháp nâng cao #1

Một cách để triển khai "Oẳn tù tì" từ góc độ nâng cao hơn liên quan đến việc tận dụng kiểu từ điển của Python. Một từ điển có thể ánh xạ các vật phẩm thành những vật phẩm mà chúng đánh bại theo quy tắc của trò chơi

Hãy gọi cuốn từ điển này là

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 (đặt tên khó lắm các bạn ạ)

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 cung cấp một API đơn giản để xác định mặt hàng nào thua mặt hàng khác

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3

Một từ điển có một vài lợi ích. Bạn có thể sử dụng nó để

  1. Xác thực các mục đã chọn bằng cách kiểm tra tư cách thành viên hoặc tăng
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    21
  2. Xác định người chiến thắng bằng cách kiểm tra xem giá trị có thua khóa tương ứng không

Với suy nghĩ này, hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 có thể được viết như sau

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
2

Trong phiên bản này,

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 tận dụng lợi thế của
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21 tích hợp do từ điển
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 đưa ra khi cố gắng truy cập khóa không hợp lệ. Điều này xác thực hiệu quả các lựa chọn của người chơi. Vì vậy, nếu một trong hai người chơi chọn một vật phẩm không hợp lệ — đại loại như
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
26 hoặc
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
27 —
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 sẽ tăng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
2

Mặc dù

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21 không hữu ích bằng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21 với thông điệp mô tả, nhưng nó vẫn hoàn thành công việc

Hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 mới đơn giản hơn nhiều so với hàm ban đầu. Thay vì xử lý một loạt các trường hợp rõ ràng, chỉ có ba trường hợp cần kiểm tra

  1. loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    23 thua
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    24
  2. loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    24 thua
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    23
  3. loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    24 và
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    23 giống nhau

Tuy nhiên, có một trường hợp ẩn thứ tư mà bạn gần như phải nheo mắt mới thấy. Trường hợp đó xảy ra khi không có trường hợp nào trong ba trường hợp còn lại là đúng, trong trường hợp đó,

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 trả về giá trị
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
30

Nhưng mà. trường hợp này có bao giờ thực sự xảy ra? . Nó không thể. Theo quy tắc của trò chơi, nếu người chơi 1 không thua người chơi 2 và người chơi 2 không thua người chơi 1, thì cả hai người chơi phải chọn cùng một mục

Nói cách khác, chúng ta có thể xóa khối

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
38 cuối cùng khỏi
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 và chỉ
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
33 nếu cả hai khối
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
38 còn lại đều không thực thi

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3

Chúng tôi đã thực hiện một sự đánh đổi. Chúng tôi đã hy sinh sự rõ ràng — Tôi cho rằng cần có tải nhận thức lớn hơn để hiểu cách hoạt động của hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 ở trên so với phiên bản "người mới bắt đầu" — để rút ngắn hàm và tránh tình trạng không thể truy cập được

Sự đánh đổi này có đáng không? . Liệu sự tinh khiết đánh bại thực tế?

Giải pháp nâng cao #2

Giải pháp trước hoạt động rất tốt. Nó có thể đọc được và ngắn hơn nhiều so với giải pháp "người mới bắt đầu". Nhưng nó không linh hoạt lắm. Nghĩa là, nó không thể xử lý các biến thể của "Oẳn tù tì" mà không viết lại một số logic

Chẳng hạn, có một biến thể gọi là "Oẳn tù tì kéo giấy" với một bộ quy tắc phức tạp hơn

  1. Rock beats kéo và thằn lằn
  2. Giấy đánh bại nhạc rock và Spock
  3. Kéo đánh bại giấy và thằn lằn
  4. Thằn lằn đánh bại Spock và giấy
  5. Spock đánh bại kéo và đá

Bạn có thể điều chỉnh mã như thế nào để xử lý biến thể này?

Đầu tiên, thay thế các giá trị chuỗi trong từ điển

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 bằng các bộ Python. Mỗi bộ chứa tất cả các mục mất khóa tương ứng. Đây là phiên bản
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 này trông như thế nào khi sử dụng các quy tắc "Oẳn tù xì" ban đầu

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
2

Tại sao bộ? . Chúng tôi không quan tâm đến thứ tự của những mặt hàng đó

Để điều chỉnh

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 để xử lý từ điển
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 mới, tất cả những gì bạn phải làm là thay thế
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
20 bằng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21 để sử dụng kiểm tra tư cách thành viên thay vì kiểm tra đẳng thức

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
7

Hãy dành một chút thời gian để chạy mã này và xác minh rằng mọi thứ vẫn hoạt động

Bây giờ hãy thay thế

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 bằng một từ điển thực hiện các quy tắc dành cho "Thằn lằn kéo oẳn tù tì Spock. "Đây là những gì nó trông giống như

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
9

Hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 mới hoạt động hoàn hảo với các quy tắc mới này

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
70

Theo tôi, đây là một ví dụ tuyệt vời về sức mạnh của việc chọn đúng cấu trúc dữ liệu. Bằng cách sử dụng các bộ để đại diện cho tất cả các mục thua một khóa trong từ điển

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 và thay thế
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
20 bằng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21, bạn đã tạo ra một giải pháp tổng quát hơn mà không phải thêm một dòng mã nào

Vượt qua "cái bướu trung gian". "

Một email, vào thứ Bảy hàng tuần, để thử thách các kỹ năng của bạn và khơi dậy trí tò mò của bạn. Luôn ít hơn 5 phút thời gian của bạn

Theo dõi ngay

Đang xử lý đơn đăng ký của bạn Tuyệt vời. Kiểm tra hộp thư đến của bạn và xác nhận đăng ký của bạn Đã xảy ra lỗi khi gửi email

Giải pháp nâng cao #3

Hãy lùi lại và thực hiện một cách tiếp cận hơi khác. Thay vì tìm kiếm các mục trong từ điển để xác định người chiến thắng, chúng tôi sẽ tạo một bảng gồm tất cả các đầu vào có thể và kết quả của chúng

Bạn vẫn cần một cái gì đó để đại diện cho các quy tắc của trò chơi, vì vậy hãy bắt đầu với mệnh lệnh

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 từ giải pháp trước đó

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
2

Tiếp theo, hãy viết một hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
28 lấy một từ điển quy tắc, chẳng hạn như
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 và trả về một từ điển mới ánh xạ trạng thái tới kết quả của chúng. Chẳng hạn, đây là những gì mà
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
28 sẽ trả về khi được gọi với đối số là
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
72

Nếu bạn nghĩ rằng một cái gì đó nhìn ra khỏi đó, bạn đúng. Có hai điều sai với cuốn từ điển này

  1. Các bộ như
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    72 không thể tồn tại. Các tập hợp không thể có các phần tử lặp lại. Trong một kịch bản thực tế, bộ này sẽ giống như
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    73. Bạn không thực sự cần phải lo lắng về điều này quá nhiều. Tôi đã viết những tập hợp đó với hai phần tử để làm rõ những trạng thái đó đại diện cho cái gì
  2. Bạn không thể sử dụng bộ làm khóa từ điển. Nhưng chúng tôi muốn sử dụng các bộ vì chúng tự động xử lý tính giao hoán cho chúng tôi. Nghĩa là,
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    74 và
    loses_to = {
        "rock": "scissors",
        "paper": "rock",
        "scissors": "paper",
    }
    75 đánh giá bằng nhau và do đó sẽ trả về cùng một kết quả khi tra cứu

Cách để giải quyết vấn đề này là sử dụng

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
76 tích hợp sẵn của Python. Giống như các bộ,
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
77 hỗ trợ kiểm tra tư cách thành viên và chúng so sánh ngang bằng với một
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
78 hoặc
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79 khác khi và chỉ khi cả hai bộ có cùng số thành viên. Tuy nhiên, không giống như các bộ tiêu chuẩn, các phiên bản
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79 là bất biến. Do đó, chúng có thể được sử dụng làm khóa từ điển

Để triển khai

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
28, bạn có thể lặp qua từng khóa trong từ điển
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 và xây dựng một phiên bản
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79 cho từng giá trị chuỗi trong bộ tương ứng với khóa

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
73

Điều này giúp bạn đi được nửa chặng đường

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
74

Tuy nhiên, các trạng thái dẫn đến hòa không được bảo hiểm. Để thêm chúng, bạn cần tạo các phiên bản

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79 cho mỗi khóa trong từ điển
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
95 ánh xạ tới chuỗi
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
8

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
75

Bây giờ giá trị được trả về bởi

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
28 có vẻ đúng

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
76

Tại sao phải trải qua tất cả những rắc rối này?

Bạn không sai, nhưng tôi muốn chỉ ra rằng mô hình này có thể khá hữu ích. Nếu có một số trạng thái hữu hạn có thể tồn tại trong một chương trình, đôi khi bạn có thể thấy tốc độ tăng đáng kể bằng cách tính toán trước kết quả cho tất cả các trạng thái đó. Điều này có thể là quá mức cần thiết đối với một thứ đơn giản như "Oẳn tù tì", nhưng có thể tạo ra sự khác biệt lớn trong các tình huống có hàng trăm nghìn hoặc thậm chí hàng triệu tiểu bang.

Một kịch bản trong thế giới thực mà cách tiếp cận này có ý nghĩa là thuật toán Q-learning được sử dụng trong các ứng dụng học tăng cường. Trong thuật toán đó, một bảng các trạng thái - bảng Q - được duy trì để ánh xạ từng trạng thái thành một tập xác suất cho một số hành động được xác định trước. Khi một tác nhân được đào tạo, nó có thể chọn một hành động dựa trên xác suất cho một trạng thái được quan sát và sau đó hành động tương ứng

Thông thường, một bảng giống như bảng được tạo bởi

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
28 được tính toán và sau đó được lưu trữ trong một tệp. Khi chương trình chạy, bảng được tính toán trước sẽ được tải vào bộ nhớ và sau đó được ứng dụng sử dụng

Vì vậy, bây giờ bạn đã có một hàm có thể tạo bảng kết quả, hãy gán bảng cho

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
39 cho một biến
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
702

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
77

Bây giờ bạn có thể viết một hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 tra cứu trạng thái trong bảng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
702 dựa trên các đối số được truyền cho play rồi trả về kết quả

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
78

Phiên bản

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 này cực kỳ đơn giản. Chỉ cần hai dòng mã. Bạn thậm chí có thể viết nó dưới dạng một dòng nếu bạn muốn

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79

Cá nhân tôi thích phiên bản hai dòng hơn phiên bản một dòng

Hàm

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 mới của bạn tuân theo các quy tắc của trò chơi và có tính chất giao hoán

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
0

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 thậm chí còn tăng
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
21 nếu nó được gọi với một lựa chọn không hợp lệ, nhưng hiện tại lỗi này ít hữu ích hơn khi các khóa của từ điển
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
702 được đặt

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
1

Tuy nhiên, lỗi mơ hồ có thể không phải là vấn đề. Trong bài viết này, bạn chỉ thực hiện chức năng

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3. Trong một triển khai thực sự của "Oẳn tù tì", rất có thể bạn sẽ nắm bắt thông tin đầu vào của người dùng và xác thực thông tin đó trước khi chuyển lựa chọn của người dùng cho
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3

Vì vậy, việc triển khai này nhanh hơn bao nhiêu so với những lần trước? .

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
713 là phiên bản của
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
3 từ phần này và
loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
715 là phiên bản hiện tại

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
2

Trong trường hợp này, giải pháp sử dụng bảng kết quả thực sự chậm hơn so với cách thực hiện trước đó. Thủ phạm ở đây là dòng chuyển đổi các đối số hàm thành

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
79. Vì vậy, mặc dù việc tra cứu từ điển diễn ra nhanh chóng và việc xây dựng một bảng ánh xạ các trạng thái tới các kết quả có thể cải thiện hiệu suất một cách tiềm năng, nhưng bạn cần phải cẩn thận để tránh các thao tác tốn kém mà cuối cùng có thể phủ nhận bất kỳ lợi ích nào mà bạn mong đợi đạt được

Phần kết luận

Tôi đã viết bài viết này như một bài tập. Tôi tò mò muốn biết làm thế nào để tiếp cận một dự án dành cho người mới bắt đầu như "Oẳn tù tì" bằng Python khi tôi đã có nhiều kinh nghiệm. Tôi hy vọng bạn thấy nó thú vị. Nếu bây giờ bạn có chút cảm hứng nào để xem lại một số dự án dành cho người mới bắt đầu của riêng mình, thì tôi nghĩ rằng tôi đã hoàn thành công việc của mình

Nếu bạn xem lại một số dự án dành cho người mới bắt đầu của riêng mình hoặc nếu bạn đã làm như vậy trước đây, hãy cho tôi biết nó diễn ra như thế nào trong phần nhận xét. Bạn có học được điều gì mới không?

Điều gì truyền cảm hứng cho bài viết này?

Một người quen trong thế giới Julia, Miguel Raz Guzmán Macedo, đã chuyển cho tôi một bài đăng trên blog của Mosè Giordano. Mosè tận dụng mô hình gửi nhiều lần của Julia để viết "Oẳn tù tì" trong chưa đầy mười dòng mã

Trò chơi oẳn tù tì dưới 10 dòng mã

Oẳn tù tì là một trò chơi tay phổ biến. Tuy nhiên, một số mọt sách có thể thích chơi trò chơi này trên máy tính của họ hơn là thực sự bắt tay. Tín dụng hình ảnh. Enzoklop, Wikimedia Commons, CC-BY-SA 3. 0 Chúng tôi có thể viết trò chơi này với chưa đầy 10 dòng mã bằng ngôn ngữ lập trình Julia. thị…

Mosè GiordanoMosè Giordano

Làm thế nào để bạn tạo mã oẳn tù tì trong python?

Tôi sẽ không đi sâu vào chi tiết cách hoạt động của mã Mosè. Python thậm chí không hỗ trợ nhiều công văn bên ngoài. (Mặc dù bạn có thể sử dụng nó với sự trợ giúp từ gói

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
717. )

Bài viết của Mosè đã khiến tinh thần tôi quay cuồng và khuyến khích tôi xem lại "Oẳn tù tì" bằng Python để suy nghĩ về cách tôi có thể tiếp cận dự án theo cách khác

Tuy nhiên, khi tôi đang nghiên cứu giải pháp, tôi chợt nhớ đến một bài báo mà tôi đã đánh giá cho Real Python cách đây khá lâu

Tạo trò chơi Python đầu tiên của bạn. Oẳn tù tì. – Trăn thật

Trong hướng dẫn này, bạn sẽ học lập trình oẳn tù tì bằng Python từ đầu. Bạn sẽ học cách tiếp nhận đầu vào của người dùng, làm cho máy tính chọn một hành động ngẫu nhiên, xác định người chiến thắng và chia mã của bạn thành các chức năng

Làm thế nào để bạn tạo mã oẳn tù tì trong python?
Trăn thậtTrăn thật

Làm thế nào để bạn tạo mã oẳn tù tì trong python?

Hóa ra hai giải pháp đầu tiên tôi "phát minh" ở đây tương tự như giải pháp mà Chris Wilkerson, tác giả của bài báo Real Python, đã đưa ra

Giải pháp của Chris có đầy đủ tính năng hơn. Nó bao gồm một cơ chế chơi trò chơi tương tác và thậm chí sử dụng loại

loses_to = {
    "rock": "scissors",
    "paper": "rock",
    "scissors": "paper",
}
718 của Python để thể hiện các mục trò chơi. Đó hẳn cũng là nơi tôi lần đầu tiên nghe nói về "Thằn lằn kéo giấy oẳn tù tì". "

Cách mã hóa python rock

Trò chơi oẳn tù tì bằng Python .
nhập ngẫu nhiên
player1 = input("Chọn Rock, Paper, hoặc Scissor. "). thấp hơn()
player2 = ngẫu nhiên. lựa chọn(["Đá", "Giấy", "Kéo"]). thấp hơn()
print("Người chơi 2 được chọn. ", người chơi2)
nếu player1 == "đá" và player2 == "giấy"
print("Người chơi 2 Thắng")

đá là gì

Đây là một trò chơi bài thường được chơi giữa 2 người, mỗi người chơi có thể xếp ngẫu nhiên một trong ba người bất kỳ từ ván bài của mình. Người chơi chọn đá sẽ thắng người chơi khác chọn kéo nhưng thua người chơi chọn giấy;

Làm cách nào để viết mã oẳn tù tì con thằn lằn spock trong Python?

# Vòng lặp trò chơi trong khi đúng. # Menu Trò Chơi print() print("Chơi Nào. ") print("Phiên bản oẳn tù tì là phiên bản nào?") print("Nhập 1 để chơi Oẳn tù tì-Kéo") print("Nhấn 2 để chơi Oẳn tù tì-Thằn lằn-Spock") print( . lựa chọn = int(

Làm cách nào để tạo trò chơi bằng Python?

Đây là ví dụ sau về việc tạo một cửa sổ pygame đơn giản. .
nhập pygame
pygame. trong đó()
màn hình = pygame. trưng bày. set_mode((400,500))
xong = Sai
trong khi chưa hoàn thành
cho sự kiện trong pygame. Sự kiện. được()
nếu sự kiện. gõ == pygame. TỪ BỎ
xong = Đúng