Có chức năng nhảy trong python không?

number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"
2 bị chỉ trích phổ biến trong khoa học máy tính và lập trình vì chúng dẫn đến mã rất phi cấu trúc

Python [giống như hầu hết mọi ngôn ngữ lập trình ngày nay] hỗ trợ lập trình có cấu trúc điều khiển luồng bằng cách sử dụng if/then/else, vòng lặp và chương trình con

Chìa khóa để suy nghĩ theo cách có cấu trúc là hiểu cách thức và lý do bạn phân nhánh mã

Ví dụ: giả sử Python có câu lệnh

number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"
3 và tương ứng với câu lệnh
number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"
4. Nhìn vào đoạn mã sau. Trong đó nếu một số lớn hơn hoặc bằng 0, chúng tôi in nếu nó

number = input[]
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end
label: negative
print "negative"
label: end
print "all done"

Nếu chúng ta muốn biết khi nào một đoạn mã được thực thi, chúng ta cần truy nguyên cẩn thận trong chương trình và kiểm tra xem nhãn đã đến như thế nào - đây là điều không thể thực hiện được

Ví dụ, chúng ta có thể viết lại ở trên như

number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"

Ở đây, có hai cách có thể để đến "điểm kết thúc" và chúng ta không thể biết cách nào đã được chọn. Khi các chương trình trở nên lớn, loại vấn đề này trở nên tồi tệ hơn và dẫn đến mã spaghetti

Để so sánh, dưới đây là cách bạn sẽ viết chương trình này bằng Python

number = input[]
if number >= 0:
   if number % 2 == 0:
       print "even"
   else:
       print "odd"
else:
   print "negative"
print "all done"

Tôi có thể xem xét một dòng mã cụ thể và biết nó đáp ứng những điều kiện nào bằng cách truy ngược lại cây gồm 15 khối mà nó nằm trong đó. Ví dụ, tôi biết rằng dòng

number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"
6 sẽ được chạy khi một
number = input[]
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"
7

Tìm hiểu cách chống lại trọng lực bằng cách nhảy trong phần này về lập trình trò chơi điện tử với mô-đun Pygame của Python

Qua

Seth Kenlon [Đội, Mũ đỏ]
|
Jess Weichler [Cựu sinh viên]

Ngày 5 tháng 12 năm 2019 . . %t phút đọc

Đăng ký hoặc Đăng nhập để thích

Hình ảnh của

Cicada Strange trên Flickr, CC BY-SA 2. 0

Trong phần trước của loạt bài này, bạn đã mô phỏng trọng lực, nhưng bây giờ bạn cần cung cấp cho người chơi cách chống lại trọng lực bằng cách nhảy

Một bước nhảy là một sự miễn trừ tạm thời khỏi trọng lực. Trong một vài khoảnh khắc, bạn nhảy lên thay vì rơi xuống, theo cách mà lực hấp dẫn đang kéo bạn. Nhưng một khi bạn đạt đến đỉnh điểm của cú nhảy, lực hấp dẫn lại tác động và kéo bạn trở lại mặt đất

Trong mã, điều này chuyển thành các biến. Trước tiên, bạn phải thiết lập các biến cho nhân vật người chơi để Python có thể theo dõi xem nhân vật đó có nhảy hay không. Sau khi nhân vật ma của người chơi đang nhảy, thì lực hấp dẫn lại tác dụng lên nhân vật nhân vật của người chơi, kéo nhân vật đó trở lại vật thể gần nhất

Đặt biến trạng thái nhảy

Bạn phải thêm hai biến mới vào lớp Người chơi của mình

  • Một để theo dõi xem người chơi của bạn có nhảy hay không, được xác định bằng việc người chơi của bạn có đứng trên mặt đất vững chắc hay không
  • Một để đưa người chơi trở lại mặt đất

Thêm các biến này vào lớp Người chơi của bạn. Trong đoạn mã sau, các dòng phía trên nhận xét là dành cho ngữ cảnh, vì vậy chỉ cần thêm hai dòng cuối cùng

        self.frame = 0
        self.health = 10
        # jump code below
        self.is_jumping = True
        self.is_falling = False

Những giá trị mới này được gọi là giá trị Boolean, là một thuật ngữ [được đặt tên theo nhà toán học George Boole] có nghĩa là đúng hoặc sai. Trong lập trình, đây là một kiểu dữ liệu đặc biệt chỉ ra rằng một biến đang "bật" hoặc "tắt". Trong trường hợp này, nhân vật anh hùng có thể rơi hoặc không rơi, và nó có thể nhảy hoặc không nhảy

Biến đầu tiên [is_jumping] được đặt thành True vì tôi đang sinh ra anh hùng trên bầu trời và cần anh ta rơi xuống đất ngay lập tức, như thể anh ta đang nhảy giữa chừng. Điều này hơi phản trực giác, bởi vì anh hùng không thực sự nhảy. Anh hùng vừa mới xuất hiện. Về mặt lý thuyết, đây là sự lạm dụng giá trị Boolean này và phải thừa nhận rằng mã "sạch" hơn để có các câu Đúng và Sai thực sự phản ánh thực tế. Tuy nhiên, tôi thấy việc để trọng lực giúp anh hùng tìm thấy mặt đất sẽ dễ dàng hơn là phải viết mã cứng vị trí xuất hiện ở mọi cấp độ. Nó cũng gợi lên những trò chơi đi cảnh cổ điển và mang lại cho người chơi cảm giác "nhảy vào" thế giới trò chơi. Nói cách khác, đây là một lời nói dối nhỏ ban đầu phục vụ chương trình, vì vậy hãy đặt nó thành True

Biến khác [is_falling] cũng được đặt thành True vì anh hùng thực sự cần phải xuống đất

trọng lực có điều kiện

Trong thế giới thực, nhảy là một hành động di chuyển chống lại trọng lực. Tuy nhiên, trong trò chơi của bạn, lực hấp dẫn chỉ cần được "bật" khi nhân vật anh hùng không đứng trên mặt đất cứng. Khi bạn luôn có trọng lực [trong Pygame], bạn có nguy cơ bị hiệu ứng nảy lên nhân vật anh hùng của mình vì trọng lực liên tục cố gắng ép anh hùng xuống trong khi va chạm với mặt đất chống lại. Không phải tất cả các công cụ trò chơi đều yêu cầu tương tác nhiều như vậy với trọng lực, nhưng Pygame không được thiết kế dành riêng cho những người chơi platformer [ví dụ: bạn có thể viết một trò chơi từ trên xuống] nên trọng lực không được quản lý bởi công cụ

Mã của bạn chỉ mô phỏng lực hấp dẫn trong thế giới trò chơi của bạn. Nhân vật anh hùng không thực sự rơi xuống khi nó dường như rơi xuống, nó đang được di chuyển bởi chức năng trọng lực của bạn. Để cho phép nhân vật anh hùng của bạn chống lại trọng lực và nhảy, hoặc va chạm với các vật thể rắn [như mặt đất và bệ nổi], bạn phải sửa đổi chức năng trọng lực của mình để chỉ kích hoạt khi anh hùng đang nhảy. Đoạn mã này thay thế toàn bộ hàm trọng lực mà bạn đã viết cho bài viết trước

    def gravity[self]:
        if self.is_jumping:
            self.movey += 3.2

Điều này khiến nhân vật anh hùng của bạn rơi thẳng xuống cuối màn hình, nhưng bạn có thể khắc phục điều đó bằng một số tính năng phát hiện va chạm trên mặt đất

Lập trình nền tảng vững chắc

Trong bài viết trước, một bản hack nhanh đã được thực hiện để giữ cho nhân vật anh hùng không rơi xuống cuối màn hình. Nó giữ anh hùng trên màn hình, nhưng chỉ bằng cách tạo ra một bức tường vô hình ở cuối màn hình. Việc sử dụng các đồ vật làm đồ vật sẽ dễ dàng hơn và bên cạnh đó, việc cho phép người chơi rơi khỏi thế giới như một hình phạt cho một cú nhảy không đúng lúc là điều khá phổ biến trong các trò chơi xếp hình.

Trong chức năng cập nhật của lớp Trình phát của bạn, hãy thêm mã này

        ground_hit_list = pygame.sprite.spritecollide[self, ground_list, False]
        for g in ground_hit_list:
            self.movey = 0
            self.rect.bottom = g.rect.top
            self.is_jumping = False  # stop jumping

        # fall off the world
        if self.rect.y > worldy:
            self.health -=1
            print[self.health]
            self.rect.x = tx
            self.rect.y = ty

Khối mã này kiểm tra các va chạm xảy ra giữa các nhân vật mặt đất và nhân vật anh hùng. Đây là nguyên tắc tương tự mà bạn đã sử dụng khi phát hiện kẻ thù tấn công anh hùng của mình

Trong trường hợp xảy ra va chạm, nó sử dụng thông tin dựng sẵn do Pygame cung cấp để tìm phần dưới cùng của hero sprite [tự. trực tràng. dưới cùng], và đặt vị trí của nó lên trên cùng của mặt đất sprite [p. trực tràng. đứng đầu]. Điều này tạo ảo giác rằng nhân vật anh hùng đang "đứng" trên mặt đất và ngăn không cho nó rơi xuống đất.

Nó cũng tự đặt ra. is_falling về 0 để chương trình biết rằng anh hùng không ở giữa bước nhảy. Ngoài ra, nó tự đặt. movey thành 0 để anh hùng không bị lực hấp dẫn kéo [đó là một điểm đặc biệt của vật lý trò chơi mà bạn không cần phải tiếp tục kéo một nhân vật về phía Trái đất sau khi nhân vật đã được tiếp đất]

Thêm tài nguyên Python

  • IDE là gì?
  • bảng ăn gian. Trăn 3. 7 cho người mới bắt đầu
  • Khung GUI Python hàng đầu
  • Tải xuống. 7 thư viện PyPI thiết yếu
  • Nhà phát triển mũ đỏ
  • Nội dung Python mới nhất

Câu lệnh if ở cuối phát hiện xem người chơi có xuống dưới mặt đất hay không; . như các giá trị bắt đầu nhanh chóng và dễ dàng. ] Điều này giả định rằng bạn muốn người chơi của mình mất điểm máu và hồi sinh sau khi rơi khỏi thế giới. Điều đó không thực sự cần thiết;

Nhảy trong Pygame

Mã để nhảy xảy ra ở một số nơi. Đầu tiên, tạo một hàm nhảy để "lật" các giá trị is_jumping và is_falling

    def jump[self]:
        if self.is_jumping is False:
            self.is_falling = False
            self.is_jumping = True

Việc nâng cấp thực tế từ hành động nhảy xảy ra trong chức năng cập nhật của lớp Người chơi của bạn

        if self.is_jumping and self.is_falling is False:
            self.is_falling = True
            self.movey -= 33  # how high to jump

Mã này chỉ thực thi khi biến is_jumping là True trong khi biến is_falling là False. Khi các điều kiện này được thỏa mãn, vị trí Y của nhân vật anh hùng được điều chỉnh thành 33 pixel trong "không khí". Đó là âm 33 vì số thấp hơn trên trục Y trong Pygame có nghĩa là nó ở gần đầu màn hình hơn. Đó thực sự là một bước nhảy. Bạn có thể điều chỉnh số pixel để nhảy thấp hơn hoặc cao hơn. Mệnh đề này cũng đặt is_falling thành True, điều này ngăn một bước nhảy khác được đăng ký. Nếu bạn đặt nó thành Sai, một hành động nhảy sẽ tự kết hợp, bắn anh hùng của bạn vào không gian, điều này rất thú vị để chứng kiến ​​nhưng không lý tưởng cho trò chơi

Gọi hàm nhảy

Vấn đề là không có gì trong vòng lặp chính của bạn đang gọi chức năng nhảy. Bạn đã tạo một phím bấm giữ chỗ cho nó từ rất sớm, nhưng ngay bây giờ, tất cả những gì phím nhảy làm là in nhảy tới thiết bị đầu cuối

Trong vòng lặp chính của bạn, hãy thay đổi kết quả của Mũi tên lên từ in câu lệnh gỡ lỗi thành gọi hàm nhảy

________số 8

Nếu bạn muốn sử dụng Phím cách để nhảy, hãy đặt phím thành pygame. K_SPACE thay vì pygame. K_UP. Ngoài ra, bạn có thể sử dụng cả hai [dưới dạng câu lệnh if riêng biệt] để người chơi có lựa chọn

Hạ cánh trên một nền tảng

Cho đến nay, bạn đã xác định điều kiện phản trọng lực khi người chơi sprite chạm đất, nhưng mã trò chơi giữ nền tảng và mặt đất trong các danh sách riêng biệt. [Cũng như rất nhiều lựa chọn được đưa ra trong bài viết này, điều đó không thực sự cần thiết và bạn có thể thử nghiệm coi mặt đất chỉ là một nền tảng khác. ] Để cho phép nhân vật người chơi đứng trên một nền tảng, bạn phải phát hiện va chạm giữa nhân vật người chơi và nhân vật nền tảng, đồng thời ngăn trọng lực "kéo" nhân vật đó xuống dưới

Đặt mã này vào chức năng cập nhật của bạn

        plat_hit_list = pygame.sprite.spritecollide[self, plat_list, False]
        for p in plat_hit_list:
            self.is_jumping = False  # stop jumping
            self.movey = 0

            # approach from below
            if self.rect.bottom

Chủ Đề