ホームページ >バックエンド開発 >Python チュートリアル >Python でタートルを使ったボールゲームを実装する方法
turtle は Python に組み込まれた描画モジュールです。実際、描画だけでなく、簡単なミニゲームの作成にも使用できます。簡単なGUIプログラムを作成するためのGUIモジュールです。
この記事では、turtle モジュールを使用して簡単なゲームを作成します。このプログラムの作成プロセスを通じて、turtle モジュールに関する私の洞察について話します。
本格的で興味深いゲームを書きたい場合は、pygame を探してください。この記事で Turtle を使用してゲームを作成する目的は、Turtle の機能を深く理解することです。
turtle モジュールの使用方法は比較的簡単なので、基本的な方法については説明しません。ここでは、turtle モジュールの少し難しい部分や見落とされている部分についてのみ説明します。
プログラムを実行すると、キャンバス上に赤いボールと多くの緑と青のボールが表示されます。
最初は赤いボールが一定の方向に移動しますが、上下左右の方向キーを押すことで赤いボールの移動方向を制御できます。
緑と青のボールは、キャンバス上で初期デフォルトの方向に移動します。
赤いボールが緑のボールに触れると赤いボールは大きくなり、赤いボールが青いボールに触れると赤いボールは小さくなります。
赤いボールが一定のしきい値まで縮むと、ゲームは終了します。
このプログラムでは、turtle、random、math モジュールを使用する必要があります。 , まずインポートします。
import turtle import random import math ''' 初始化游戏界面大小 ''' # 游戏区域的宽度 game_wid = 600 # 游戏区域的高度 game_hei = 400 # 砖块的大小,以及每一个小球初始大小 cell = 20 # 红球初始大小 red_size = cell # 红色小球 red_ball = None # 存储绿色小球的列表 green_balls = [] # 存储蓝色小球的列表 blue_balls = [] # 红色小球的方向 当前方向 0 向右,90 向上 180 向左 -90 向下 dir = 0
上記のコードの説明:
赤いボールは 1 つだけあり、変数 red_ball
によって保存されます。移動中にサイズを変更します。 , red_size
サイズを保存します。
緑と青のボールがたくさんあります。ここでは 2 つのリストを使用して green_balls
と blue_balls
を保存します。
ランダム位置計算機能: ボールの初期位置をランダムに生成します。
''' 随机位置计算函数 ''' def rand_pos(): # 水平有 30 个单元格,垂直有 20 个单元格 x = random.randint(-14, 14) y = random.randint(-9, 9) return x * cell, y * cell
指定された塗りつぶし色で小さな正方形を描画します: ゲームには、多数の小さな正方形に囲まれた仮想領域があります。
''' 绘制一个指定填充颜色的正方形 填充颜色可以不指定 ''' def draw_square(color): if color is not None: # 的颜色就填充 turtle.fillcolor(color) turtle.begin_fill() for i in range(4): turtle.fd(cell) turtle.left(90) if color is not None: turtle.end_fill()
カスタム ブラシの形状:
タートルを使用してゲームを作成するという基本的なアイデア:
タートルをインポートするとき
module は、キャンバス上に描画できるブラシがあることを意味し、ブラシのデフォルトの形状は小さなカメです。
この記事では、このデフォルト ブラシを メイン ブラシ と呼びます。turtle
モジュールの turtle.Turtle()
クラスを使用して、さらに多くのブラシを作成できます。 `turtle モジュールによって提供される
turtle.register_shape(name,shape)` メソッドを使用して、各ブラシのブラシ形状をカスタマイズできます。
上で述べたように、turtle
を使用してゲームをデザインするための鍵となります。
強調:
メイン ブラシを通じてさらにブラシを作成し、各ブラシに異なる形状を設定します。これはゲームを書く上での鍵です。ゲーム内のすべてのキャラクターは基本的に絵筆です。設計した軌跡に従ってキャンバス上を移動するように絵筆を制御するだけです。
このゲームでは、赤、緑、青の 3 色のボールが丸い絵筆です。
ブラシ リスト:
赤いボールのペイント ブラシ。
N 緑色のボール ペイント ブラシ。
N 個の青いボール ペイント ブラシ。
''' 自定义画笔形状 name:画笔名称 color:可选项 ''' def custom_shape(name, size): turtle.begin_poly() turtle.penup() turtle.circle(size) turtle.end_poly() cs = turtle.get_poly() turtle.register_shape(name, cs)
turtle.register_shape(name,shape)
メソッドパラメータの説明:
##name: カスタムシェイプの名前。
形状: 開発者によって描画された形状。
開発者が描いたグラフィックスのどの部分がブラシ形状として使用されますか?
turtle.begin_poly() によって記録された最初のポイントと Turtle.end_poly() によって記録された最後のポイントの間の形状がブラシの形状として使用されます。cs = Turtle.get_poly() は、新しく描画されたシェイプを取得し、
turtle.register_shape(name, cs) を使用してブラシを登録するものとして理解できます。この形状はいつでも使用できます。
上記のコードは、円の描画プロセスを記録し、円形のブラシ形状を作成します。
特定の位置への移動関数:
この関数は、移動中に跡を残さずに特定のブラシを指定された位置に移動するために使用されます。''' 移到某点 ''' def move_pos(pen, pos): pen.penup() pen.goto(pos) pen.pendown()
パラメータの説明:
pen: ブラシ オブジェクト。
#pos: 移動先。
キーボード イベント機能の登録:
ユーザーはキーボードの方向キーを使用して赤いボールの方向を変更できます。turtle
模块提供有很多事件,可以以交互式的方式使用turtle
。turtle
模块中主要有 2 类事件:键盘事件、点击事件。因 turtle
的工作重点还是绘制静态图案上,其动画绘制比较弱,所以它的事件少而简单。
''' 改变红色小球 4 方向的函数, 这些函数只有当使用者触发按键后方可调用,故这些函数也称为回调函数。 ''' def dir_right(): global dir dir = 0 def dir_left(): global dir dir = 180 def dir_up(): global dir dir = 90 def dir_down(): global dir dir = -90 ''' 注册键盘响应事件,用来改变红球的方向 ''' def register_event(): for key, f in {"Up": dir_up, "Down": dir_down, "Left": dir_left, "Right": dir_right}.items(): turtle.onkey(f, key) turtle.listen() ''' 当红色小球遇到墙体后,也要修改方向 ''' def is_meet_qt(): global dir if red_ball.xcor() < -220: dir = 0 if red_ball.xcor() > 240: dir = 180 if red_ball.ycor() > 140: dir = -90 if red_ball.ycor() < -120: dir = 90
红色的小球在 2 个时间点需要改变方向,一是使用者按下了方向键,一是碰到了墙体。
绘制墙体函数:
墙体是游戏中的虚拟区域,用来限制小球的活动范围。
Tips: 墙体由主画笔绘制。
''' 绘制四面的墙体 ''' def draw_blocks(): # 隐藏画笔 turtle.hideturtle() # 上下各30个单元格,左右各 20 个单元格 for j in [30, 20, 30, 20]: for i in range(j): # 调用前面绘制正方形的函数 draw_square('gray') turtle.fd(cell) turtle.right(90) turtle.fd(-cell) # 回到原点 move_pos(turtle, (0, 0))
创建小球画笔: 此函数用来创建新画笔。本程序中的红色、蓝色、绿色小球都是由此函数创建的画笔,且外观形状是圆。
def init_ball(pos, color, shape): # 由主画笔创建新画笔 ball = turtle.Turtle() ball.color(color) # 指定新画笔的形状,如果不指定,则为默认形状 ball.shape(shape) # 移到随机位置 move_pos(ball, pos) # 移动过程要不显示任何轨迹 ball.penup() return ball
参数说明:
pos
: 创建画笔后画笔移动的位置。
color
:指定画笔和填充颜色。
shape
: 已经定义好的画笔形状名称。
创建绿色、蓝色小球:
def ran_gb_ball(balls, color): # 随机创建蓝色、绿色小球的频率, # 也就是说,不是调用此函数就一定会创建小球,概率大概是调用 5 次其中会有一次创建 ran = random.randint(1, 5) # 随机一个角度 a = random.randint(0, 360) # 1/5 的概率 if ran == 5: turtle.tracer(False) # 每一个小球就是一只画笔 ball = init_ball(rand_pos(), color, 'ball') ball.seth(a) # 添加到列表中 balls.append(ball) turtle.tracer(True)
为什么要设置一个概率值?
适当控制蓝色、绿色小球的数量。
turtle.tracer(False)
方法的作用:是否显示画笔绘制过程中的动画。False
关闭动画效果,True
打开动画效果。
这里设置为 False
的原因是不希望用户看到新画笔创建过程。
蓝色、绿色小球的移动函数:
蓝色、绿色小球被创建后会移到一个随机位置,然后按默认方向移动。
def gb_ball_m(balls): s = 20 a = random.randint(0, 360) r = random.randint(0, 10) for b in balls: b.fd(s) if b.xcor() < -220 or b.xcor() > 240 or b.ycor() > 140 or b.ycor() < -120: b.goto(rand_pos())
当小球碰到墙体后让其再随机移到墙体内部(简单粗粗暴!!)。
红色球是否碰到了蓝色或绿色小球:
此函数逻辑不复杂,计算小球相互之间的坐标,判断坐标是否重叠。
''' 红球是否碰到绿、蓝球 ''' def r_g_b_meet(): global red_size # 红色小球的坐标 s_x, s_y = red_ball.pos() # 迭代绿色小球,蓝色小球列表 for bs in [green_balls, blue_balls]: for b in bs: # 计算蓝色或绿色小球坐标 f_x, f_y = b.pos() # 计算和红色球之间的距离 x_ = math.fabs(s_x - f_x) y_ = math.fabs(s_y - f_y) # 碰撞距离:两个球的半径之和 h = cell + red_size if 0 <= x_ <= h and y_ >= 0 and y_ <= h: if b in green_balls: # 遇到绿色球红球变大 red_size += 2 if b in blue_balls: # 遇到蓝色球红球变大 red_size -= 2 # 关键代码 custom_shape('red', red_size) return True return False
上述代码整体逻辑不复杂。而 custom_shape('red', red_size)
是关键代码,因红色小球的半径发生了变化,所以需要重新定制红色小球的外观形状,这样才能在画布上看到半径变化的红色小球。
怎样让小球动起来?
每隔一定时间,让小球重新移动。 turtle.ontimer(ball_move, 100)
是让小球动起来的核心逻辑,每隔一定时间,重新移动红、蓝、绿外观如圆形状的小球。
def ball_move(): red_ball.seth(dir) red_ball.fd(40) # 检查红球是否碰到墙体 is_meet_qt() # 随机创建绿色小球 ran_gb_ball(green_balls, 'green') # 随机创建蓝色小球 ran_gb_ball(blue_balls, 'blue') # 让绿色小球移动 gb_ball_m(green_balls) # 让蓝色小球移动 gb_ball_m(blue_balls) # 检查红球是否碰到蓝色、绿色小球 r_g_b_meet() # 定时器 turtle.ontimer(ball_move, 100)
主方法:
if __name__ == "__main__": # 关闭动画效果 turtle.tracer(False) # 注册事件 register_event() # 定制 2 种画笔形状 for name in ['red', 'ball']: custom_shape(name, cell) # 主画笔移动墙体的左上角 move_pos(turtle, (-300, 200)) # 绘制墙体 draw_blocks() red_ball = init_ball(rand_pos(), 'red', 'red') turtle.tracer(True) # 让红球移动起来 ball_move() # turtle.done()
以上为此游戏程序中的每一个函数讲解。
运行后,可以控制红色小球,当遇到绿色球和蓝色球时,红色球体会变大或变小。
以上がPython でタートルを使ったボールゲームを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。