パイソン] Python パイソンミニゲーム - 欲張りスネークアドベンチャー
記事目次
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. ゲームの実行テスト(スクリーンショット)
-
初期ゲーム選択画面
-
ノーマルモードのランタイムインターフェース
-
壁貫通モードで動作させるためのインターフェイス
-
ゲームオーバー画面
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
関連
-
python で word, excel, csv, json ファイルの読み書きをする。
-
Python組み込み関数 - min関数とmax関数 - 詳細解説
-
ImportError: pandas という名前のモジュールがない 問題が解決される
-
TypeError: 'numpy.ndarray' オブジェクトが呼び出し可能でないエラー処理
-
TypeError: バイトライクオブジェクトで文字列パターンを使用できない
-
Python error TypeError: 'type' object is not subscriptable
-
tkinter モジュールを使った Python 倉庫番ゲーム
-
Python2.7のエンコード問題:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position... 解決方法
-
pygalマッピング "AttributeError: 'NoneType' オブジェクトには 'decode' という属性がありません"
-
Pythonです。AttributeError: module 'numpy' has no attribute 'dtype' 問題が解決されました。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Error: cannot run program--createprocess error=2,The system cannot find specified file.
-
仮想環境を作成するコマンドが見つからない virtualenv: コマンドが見つからない
-
ModuleNotFoundError: ConfigParser' という名前のモジュールはありません。
-
Pythonのエラーです。ModuleNotFoundError: pygame'という名前のモジュールはありません。
-
ImportError を解決します。pandas をインストールした後に 'pandas' という名前のモジュールがない。
-
import urllib.parse ImportError: parse という名前のモジュールがありません
-
プログラム実行中にPythonの例外が発生しました。TypeError: 'NoneType' オブジェクトは呼び出し可能ではありません。
-
Pythonのjson.loadsで文字列のデコードに失敗しました。ValueError: JSONオブジェクトをデコードできませんでした
-
Python ネットワークリクエストのエラー "ConnectionRefusedError: [WinError 10061] ターゲットコンピュータがアクティブに拒否したため接続できません"
-
Python Numpy.ndarray ValueError: 代入先が読み取り専用です。