Trò chơi trực tuyến nhiều người chơi Python

Để máy khách kết nối với máy chủ mới của bạn, bạn nên sử dụng mô-đun Kết nối. Xem Kết nối pydoc để biết thêm chi tiết, nhưng đây là tóm tắt

Sự liên quan. kết nối là một Kênh đơn lẻ kết nối với máy chủ. Bạn sẽ chỉ có một trong số này trong mã trò chơi của mình và bạn sẽ sử dụng nó để kết nối với máy chủ và gửi tin nhắn đến máy chủ

from PodSixNet.Connection import connection

# connect to the server - optionally pass hostname and port like: ["mccormick.cx", 31425]
connection.Connect[]

connection.Send[{"action": "myaction", "blah": 123, "things": [3, 4, 3, 4, 7]}]

Bạn cũng cần đặt đoạn mã sau một lần vào đâu đó trong vòng lặp trò chơi của mình

connection.Pump[]

Bất cứ khi nào bạn có một đối tượng trong trò chơi mà bạn muốn nhận thông báo từ máy chủ, hãy phân lớp ConnectionListener. Ví dụ

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data

Giống như trong trường hợp máy chủ, các sự kiện mạng được nhận bởi các phương thức gọi lại Network_*, trong đó bạn nên thay thế '*' bằng giá trị trong khóa 'hành động' mà bạn muốn nắm bắt. Bạn có thể triển khai bao nhiêu hoặc một vài điều ở trên tùy thích. Ví dụ: NetworkGUI có thể chỉ muốn lắng nghe các sự kiện mạng _connected, _disconnected và _error. Dữ liệu cho _error luôn ở dạng ngoại lệ mạng, như [111, 'Kết nối bị từ chối'] - chúng được truyền trực tiếp từ lớp ổ cắm và là lỗi ổ cắm tiêu chuẩn

Một lớp khác có thể triển khai các phương thức tùy chỉnh như Network_myaction[], phương thức này sẽ nhận bất kỳ dữ liệu nào được gửi từ máy chủ bằng khóa 'hành động' có tên 'myaction'. Ví dụ: máy chủ có thể gửi tin nhắn với số lượng người chơi hiện đang kết nối như vậy

channel.Send[{"action": "numplayers", "players": 10}]

Và người nghe sẽ trông như thế này

from PodSixNet.Connection import ConnectionListener

class MyPlayerListener[ConnectionListener]:

    def Network_numplayers[data]:
        # update gui element displaying the number of currently connected players
        print data['players']

Bạn có thể phân lớp ConnectionListener bao nhiêu lần tùy thích trong ứng dụng của mình và mọi lớp bạn tạo phân lớp nào nó sẽ nhận các sự kiện mạng thông qua các cuộc gọi lại Mạng có tên. Bạn nên gọi phương thức Pump[] trên mỗi đối tượng mà bạn khởi tạo một lần trong mỗi vòng lặp trò chơi

Hướng dẫn trò chơi trực tuyến Python này từ Tech with Tim sẽ chỉ cho bạn cách viết mã trò chơi nhiều người chơi có thể mở rộng với python bằng cách sử dụng socket/mạng và pygame. Bạn sẽ học cách triển khai trò chơi của mình để mọi người ở mọi nơi trên thế giới có thể chơi với nhau

Bạn sẽ học và hiểu những điều sau đây sau hướng dẫn này.
• Cách hệ thống máy khách/máy chủ hoạt động
• Cách phát triển ứng dụng cho máy chủ bên ngoài
• Cách viết mã máy khách
• How to Code a Server
• Sending Encrypted Data Such as Objects Over a Port
• Connecting Multiple Clients to a Server

Bạn có thể xem toàn bộ khóa học bằng video trên freeCodeCamp. org kênh YouTube [2. đồng hồ 5 giờ]

QUẢNG CÁO

QUẢNG CÁO

Beau Carnes

Tôi là giáo viên và nhà phát triển với freeCodeCamp. tổ chức. Tôi chạy freeCodeCamp. tổ chức kênh YouTube

Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn

Học cách viết mã miễn phí. Chương trình giảng dạy nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có việc làm với tư cách là nhà phát triển. Bắt đầu

Bạn đã bao giờ tự hỏi làm thế nào một trò chơi nhiều người chơi hoạt động?

Đây là bài đăng của Thành viên nhóm hướng dẫn Julian Meyer, một nhà phát triển python 13 tuổi. Bạn có thể tìm thấy anh ấy trên Google+ và Twitter

Tôi chắc chắn rằng thỉnh thoảng bạn và bạn bè của mình lên mạng để chơi một trò chơi nhiều người chơi. Bạn đã bao giờ thắc mắc về bên trong trò chơi đó và mọi thứ hoạt động như thế nào chưa?

Trong hướng dẫn này, bạn sẽ tìm hiểu về lập trình trò chơi nhiều người chơi bằng cách tạo một trò chơi mẫu. Trên đường đi, bạn cũng sẽ tìm hiểu về lập trình hướng đối tượng

Đối với hướng dẫn này, bạn sẽ sử dụng Python và các mô-đun PyGame. Nếu bạn chưa quen với Python hoặc PyGame, trước tiên bạn nên xem hướng dẫn trước đó về cách bắt đầu lập trình trò chơi, hướng dẫn này giải thích một số điều cơ bản về PyGame

Bắt đầu

Bước đầu tiên là đảm bảo rằng bạn đã cài đặt PyGame. Bạn có thể tải xuống trình cài đặt Mac cho PyGame tại đây. Đảm bảo bạn tải xuống trình cài đặt Lion nếu bạn có Mac OSX 10. 7 trở lên. Nếu không, hãy tải xuống trình cài đặt Snow Leopard

Bạn cũng có thể tải xuống và cài đặt PyGame theo những cách này

  • Với MacPorts sử dụng.
    python2.7-32
    3
  • Với Fink sử dụng.
    python2.7-32
    4
  • Với Homebrew và pip sử dụng lệnh tìm thấy tại đây

Nếu bạn đang chạy Windows, thì bạn có thể tìm thấy trình cài đặt của mình tại đây

Ghi chú. Nếu bạn gặp sự cố trong hướng dẫn trước, hãy đảm bảo rằng bạn có phiên bản Python 32 bit trên hệ thống của mình. Nếu bạn có hệ thống 64-bit, thì bạn cần chạy

python2.7-32
5 để chạy Python

Cuối cùng, hãy tải xuống tài nguyên cho dự án này, bao gồm một số hình ảnh và âm thanh mà bạn sẽ cần cho trò chơi này

Các quy tắc của trò chơi

Trò chơi bạn sắp thực hiện trong phần hướng dẫn này có tên là “Hộp”. Bạn có thể quen với việc chơi trò chơi này trên giấy với một số bạn bè khi còn đi học

Trong trường hợp bạn chưa quen với trò chơi, đây là các quy tắc

  1. Bảng bao gồm một lưới các điểm 7×7 [tạo thành một lưới các khối 6×6 nếu bạn kết nối các dấu chấm]

  1. Trong mỗi lượt của người chơi, người chơi điền vào đoạn đường ngang hoặc dọc nối hai điểm lân cận

  1. Nếu điền vào một đoạn thẳng hoàn thành một ô trên lưới, người chơi sẽ trở thành chủ sở hữu của ô đó và nhận được một điểm. Người chơi cũng có thể đặt một đoạn thẳng khác trong cùng một lượt

  1. Người chơi có nhiều ô vuông/điểm nhất khi kết thúc trò chơi sẽ thắng

Mặc dù các quy tắc này rất đơn giản nhưng đây là một trò chơi thú vị để chơi, đặc biệt nếu bạn cảm thấy buồn chán. Nhưng sẽ không tuyệt sao nếu bạn có thể chơi trò này trực tuyến?

Lập trình hướng đối tượng. Giới thiệu nhanh

Trước khi chúng ta bắt đầu, hãy thảo luận về một thứ gọi là Lập trình hướng đối tượng mà bạn sẽ sử dụng trong hướng dẫn này

Lập trình hướng đối tượng, còn được gọi là OOP, là một loại lập trình dựa trên các đối tượng. Đối tượng là các gói dữ liệu và logic liên quan. Ví dụ: bạn có thể có một đối tượng “chó” bao gồm một số dữ liệu [tên hoặc món ăn yêu thích của con chó] và logic liên quan [ví dụ: hướng dẫn cách sủa]

Các đối tượng được tạo từ các mẫu được gọi là các lớp xác định loại dữ liệu mà đối tượng có thể lưu giữ và những loại việc mà đối tượng có thể làm. Chúng được gọi là các thuộc tính và phương thức của đối tượng, tương ứng

Phương thức là các chức năng đại diện cho điều gì đó mà bạn có thể yêu cầu đối tượng thực hiện. Ví dụ, câu lệnh

python2.7-32
6 có thể được hiểu là nói đối tượng trong biến “car” thành “drive”. Thuộc tính là các biến thuộc về một đối tượng. Tiếp tục ví dụ, đối tượng car của bạn có thể có thuộc tính tên là
python2.7-32
7, và câu lệnh
python2.7-32
8 sẽ đặt giá trị của chiếc xe là
python2.7-32
7 thành 100

Hai câu lệnh này điều khiển một đối tượng ô tô đã tồn tại. Nhớ lại rằng lớp xe ô tô là khuôn mẫu xác định cách tạo một đối tượng ô tô và ô tô là gì bằng cách xác định các thuộc tính và phương thức của nó. Trong định nghĩa của các phương pháp đó, bạn sẽ tìm thấy mã điều khiển chiếc xe từ bên trong. Chẳng hạn, thay vì

python2.7-32
8, bạn có thể tìm thấy
connection.Pump[]
31, là đối tượng ô tô tự nói với chính nó -
connection.Pump[]
32, hiểu chưa?

OOP là một chủ đề lớn nhưng những điều cơ bản ở trên là tất cả những gì bạn cần để bắt đầu. Mã của bạn sẽ mô tả trò chơi Boxes là sự tương tác của các đối tượng khác nhau. Các đối tượng đó đều có các thuộc tính và phương thức mà bạn sẽ định nghĩa trong lớp của đối tượng. Và khi bạn viết một đoạn mã, bạn nên nhớ xem bạn đang viết mã lớp xác định những gì một đối tượng có thể làm từ “bên trong” của đối tượng hay mã thao tác một đối tượng từ “bên ngoài” của đối tượng đó

Thiết lập trò chơi hướng đối tượng cơ bản

Có một số cách để sử dụng khung hướng đối tượng cho trò chơi của bạn. Trò chơi Hộp của bạn sẽ có cách tiếp cận đơn giản, trong đó có một lớp cho máy khách và một lớp cho máy chủ. Bây giờ, hãy tạo lớp máy khách chính sẽ chạy khi người dùng bắt đầu trò chơi

Khi bắt đầu tạo mọi trò chơi, tôi thích tạo một thư mục cho trò chơi. Khi bạn giải nén tài nguyên cho dự án này, nó sẽ tạo một thư mục hoặc bạn gọi là hộp. Đây là nơi bạn sẽ đặt mã nguồn của trò chơi – ngay tại đây cùng với tất cả các hình ảnh

Tạo một tệp trong thư mục này có tên là hộp. py bằng trình soạn thảo văn bản yêu thích của bạn [nếu không có, bạn có thể sử dụng TextEdit trên máy Mac hoặc Notepad trong Windows]. Sau đó thêm phần nhập tệp này

connection.Pump[]
5

Điều này nhập mô-đun PyGame để bạn sử dụng. Trước khi tiếp tục, bạn nên kiểm tra xem ít nhất phần này có hoạt động không. Để thực hiện việc này, hãy mở Terminal và chuyển sang thư mục hộp của bạn bằng lệnh cd. Sau đó nhập hộp trăn. py. Ví dụ: đây là giao diện trên máy của tôi

connection.Pump[]
6

Nếu bạn không gặp lỗi nào sau khi chạy chương trình này, điều đó có nghĩa là bạn đã cài đặt PyGame đúng cách và bạn đã sẵn sàng

Ghi chú. Nếu việc chạy đoạn mã trên mang lại cho bạn thông báo

connection.Pump[]
33 nói rằng "Không có mô-đun nào có tên pygame", thì bạn chưa cài đặt PyGame hoặc bạn đã cài đặt PyGame vào một bản sao Python khác với bản sao bạn đang chạy. Chẳng hạn, nếu bạn đã sử dụng MacPorts để cài đặt Python 2. 7 và PyGame với
connection.Pump[]
34, sau đó đảm bảo chạy cùng một Python bằng cách gọi
connection.Pump[]
35 từ Terminal

Nếu chạy đoạn mã trên mang lại cho bạn lỗi cụ thể này

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
0

Điều đó có nghĩa là bạn cần chạy Python ở chế độ 32 bit, như thế này

python2.7-32

Tiếp theo, thêm định nghĩa lớp, cũng như một thứ mà mọi lớp nên có

connection.Pump[]
3

Dòng đầu tiên của mã này cho trình biên dịch biết rằng bạn đang tạo một lớp mới có tên là BoxesGame. Dòng thứ hai định nghĩa một phương thức có tên là

connection.Pump[]
36. Dấu gạch dưới kép xung quanh là một gợi ý rằng đây là một tên phương thức đặc biệt. Trên thực tế, tên này xác định phương thức là phương thức
connection.Pump[]
36 của lớp, phương thức mà bạn chạy bất cứ khi nào bạn muốn tạo hoặc khởi tạo một đối tượng của lớp

Bây giờ bạn sẽ điền vào phần thân của hàm

connection.Pump[]
38 để thực hiện một số thao tác khởi tạo PyGame. Thêm mã này vào mã bạn đã viết ở trên, thay cho nhận xét bắt đầu bằng
connection.Pump[]
39

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
7

Đảm bảo bạn thụt lề chính xác, sao cho mọi thứ thẳng hàng với lề trái của nơi có nhận xét “#put something here…”. Bạn có thể đọc thêm về vấn đề ở đây. Thụt lề Python

Hãy xem mã bạn vừa thêm, từng đoạn một

  1. Trước tiên, bạn khởi tạo PyGame và hai biến mà bạn sẽ sử dụng để thiết lập màn hình,
    from PodSixNet.Connection import ConnectionListener
    
    class MyNetworkListener[ConnectionListener]:
    
        def Network[self, data]:
            print 'network data:', data
    
        def Network_connected[self, data]:
            print "connected to the server"
    
        def Network_error[self, data]:
            print "error:", data['error'][1]
    
        def Network_disconnected[self, data]:
            print "disconnected from the server"
    
        def Network_myaction[data]:
            print "myaction:", data
    70 và
    from PodSixNet.Connection import ConnectionListener
    
    class MyNetworkListener[ConnectionListener]:
    
        def Network[self, data]:
            print 'network data:', data
    
        def Network_connected[self, data]:
            print "connected to the server"
    
        def Network_error[self, data]:
            print "error:", data['error'][1]
    
        def Network_disconnected[self, data]:
            print "disconnected from the server"
    
        def Network_myaction[data]:
            print "myaction:", data
    71
  2. Sau đó, bạn khởi tạo màn hình bằng hai biến đó. Bạn cũng đặt tiêu đề của màn hình
  3. Cuối cùng, bạn khởi tạo đồng hồ PyGame mà bạn sẽ cần để theo dõi thời gian trong trò chơi

Tiếp theo, hãy thêm vòng lặp

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
72, chạy định kỳ để cập nhật trò chơi, vẽ đồ họa và nhận đầu vào của người dùng. Thực hiện việc này bằng cách thêm phần sau vào sau phương thức __init__ [lề trái phải bằng với lề trái của __init__]

channel.Send[{"action": "numplayers", "players": 10}]
1

Đây là vòng lặp cập nhật cơ bản để xóa màn hình và kiểm tra xem người dùng có muốn thoát trò chơi không. Bạn sẽ bổ sung thêm vào điều này sau

Chạy tệp Python bây giờ sẽ không làm gì cả, vì tất cả những gì bạn đã làm là định nghĩa lớp BoxesGame. Bạn vẫn cần tạo một đối tượng của lớp này và bắt đầu trò chơi

Bây giờ bạn đã sẵn sàng cho vòng lặp cập nhật, hãy thêm mã sẽ chạy lớp trò chơi chính. Sau đó, bạn sẽ thiết lập một số đồ họa cơ bản trong trò chơi, chẳng hạn như vẽ bảng

Thêm mã này vào cuối tệp để bắt đầu trò chơi [lề trái phải bằng lề trái của tệp]

channel.Send[{"action": "numplayers", "players": 10}]
2

Đây là cái hay của lập trình hướng đối tượng. Mã thực sự khiến mọi thứ xảy ra chỉ dài ba dòng

Tại thời điểm này, toàn bộ tệp sẽ trông như thế này

channel.Send[{"action": "numplayers", "players": 10}]
3

Đó là nó. Bây giờ không phải là dễ dàng?

Như các bạn thấy chạy game cho kết quả màn hình đen rất ấn tượng. vâng

Bạn có thể không hiểu điều này bây giờ, nhưng viết trò chơi là một quá trình chiến lược. Hãy nghĩ về nó như là một kiến ​​trúc sư. Bạn vừa xây dựng một cơ sở vững chắc cho tòa nhà của mình. Các tòa nhà lớn phải có cơ sở rất tốt và vì vậy bạn phải suy nghĩ kỹ về kế hoạch của mình trước khi bắt đầu

Hãy thêm một phương pháp khác. Nếu bạn không nhớ điều này có nghĩa là gì, hãy đọc lại phần hướng dẫn có tên “Lập trình hướng đối tượng. Giới thiệu nhanh. ”

Vẽ bảng và đường kẻ trên màn hình

Trong PyGame, phía trên bên trái của cửa sổ là tọa độ [0, 0]. Vì vậy, hãy xác định một hệ tọa độ cho các điểm trong lưới Hộp tương tự, với [0,0] đại diện cho điểm trên bên trái và [6,6] đại diện cho điểm dưới cùng bên phải

Bằng cách nào đó, bạn cần một cách để thể hiện các phân đoạn dòng tiềm năng trong trò chơi. Vâng, có hai loại phân đoạn dòng khác nhau. đường ngang và dọc. Hãy tưởng tượng bạn tạo một danh sách tất cả các kết hợp đường ngang và dọc tiềm năng. Nó sẽ trông giống như thế này

Trong thuật ngữ lập trình, một danh sách còn được gọi là một mảng. Và khi bạn có một danh sách các danh sách, chẳng hạn như tổ hợp đường ngang và đường dọc ở đây, thì đó được gọi là mảng 2D

Ví dụ: để biểu thị đường ngang từ [0, 0] đến [1, 1], đó sẽ là hàng 0, cột 0 trong danh sách “đường ngang”

Lưu ý rằng danh sách dòng ngang có 6 hàng và 7 cột và danh sách dòng dọc có 7 hàng và 6 cột

Thêm hai dòng này vào __init__ để xác định hai mảng này

channel.Send[{"action": "numplayers", "players": 10}]
4

Một cách nhanh chóng để tạo một mảng là làm điều này.

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
73. Trong trường hợp này, bạn điền vào một mảng bằng một mảng chứa các
from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
74.
from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
74 là viết tắt của một khoảng trống

Bây giờ bạn đã có hình đại diện của bàn cờ, hãy chuyển sang mã vẽ bàn cờ

Trước hết, hãy tạo một phương thức mới có tên là

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
76. Phương thức này sẽ là thứ bạn gọi từ
connection.Pump[]
36, nhưng để giữ cho mã của bạn được tổ chức, bạn đang tạo một phương thức riêng biệt chỉ với mục đích tải đồ họa. Thêm phần này ngay trước hàm
connection.Pump[]
36

connection.Pump[]
60

Như bạn có thể thấy, bạn có ba nhân vật chính. một dòng bình thường [trống], một dòng đã hoàn thành [chiếm đóng] và một dòng di chuột. Bạn xoay mỗi đường này 90 độ để vẽ các phiên bản nằm ngang của chúng. Các tệp này đi kèm với các tài nguyên bạn đã tải xuống trước đó và phải nằm trong cùng thư mục với tệp Python của bạn

Bạn có một phương thức để tải tất cả đồ họa, nhưng bạn vẫn chưa gọi nó. Hãy thử đoán nơi để thêm những gì

Khi bạn có câu trả lời, hãy nhấp vào nút Hiển thị bên dưới để xem bạn có đúng không

[spoiler title=”Giải pháp”]Thêm phần này vào cuối __init__

connection.Pump[]
61

[/spoiler]

Tiếp theo, bạn nên thêm mã thực sự vẽ bảng. Để lặp qua mọi x và y trong một lưới, bạn phải thêm một vòng lặp

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
79 bên trong vòng lặp
from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
79. [Dành cho tất cả các bạn hâm mộ Inception, một for-loop-ception. ] Bạn cần một vòng lặp lặp qua các giá trị x và y. Thêm phần này ngay sau phương thức
connection.Pump[]
36

connection.Pump[]
62

Mã này chỉ đơn giản là lặp qua lưới và kiểm tra xem phần đó trên lưới đã được nhấp hay chưa. Mã thực hiện việc này cho cả đường ngang và đường dọc.

channel.Send[{"action": "numplayers", "players": 10}]
12 và
channel.Send[{"action": "numplayers", "players": 10}]
13 trả về đúng hoặc sai, tùy thuộc vào việc đoạn dòng thích hợp đã được điền có chưa

Chạy chương trình bây giờ vẫn không làm gì cả. Tất cả những gì bạn đã làm là xác định trò chơi sẽ làm gì nếu nó nhận được lệnh gọi phương thức đó

Bây giờ, hãy thêm lời gọi phương thức vào chức năng cập nhật. Thêm phần này sau khi bạn xóa màn hình bằng

channel.Send[{"action": "numplayers", "players": 10}]
14

connection.Pump[]
63

Và tất nhiên, là một lập trình viên giỏi, bạn nhớ thêm comment để giải thích code

Chạy mã của bạn ngay bây giờ. Khi bạn làm như vậy, bạn sẽ thấy lưới được vẽ trên màn hình

Mỗi khi tôi viết mã vẽ bản đồ, tôi thích thử nghiệm nó, vừa vì nó thú vị vừa vì đó là một cách hay để tìm lỗi. Thêm phần này sau khi bạn khởi tạo bảng bằng cách xác định

channel.Send[{"action": "numplayers", "players": 10}]
15 và
channel.Send[{"action": "numplayers", "players": 10}]
16

connection.Pump[]
64

Chạy mã và như bạn có thể thấy, một đường ngang sáng lên – đường từ [5, 3] đến [5, 4]

Khá tuyệt phải không?

Làm tốt lắm. Bạn đã vẽ xong bản đồ của mình, đây là một trong những điều khó thực hiện nhất trong lập trình trò chơi

Thêm các loại đường khác

Tiếp theo, bạn cần tìm đường mà con chuột ở gần nhất để có thể vẽ đường di chuột tại điểm đó

Trước tiên, ở đầu tệp, hãy thêm dòng này để nhập thư viện toán học mà bạn sẽ sớm cần đến

connection.Pump[]
65

Sau đó, trước

channel.Send[{"action": "numplayers", "players": 10}]
17, hãy thêm đoạn mã lớn này

connection.Pump[]
66

Ồ. Đó là rất nhiều mã. Chúng ta hãy đi qua từng phần một

  1. Trước tiên, bạn có được vị trí chuột với chức năng tích hợp của PyGame
  2. Tiếp theo, bạn có được vị trí của chuột trên lưới, sử dụng thực tế là mỗi ô vuông có kích thước 64x64 pixel
  3. Bạn kiểm tra xem chuột ở gần trên và dưới hay trái và phải hơn để xác định xem người dùng đang di chuột trên một đường ngang hay dọc
  4. Bạn nhận được vị trí mới trên lưới dựa trên biến
    channel.Send[{"action": "numplayers", "players": 10}]
    18
  5. Bạn khởi tạo biến
    channel.Send[{"action": "numplayers", "players": 10}]
    19 là
    channel.Send[{"action": "numplayers", "players": 10}]
    20 hoặc
    channel.Send[{"action": "numplayers", "players": 10}]
    21, tùy điều kiện nào đúng
  6. Cuối cùng, bạn thử vẽ đường di chuột vào màn hình, xem nó nằm ngang hay dọc và ở trên, dưới, trái hay phải. Bạn cũng kiểm tra xem dòng có vượt quá giới hạn không. Nếu có, hoặc nếu đường đã được vẽ, bạn không vẽ đường di chuột

Chạy chương trình và bạn nhận được. trống cuộn xin vui lòng. một bản đồ nơi một đường sáng lên khi con chuột của bạn di chuyển qua nó

Nếu bạn giống tôi, có lẽ bây giờ bạn đã lướt chuột trên bảng. Hãy dành chút thời gian để tận hưởng thành quả của bạn

OK, bây giờ bạn có một lưới sáng lên khi chuột của người chơi di chuyển trên một dòng. Nhưng đây không phải là một trò chơi mà bạn chỉ cần di chuyển chuột xung quanh một loạt. Bạn cần thêm chức năng click-to-lay-down-line

Để làm điều này, bạn sẽ sử dụng chức năng chuột tích hợp của PyGame, đơn giản là

channel.Send[{"action": "numplayers", "players": 10}]
22. Hàm trả về 1 hoặc 0, tùy thuộc vào việc nút chuột hiện đang được nhấn xuống

Trước khi tôi cho bạn biết cách triển khai điều này trong trò chơi của bạn, hãy thử tự mình tìm ra. Hãy nhớ cách bạn đã sử dụng câu lệnh

channel.Send[{"action": "numplayers", "players": 10}]
23 trước đây và cách tạo một phần trên bảng

[spoiler title="Solution"]Thêm phần này ngay sau khối mã cuối cùng xác định hành vi di chuột

connection.Pump[]
67

[/spoiler]

Chạy chương trình ngay bây giờ và voilà. Nếu bạn nhấp chuột, bạn đặt một dòng ngay tại nơi bạn đang di chuột. Như bạn có thể thấy, đoạn mã bạn đã thêm sẽ kiểm tra xem chuột có được nhấn hay không và đường kẻ phải nằm ngang hay dọc và đặt đường kẻ cho phù hợp

Tuy nhiên, có một vấn đề là nếu bạn nhấp vào cuối màn hình [bên dưới nơi các hộp được vẽ], trò chơi sẽ bị treo. Hãy xem tại sao điều này là. Khi một sự cố nào đó xảy ra, thông thường nó sẽ báo lỗi cho bạn trong Terminal. Trong trường hợp này, báo cáo trông như thế này

connection.Pump[]
68

Lỗi này nói rằng mảng

channel.Send[{"action": "numplayers", "players": 10}]
20 mà bạn đã cố truy cập không đi xa đến mức bạn đã nhấp vào. Bạn có nhớ biến đó có tên là
channel.Send[{"action": "numplayers", "players": 10}]
25 không? . Đơn giản chỉ cần thay đổi điều này

connection.Pump[]
69

Bây giờ nếu bạn thử nhấp vào bên ngoài bảng, trò chơi sẽ không gặp sự cố. Làm tốt lắm – bạn vừa chứng minh cách gỡ lỗi từ

Trước khi bạn bắt đầu triển khai logic trò chơi ở phía máy chủ, trước tiên hãy thêm một số bước hoàn thiện cho phía máy khách

Hoàn thiện

Một điều thực sự làm tôi khó chịu là khoảng trống ở các điểm nối của các dòng. May mắn thay, bạn có thể khắc phục điều này khá dễ dàng bằng cách sử dụng lưới 7x7 các chấm vuông để điền vào các khoảng trống đó. Tất nhiên, bạn cần tệp hình ảnh, vì vậy hãy tải tệp đó ngay bây giờ và đồng thời thêm tất cả các hình ảnh khác mà bạn sẽ sử dụng trong phần này

Thêm phần này vào cuối

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
76

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
00

Bây giờ hình ảnh của bạn đã được tải, hãy vẽ từng chấm trong số 49 chấm lên màn hình. Thêm phần này vào cuối

channel.Send[{"action": "numplayers", "players": 10}]
27

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
01

Được rồi, đủ mã. Đã đến lúc chạy thử. Chạy trò chơi và bạn sẽ nhận được một lưới trông đẹp hơn

Tiếp theo, hãy đặt màn hình hiển thị kính chắn gió hoặc HUD ở cuối màn hình. Trước tiên, bạn cần tạo phương thức

channel.Send[{"action": "numplayers", "players": 10}]
28. Thêm mã này sau
channel.Send[{"action": "numplayers", "players": 10}]
27

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
02

Code này cũng vẽ nền bảng điểm

Hãy để tôi xem qua cách PyGame xử lý phông chữ. Có ba bước

  1. Trước tiên, bạn xác định một phông chữ có kích thước đã đặt
  2. Tiếp theo, bạn gọi
    channel.Send[{"action": "numplayers", "players": 10}]
    30 để tạo bề mặt cho các chữ cái trong phông chữ đó
  3. Sau đó, bạn vẽ bề mặt giống như một hình ảnh

Bây giờ bạn đã biết điều đó, bạn có thể sử dụng thông tin này để vẽ phần tiếp theo của HUD. chỉ báo "Lượt của bạn". Thêm mã này ở dưới cùng của

channel.Send[{"action": "numplayers", "players": 10}]
28

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
03

Đồng thời thêm phần này sau cuộc gọi tới

channel.Send[{"action": "numplayers", "players": 10}]
32

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
04

Mã này tạo phông chữ, hiển thị màu trắng và sau đó vẽ nó lên màn hình. Trước khi bạn thử chạy trò chơi, hãy thêm phần này sau lệnh gọi tới

channel.Send[{"action": "numplayers", "players": 10}]
33

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
05

Chạy chương trình và bạn sẽ nhận được một số dòng chữ "Your Turn" ở cuối màn hình. Nếu bạn nhìn kỹ, bạn cũng có thể thấy nền có kết cấu độc đáo

Điều này thật tuyệt, nhưng bạn vẫn cần thêm chỉ báo sau dòng chữ "Lượt của bạn" để cho người chơi biết đó là vòng của họ

Tuy nhiên, trước khi thực hiện, bạn muốn trò chơi biết đến lượt của ai. Đảm bảo rằng nó biết bằng cách thêm phần này vào cuối

connection.Pump[]
36

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
06

Bây giờ cho chỉ số đó. Thêm phần này vào cuối

channel.Send[{"action": "numplayers", "players": 10}]
28

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
07

Chạy trò chơi và bạn sẽ thấy chỉ số điểm màu xanh lục. Bạn có thể đánh dấu điều đó ra khỏi danh sách những việc cần làm của mình

Tiếp theo, hãy thêm văn bản cho điểm của mỗi người chơi. Khởi tạo các biến cho hai điểm số bằng cách thêm phần này vào cuối

connection.Pump[]
36

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
08

Tại đây, bạn cũng thêm một biến khác mà bạn sẽ sử dụng sau trong bước này

Nhớ làm thế nào để thêm văn bản? . Thêm phần này vào cuối

channel.Send[{"action": "numplayers", "players": 10}]
28

from PodSixNet.Connection import ConnectionListener

class MyNetworkListener[ConnectionListener]:

    def Network[self, data]:
        print 'network data:', data

    def Network_connected[self, data]:
        print "connected to the server"

    def Network_error[self, data]:
        print "error:", data['error'][1]

    def Network_disconnected[self, data]:
        print "disconnected from the server"

    def Network_myaction[data]:
        print "myaction:", data
09

Chạy trò chơi để kiểm tra công việc của bạn

Bây giờ bạn đã chính thức hoàn thành với HUD. Chỉ còn một vài việc nữa phải làm ở phía khách hàng, vì vậy hãy kiên nhẫn với tôi

Tiếp theo, hãy thêm một lưới chủ sở hữu rất đơn giản chứa các giá trị đại diện cho một người chơi. Những giá trị này sẽ cho phép bạn theo dõi ai sở hữu ô vuông nào. Bạn cần điều này để tô màu các ô vuông đúng cách và để theo dõi điểm số. Hãy nhớ rằng, người kiểm soát nhiều ô vuông nhất sẽ thắng

Đầu tiên hãy khởi tạo một mảng khác bằng cách thêm mảng này vào cuối

connection.Pump[]
36

python2.7-32
0

Bây giờ hãy vẽ lưới chủ sở hữu lên màn hình bằng cách sử dụng cùng loại vòng lặp mảng 2d mà bạn đã sử dụng để lặp qua các mảng đường kẻ. Thêm phần này vào cuối lớp

python2.7-32
1

Phương pháp này kiểm tra xem nó có cần vẽ vào một ô vuông nhất định hay không và nếu có, nó sẽ vẽ đúng màu [mỗi người chơi sẽ có màu riêng của mình]

Ngay bây giờ mã này sẽ không hoạt động vì bạn cần máy chủ báo cho máy khách biết màu nào sẽ vẽ, bạn sẽ thực hiện điều này trong phần tiếp theo của hướng dẫn. Hiện tại, bạn sẽ không gọi phương thức này

Bạn có một thứ nữa để thêm vào giao diện người dùng. màn hình thắng và thua. Xác định phương thức cuối cùng này và thêm nó vào cuối lớp

python2.7-32
2

Tất nhiên, vẫn chưa có cách nào để kích hoạt các màn hình này trong trò chơi. Điều đó cũng vậy, bạn sẽ quan tâm đến phần tiếp theo của hướng dẫn, khi bạn triển khai phía máy chủ của trò chơi

Hãy nhớ rằng bằng cách thêm tất cả các yếu tố trò chơi này ngay bây giờ, bạn đang đảm bảo rằng máy chủ sẽ có thể điều khiển máy khách theo bất kỳ cách nào nó muốn. Từ đây trở đi, bạn sẽ không cần thực hiện nhiều thay đổi đối với máy khách ngoài một chút keo dán giữa máy khách và máy chủ

Nhưng để chắc chắn rằng nó hoạt động, hãy thử gọi phương thức

channel.Send[{"action": "numplayers", "players": 10}]
39 trong phần cuối của
connection.Pump[]
36. Bạn sẽ nhận được một trò chơi trên màn hình giống như hình ảnh bên phải

Đi đâu từ đây?

Đây là mã nguồn từ hướng dẫn cho đến nay

Xin chúc mừng. Bạn đã hoàn thành phần máy khách của một trò chơi rất có tổ chức và đẹp mắt. Tất nhiên, đây chưa phải là kết thúc vì bạn chưa triển khai bất kỳ logic trò chơi nào, nhưng phía khách hàng đã làm rất tốt

Bây giờ bạn nên xem Phần 2 của hướng dẫn này, đó là tất cả về phía máy chủ - và cuối cùng bạn sẽ bắt đầu biến trò chơi này thành nhiều người chơi thực sự

Python có thể được sử dụng để tạo trò chơi nhiều người chơi không?

Hướng dẫn trò chơi trực tuyến Python này từ Tech with Tim sẽ chỉ cho bạn cách viết mã trò chơi nhiều người chơi có thể mở rộng bằng python bằng socket/mạng và pygame . Bạn sẽ học cách triển khai trò chơi của mình để mọi người ở mọi nơi trên thế giới có thể chơi với nhau.

Python có tốt cho trò chơi trực tuyến không?

Do đó, Python cũng là một ngôn ngữ lý tưởng để bạn bắt đầu cuộc phiêu lưu tạo trò chơi , bất kể bạn đã thông thạo ngôn ngữ này hay chưa. . Do cú pháp thân thiện với người mới của Python, các nhà phát triển có thể tập trung vào những điều cơ bản của lập trình trò chơi, chứ không phải sự phức tạp của chính ngôn ngữ này.

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

Chúng ta cũng sẽ sử dụng mô-đun thời gian. .
Bước 1 – Khởi tạo Board. .
Bước 2 – Khởi tạo biến. .
Bước 3 – Vòng lặp trò chơi. .
Bước 4 – Tạo một chức năng để in bảng Tic-Tac-Toe. .
Bước 5 – Chấp nhận thông tin đầu vào từ người chơi của chúng tôi. .
Bước 6 – Đặt điểm đánh dấu vào vị trí mong muốn. .
Bước 7 – Giành chiến thắng logic. .
Bước 8 – Tie Logic

Có trò chơi nào được tạo bằng Python không?

Trò chơi điện tử . Eve Online sử dụng Python không có ngăn xếp. Mount & Blade được viết bằng Python. Pirates of the Caribbean Online được viết bằng Python và sử dụng Panda3D cho đồ họa. Disney's Toontown Online is written in Python and uses Panda3D for graphics. Eve Online uses Stackless Python. Mount & Blade is written in Python. Pirates of the Caribbean Online is written in Python and uses Panda3D for graphics.

Chủ Đề