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? Show
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
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ầuHã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à 3 chấp nhận hai đối số chuỗi — sự lựa chọn của mỗi người chơi là 4, 5 hoặc 6 — và trả về một chuỗi cho biết người chiến thắng (e. g. , 7) hoặc nếu trận đấu có kết quả hòa (e. g. , 8)Dưới đây là một số ví dụ về cách 3 được gọi và những gì nó trả về
4, 5 hoặc 6, thì 3 sẽ đưa ra một số loại ngoại lệ 3 cũng nên có tính chất giao hoán. Tức là, 35 sẽ trả về cùng thứ như 36Giả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 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 38 7Nó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. Đ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 #1Mộ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à 39 (đặt tên khó lắm các bạn ạ)
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 3Một từ điển có một vài lợi ích. Bạn có thể sử dụng nó để
Với suy nghĩ này, hàm 3 có thể được viết như sau 2Trong phiên bản này, 3 tận dụng lợi thế của 21 tích hợp do từ điển 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ư 26 hoặc 27 — 3 sẽ tăng 21 2Mặc dù 21 không hữu ích bằng 21 với thông điệp mô tả, nhưng nó vẫn hoàn thành công việcHàm 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
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 đó, 3 trả về giá trị 30Như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 38 cuối cùng khỏi 3 và chỉ 33 nếu cả hai khối 38 còn lại đều không thực thi 3Chú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 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 đượcSự đá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 #2Giả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
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 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 39 này trông như thế nào khi sử dụng các quy tắc "Oẳn tù xì" ban đầu 2Tạ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 3 để xử lý từ điển 39 mới, tất cả những gì bạn phải làm là thay thế 20 bằng 21 để sử dụng kiểm tra tư cách thành viên thay vì kiểm tra đẳng thức 7Hã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ế 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ư 9Hàm 3 mới hoạt động hoàn hảo với các quy tắc mới này 70Theo 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 39 và thay thế 20 bằng 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àoVượ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 Đ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 #3Hã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 39 từ giải pháp trước đó 2Tiếp theo, hãy viết một hàm 28 lấy một từ điển quy tắc, chẳng hạn như 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à 28 sẽ trả về khi được gọi với đối số là 39 72Nế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
Cách để giải quyết vấn đề này là sử dụng 76 tích hợp sẵn của Python. Giống như các bộ, 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 78 hoặc 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 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 28, bạn có thể lặp qua từng khóa trong từ điển 39 và xây dựng một phiên bản 79 cho từng giá trị chuỗi trong bộ tương ứng với khóa 73Điều này giúp bạn đi được nửa chặng đường 74Tuy 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 79 cho mỗi khóa trong từ điển 95 ánh xạ tới chuỗi 8 75Bây giờ giá trị được trả về bởi 28 có vẻ đúng 76Tạ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 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ụngVì 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 39 cho một biến 702 77Bây giờ bạn có thể viết một hàm 3 tra cứu trạng thái trong bảng 702 dựa trên các đối số được truyền cho play rồi trả về kết quả 78Phiên bản 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 79Cá 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 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 0 3 thậm chí còn tăng 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 702 được đặt 1Tuy 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 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 3Vì vậy, việc triển khai này nhanh hơn bao nhiêu so với những lần trước? . 713 là phiên bản của 3 từ phần này và 715 là phiên bản hiện tại 2Trong 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 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 đượcPhần kết luậnTô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 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 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 Trăn thậtTrăn thậtHó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 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 rockTrò 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 |