1. ホーム
  2. Python

パイソン] Python パイソンミニゲーム - 欲張りスネークアドベンチャー

2022-02-21 05:30:30
<パス

記事目次

I. 序文

前回ブログを更新してからずいぶん時間が経ってしまい、また更新しないとブログの習慣がダメになりそうな気がしています、ははは。昨年9月に入ってからは、表学期の期末試験、研究室プロジェクトの申請や新プロジェクトの設計、コースセット研修など、今期は3年後期の研究室業務の引き継ぎから大学院への進学準備と、なかなかブログを書く時間が取れなかったのです。好きな人が好きになって、集めて、注目してくれればいいんですけどね、ははは。

2つ目は、ヘビの冒険ミニゲーム

I. ゲームの紹介

1.1 ゲーム操作とゲームルール
(1) ゲームが始まったら、キーボードの上下左右のキーで蛇の動きを操作して、餌を探します。
(2) ヘビが餌を食べるたびに、体長が1単位ずつ増えていきます。
(3) 通常モードでは、ヘビが壁に触れたり、自分を噛んだりすると、ゲームオーバーになります。
(4) 壁抜けモードでは、スネークは壁を通り抜けることができますが、自分を噛むとゲームオーバーになります。

II. ゲーム全体のデザイン

2.1 ゲームデザイン全体のフレームワーク図

III. コンパイル言語と使用ライブラリファイルの説明

3.1 Python言語
Pythonは、クロスプラットフォームなコンピュータ・プログラミング言語です。元々、自動化スクリプト(シェル)を書くために設計されたPythonは、非常に簡潔で分かりやすい構文を持っており、バージョンの更新や言語への新機能追加に伴い、スタンドアロンの大規模プロジェクトに使用されることが多くなってきています。現在、Python言語をベースとした技術は急速に発展しており、ユーザー数の劇的な増加や関連リソースの増加も見られます。
3.2 pygame ライブラリ
Pygameは、クロスプラットフォームのPyth、Pete ShinnersによるGNU Lesser General Public Licenseの下でのPygameです。pygameは、グラフィックス、サウンドを含んでいます。SDLをベースに構築されており、機械語やアセンブリ言語などの低レベル言語に縛られることなく、リアルタイムのビデオゲーム開発が可能です。必要なゲーム機能やコンセプト(主にグラフィック面)をゲームロジック自体に完全に還元するという考えに基づき、全てのリソース構造をPythonなどの高水準言語から提供することが可能である。
3.3 ランダムライブラリ
ランダムは乱数を生成するライブラリ、すなわち乱数発生器です。ランダムは複雑な方法で計算された擬似乱数やシーケンス値を生成するため、演算ごとに異なるシード値を必要とします。シード値が異なれば、得られるシーケンス値も異なる。
3.4 タイムライブラリ
timeライブラリは、Pythonで時間を扱うための標準ライブラリで、コンピュータの時間表現、システム時間の取得と出力のフォーマット、システムレベルの精度でのタイミングの提供、またプログラムのパフォーマンス解析に使用されます。
3.5 sys ライブラリ
sys.exit([ arg ]) は、プログラムを終了するときに使用します。 sys.exit(n) は、プログラムを終了し、通常の終了時には exit(0) となります。これはSystemExit例外を発生させることで行われるため、finally文のtryの句で指定されたクリーンアップ処理に続き、外側の終了試行を横取りすることができます。オプションの引数argは、終了状態を示す整数(デフォルトは0)または他のタイプのオブジェクトであることができます。整数の場合、0は正常終了とみなされ、0以外の値は異常終了とみなされます。

IV. ゲームの設計と実装

4.1 ゲーム全体のデザイン

  • 1. 頭部と胴体部を含む蛇オブジェクトを定義し、頭部は別々に設定し、胴体はリストを使って格納します。
    2. フードオブジェクトの定義。フードオブジェクトの初期化、ランダムな色とランダムな位置の設定など。
    3. 3. 初期化インターフェースを定義し、テキストを"Normal Mode", "Wallable Mode", "Exit" に設定し、プレイヤーが選択できるよう3つのボタンを設置します。
    4. 4. ゲームウィンドウの表示、メインループ、スネークデスの判定などの設定を含む、通常モードを定義します。
    5.ゲームウィンドウの表示、メインループ、ヘビの死亡判定などの設定を含む、ウォーラブルモードを定義する。
    6. 6. ゲーム終了ウィンドウを定義します。ウィンドウの表示と最終スコアの表示に関する設定を含みます。

4.2 主な機能の説明

  • 4.2.1 new_food()関数
    フードオブジェクトの初期化関数には、ヘビの頭の座標が渡されます。蛇が餌を食べると、この関数によって新しい餌が生成されます。新しく生成された餌の座標が蛇の頭の座標と同じであれば、新しい座標が再生成される。
  • 4.2.2 start_game()関数
    ノーマルモードのメインループ関数で、ヘビと餌の初期化、プレイヤーが操作するヘビの移動、頭身判定の更新、スコア統計がノーマルモードで実装されています。
  • 4.2.3 die_snake()関数
    通常モードでは、ヘビ死亡関数は、ヘビの頭と胴体の座標データを参照する形で渡されます。この関数は、ブーリアン変数 die_flag に、ヘビが死んだ場合は Ture を、死ななかった場合は False をセットします。ヘビの体のリストを反復することで、体の座標が頭の座標と同じかどうかを判断し、同じであれば、ヘビは自分を噛んで死んだと判断します。また、蛇が壁にぶつかったかどうかを判断し、蛇の頭のx座標とy座標がウィンドウの幅と高さを超えているかどうかを判断し、超えていれば蛇は死んだと判断します。
  • 4.2.4 start_kgame()関数
    壁抜けモードのメインループ関数で、壁抜けモードでのヘビと餌の初期化、プレイヤーが操作するヘビの動き、頭と体の判定更新、スコア統計が実装されています。
  • 4.2.5 through_snake()関数
    この関数は,スルーウォールモードでのヘビの死亡を判定するもので,フォームパラメータにヘビの頭部と胴体の座標データを渡します.この関数は,ブーリアン変数 die_flag に,ヘビが死んでいれば Ture,死んでいなければ False をセットし,ヘビの保存リストを走査して,ボディ座標がヘッド座標と同じであるかどうかを判定します.
  • 4.2.6 show_end()関数
    ゲーム終了時の終了画面設定関数。この関数では、終了画面のフォームが初期化され、プレイヤーの最終スコアがフォームに表示され、change関数でpygameライブラリのquitメソッドが呼ばれ、ライブラリが動作を停止します。
  • 4.2.7 into_game()関数
    この関数は、最初のゲームインターフェースフォームを初期化します。このインターフェイスフォームでは、テキストを "通常モード", "壁掛けモード", 3回のクリックで "終了" に設定し、ループを設定してボタン関数 (6.2.8 参照)を呼び出します。詳しくは6.2.8参照)を呼び出し、プレイヤーのクリックを待ちます。
  • 4.2.8 button() 関数
    ゲームの初期インターフェースにあるボタンリスナー関数で、この関数の中でプレイヤーのマウスクリックイベントとキーボード入力イベントをリスニングする。また、プレイヤーの選択に応じて、ボタンのトリガー関数を実行します。つまり、"Normal Mode"ボタンをクリックすると、ノーマルモードのメインループ関数が実行されるというように。

V. モジュールのコード構造を実行する

runモジュールでは、pygameライブラリの初期化、ゲームBGMの設定、表示ウィンドウの各パラメータの設定、ゲームインターフェイスの初期表示設定を行っており、具体的な結果コードは以下の通りです。

VI. ゲームの実行テスト(スクリーンショット)

  1. 初期ゲーム選択画面

  2. ノーマルモードのランタイムインターフェース

  3. 壁貫通モードで動作させるためのインターフェイス

  4. ゲームオーバー画面

    VII. ゲームのフルコード

import sys
import time
import pygame
from random import *
# Position class, through its constructor, set x and y
class Position(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
# Generate a random food
def new_food(head):
    while True:
        new_food = Position(randint(0, 48) * 20, randint(0, 29) * 20)
        # Determine if the newly generated thing overlaps with the snake's head, if it does, don't create a key
        if new_food.x ! = head.x and new_food.y ! = head.y:
            break
        else:
            continue
    return new_food
# draw, draw snake, food in the form
# color: color, position: coordinates
def rect(color, position):
    pygame.draw.circle(window, color, (position.x, position.y), 10)
# Initial screen and in-game point difference when exiting the game
def exit_end():
    pygame.quit()
    quit()
# The settings for the form that shows the score at the end of the game
def show_end():
    # Design the window
    # Define the window size
    small_window = pygame.display.set_mode((960, 600))
    init_background = pygame.image.load("image/init_bgimg.jpg")
    small_window.blit(init_background, (0, 0))
    # Define the title
    pygame.display.set_caption("Greedy Snake Adventure")
    # Define the background image
    font = pygame.font.SysFont("simHei", 40)
    fontsurf = font.render('Game over! Your score: %s' % score, False, black)
    small_window.blit(fontsurf, (250, 200))
    pygame.display.update()
    time.sleep(2)
    pygame.quit()
    sys.exit()
# Normal mode death settings
# head: snake head, snake_body: snake body
def die_snake(head, snake_body):
    # Define flag, default is false, true determines snake touches itself and dies
    die_flag = False
    # Iterate through the list of snake positions, starting with the first one (the 0th position is the snake's head)
    for body in snake_body[1:]:
        # If head xy and body xy are equal, then collision is determined and flag is set to ture
        if head.x == body.x and head.y == body.y:
            die_flag = True
    # If xy of snake head is outside the display window or flag is true, then display the end screen and exit the game
    if head.x < 0 or head.x > 960 or head.y < 0 or head.y > 600 or die_flag:
        pygame.mixer.music.stop()
        show_end()
# Normal mode body settings
def start_game():
    # Define the global variable that holds the score
    global score
    global color
    color = (randint(10, 255), randint(10, 255), randint(10, 255))
    # Define the variable that holds the direction of the player's keyboard input movement, initially to the right
    run_direction = "right"
    # Define the variable that holds the direction of the snake's movement, initially the direction of the player's keystrokes
    run = run_direction
    # Instantiate the snake's head, body, and food objects
    head = Position(160, 160)
    # Initialize snake body length to 3 units
    snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]
    # Initialize the food position
    food = Position(300, 300)
    # Dead loop
    while True:
        window.blit(background, (0,0))
        # Listen to the player's keyboard input for the direction of movement value and convert it to up, down, right or left based on the input for easy calling in the program
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                show_end()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    run_direction = "UP"
                elif event.key == pygame.K_RIGHT:
                    run_direction = "RIGHT"
                elif event.key == pygame:
                    run_direction = "left"
                elif event.key == pygame:
                    run_direction = "down"
        # food
        rect(color, food)
        # Snake head
        rect(black, head)
        # snake_body
        for pos in snake_body:
            rect(white, pos)
        # Determine if the original direction of snake movement and the player's keyboard input violates the normal movement
        if run == "up" and not run_direction == "down":
            run = run_direction
        elif run == "down" and not run_direction == "up":
            run = run_direction
        elif run == "left" and not run_direction == "right":
            run = run_direction
        elif run == "right" and not run_direction == "left":
            run = run_direction
        # Insert the snake's head position into the snake body list
        snake_body.insert(0, Position(head.x, head.y))
        # Based on the play

III. 概要

これはシンプルなPythonのミニゲームで、正確なコードはブログに掲載されています。それから、関連する技術文書、BGM、フォント、コードなど。また、圧縮してcsdnのダウンロードコーナーにアップロードしました。
https://download.csdn.net/download/weixin_45087775/16809231?spm=1001.2014.3001.5503