初心者がpython3とpygameでソートアルゴリズムを可視化してみる【バブルソート】【インサーションソート】
バブルソート
前回に引き続いて調子に乗って別のソートアルゴリズムも試してみました。
まぁありがちですが。。。
バブルソートは隣り合う要素の値を比較して条件に応じた交換をしてゆき。
最大値(または最小値)を逐次右端(または左端)に寄せていくことによりソートを実現します。
大きい順(または小さい順に)順次値が泡のように浮いていくのでバブルソートと呼ばれます。
詳しいことは、ググるとたくさん載ってるのでこの辺でw
効率については、悪いほうのアルゴリズムです。
とりあえず、pythonだと実装めっちゃ簡単でびっくりしました。
(まぁ、速度はC/C++の方が早いんだろうけど)
何がって、値の交換が
a, b = b, a |
---|
で書けるってのがでかいですね。
バブルソートやインサーションソートのようにインデックスベースで入れ替えが起こる処理では、楽できるね。
初心者がpython3とpygameでソートアルゴリズムを可視化してみる【単純選択ソート】
python3とpycharmとpygameで画像表示してみた 第3回
画像を拡大縮小してみる
使うもの
- 前回のプロジェクト
- 前回のスクリプト
- 前回の画像
前回までで、画像を表示できたのですが、画像を張り付けるときに拡大縮小をしてみます。
画像自体のサイズを変えてもいいのですが、今回は読み込んだ画像をプログラムの中で拡大縮小してみました。
使うモジュール
pygame.transformモジュール |
---|
を使います。
pygame.taransformモジュールには、いくつか拡大縮小ができるメソッドがあります。
モジュール | 機能 | 備考 |
---|---|---|
pygame.taransform.scale | 指定Surfaceの拡大縮小を行う | 速さ重視で拡大縮小 |
pygame.transform.smoothscale | 指定Surfaceの拡大縮小を行う | 見た目重視で拡大縮小*1 |
それぞれ引数は、(surface, (width, height)) で、変換後のsurfaceを返すメソッドになっています。
スクリプトを変更
今回は、pygame.transform.smoothscaleメソッドを使って拡大縮小してみます。
こっちのメソッドにした意味は。。。特にないです。なんとなく。
mainの中をこう変更します。
やっていることは、
- imagerectに元画像の幅と高さを記録
- ratioに拡大縮小率を決定
- ratioとimagerect.widthを使って変換後の画像幅を計算
- ratioとimagerect.heightを使って変換後の画像高を計算
- 元画像(image)を(imagerect.width, imagerect.height)の大きさに変換
となっています。
実行例(ratio=0.2)
ちゃんと縮んでますね!
実行例(ratio=2.0)
こちらもちゃんと拡大されています!
python3とpycharmとpygameで画像表示してみた 第2回
pycharm(IDE)+python3(言語)+pygame(ライブラリ)で画像表示 第2回
プロジェクトを作成
画像表示の練習用のプロジェクトを作成
とは言いながら、ぶっちゃけ前回の使いまわし or 前回のプロジェクトにスクリプト*1を追加でいい思います。
少なくとも、スクリプトは前回のものに追加していきます。
(ここでは、プロジェクト名:mygame02、スクリプト名:mygame02.pyとしました*2)
画像を用意
自分で用意、またはWebから、利用可能な画像を用意します。
pygameの公式ガイドによると、利用可能な画像形式は(日本語訳はちょい適当です)。。。
pygame.image.loadコマンドで読み込み可能な画像形式は、基本的に非圧縮BMP形式のみ。
ほかの画像形式をサポートしているバージョン(なんだそれ?)のみ、以下の形式が読み込み可能画像の保存は、以下の形式のみに対応しています。
んーと、先日インストールしたばかりなので、きっとBMP以外の画像形式でも読めるでしょうという見切り発車の元、PNG形式の画像を用意してみました。
*今回使った画像情報*
画像名 | char1.png |
---|---|
画像形式 | PNG |
サイズ | 369x480 |
これをスクリプトがあるフォルダに移動します。これでやっとこ準備完了かなぁ。
所感
前回のところまで、できていれば割と簡単に画像の表示はできるみたいな気がした。
折角なんで、今回使ったクラス?モジュール?のちょっとした開設を付け加えておこうかと思います。
モジュール名 | 機能 | 備考 |
---|---|---|
pygame.image.load | 指定したファイル名の画像を読み込む | 読み込んだ画像から新しいSurfaceを生成 |
pygame.image.save | 指定したSurfaceを画像として保存します | 指定なしはTGA形式の画像に保存*3 |
pygame.image.get_extend | 規定以外のファイルが使えるか確認 | 結果はbooleanで返ってくる |
pygame.image.tostring | 画像を文字形式に変換する | 今は省略 |
pygame.image.fromstring | 画像を表す文字形式のデータからSurfaceを生成 | 今は省略 |
pygame.image.frombuffer | 文字列形式の画像情報から直接Surfaceを生成 | 今は省略 |
読み込まれた画像はSurfaceに変換されます。Surfaceはpygameで画像の情報をメモリ内で保存する形式だと思えばいいのかと。
様々なフォーマットを読み込んでも、pygame内ではSurfaceって共通形式で扱える!かな。
詳しいことは後でやる気あったら書こうかのぉ。
また、画面に画像を張り付けるコマンド
screen.blit(image, (0, 0)) |
---|
imageは画像から生成したSurfaceです。後ろの引数は、表示位置*4で、画像の原点をスクリーンのどこへ張り付けるか、っていう指定。
つぎは、画像を動かしてみようかな。
へば、また!
python3とpycharmとpygameで画像表示してみた 第1回
pycharm(IDE)+python3(言語)+pygame(ライブラリ)で画像表示
環境を整える
pycharmとpython3
pycharmは普通にダウンロードしてインストールしたものを使います。特に何も設定していません。
www.jetbrains.com
python3はAnacondaのものを使いました。こちらも特に何も設定していません。
(じじいなのでAnacondaのupdateでちょい嵌りました。原因は、普通のwindows power shellで実行してたこと(;'∀')、スタートメニューからAnaconda PowerShell Promptから実行するとすんなりいきました)
www.python.jp
pygameのインストール
これも、じじいなのでちょい嵌りました。じじいの環境では、pycharmdでプロジェクトを作成し、そのプロジェクトにProject Interpreterから、ライブラリを追加する方法ではうまくいきませんでした。(じじいの環境では。。。)
そこで、Anaconda PowerShell Promptからインストールする方法(きっとが*1でこいづが普通なんだべな?)で試してうまくいきました。
python -m pip install pygame
プロジェクトの作成 in Pycharm
上部のメニューから FILE→ New Project でプロジェクトを作成します。(ここでもちょい嵌りやんした)
①プロジェクト名を決めます。(ここは通常通りで問題ないよね)
②virtual envの設定(Project Interpreter: New Virtualenv environment)の"Inherit global site-packages"にチェック(これやらないと、仮想環境にさっきインストールしたpygameが反映されない?)
③右下Createボタンをクリック
これで、問題なくプロジェクトができるはず!
サンプルプログラムを動かしてみる
ソースコードの入力
画面右側のソースコード入力画面に、一番シンプルそうなサンプルを入力してみます。
import pygame from pygame.locals import * import sys def main(): pygame.init() # ライブラリの初期化 screen = pygame.display.set_mode((600, 400)) # 画面サイズを指定 pygame.display.set_caption("Game Test") # ウィンドウタイトルを設定 while True: screen.fill((203, 255, 135)) # 画面を指定色(R,G,B)で塗りつぶし pygame.display.update() # 画面の更新 for event in pygame.event.get(): # 終了イベントの処理 if event.type == QUIT: pygame.quit() sys.exit() if __name__ == "__main__": # このスクリプトがトップで実行されたときのみmainを呼ぶ main()
んー。結構長い。。。