[Python]迷路プログラム用の新たなエディタを作ってみた
前に作ったプログラムの迷路プログラムの床パターンを作る新たなエディタを作ってみました。Excelで作り、Pythonに貼り付けるということをできるようにしました。
前回の迷路
tamakon3.hatenablog.com
メリット
- Excelで作るため""を削除する手間がありますが、視覚的に作れるので見やすい
- 貼り付けるのがそこそこ簡単にできる
- 色んなパターンが作れる
プログラム
import tkinter import tkinter.messagebox key = "" def key_down(e): #キーが押された時に行う処理 global key key = e.keysym #keysymには押されたキーの情報が入る def key_up(e): #キーが離された時に行う処理 global key key = "" #キーが離された時、キーの情報を空にする mx = 1 my = 1 yuka = 0 yukanokazu = 0 def main_proc(): global mx,my,yuka,yukanokazu if key == "Shift_L"and yuka >1: #左シフトキーを押し、2マス以上塗っていたら canvas.delete("PAINT") #塗ったところを消す mx = 1 #キャラクターを初期位置に戻す my = 1 yuka = 0 for y in range(7): for x in range(10): if maze[y][x] == 2: maze[y][x] = 0 if key == "Up"and maze[my-1][mx] == 0: #upのキーが押されたら my = my-1 #キャラクターのy座標を-20 if key == "Down"and maze[my+1][mx] == 0: my = my+1 if key == "Left"and maze[my][mx-1] == 0: mx = mx-1 if key == "Right"and maze[my][mx+1] == 0: mx = mx+1 if maze[my][mx] == 0: #移動したところが通路なら maze[my][mx] = 2 #リストの値を2にする yuka = yuka+1 canvas.create_rectangle(mx*80,my*80,mx*80+79,my*80+79,fill="pink",width=0,tag="PAINT") #そこをピンクで塗る canvas.delete("MYCHR") #一旦消す canvas.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR")#再度キャラクターの画像を表示 if yuka == yukanokazu: canvas.update() tkinter.messagebox.showinfo("おめでとう!","全ての床を塗りました!") else: root.after(100,main_proc) root = tkinter.Tk() root.title("一筆書き迷路") root.bind("<KeyPress>",key_down) #keyが押された時に行う処理を指定。 root.bind("<KeyRelease>",key_up) #keyが離された時に行う処理を指定。 canvas = tkinter.Canvas(width = 800,height = 560,bg = "white") canvas .pack() maze=[ #床と壁を数値に置き換える。床を0、壁を1。Excelからのコピペをここの下に貼り付ける [1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,1,0,0,0,1], [1,1,1,1,0,1,0,0,0,1], [1,1,1,1,0,1,1,0,0,1], [1,0,0,0,0,1,1,0,0,1], [1,0,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,1,1,1] ] kabenokazu = 0 for y in range(7): #yは0-6まで繰り返す for x in range(10): if maze[y][x] == 1:#maze[y][x]が1,つまり壁なら灰色の四角を表示させる kabenokazu = kabenokazu+1 canvas.create_rectangle(x*80,y*80,x*80+80,y*80+80,fill = "skyblue",width = 0) # yukanokazu = 70-kabenokazu #Nmasuに70-yukanokazuを代入 img = tkinter.PhotoImage(file = "kk_100.png") canvas.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR") main_proc() root.mainloop()
Point
例)=CHAR(9)&"["&A1&","&B1&","&C1&","&D1&","&E1&","&F1&","&G1&","&H1&","&I1&","&J1&"],"
- 各行の文字列を全部結合した。
例)=L1&CHAR(13)&L2&CHAR(13)&L3&CHAR(13)&L4&CHAR(13)&L5&CHAR(13)&L6&CHAR(13)&L7&CHAR(13)
- ゴールの条件がマス目に合うようにしたので、どんな形でも対応できる。(従来30固定)
ダウンロード
こちらから、ファイル一式ダウンロードできます。Macで作ったので、文字化けしたらごめんなさい。
drive.google.com
[Python]色々なOSでPython計算速度ベンチマーク
今回は、WindowsやMacの様々なバージョン,CPUごとでPythonのバージョンも変えてベンチマークしてみました。
目次
結果
no. | OS | バージョン | Python バージョン | CPU | メモリ | 秒数 |
---|---|---|---|---|---|---|
1 | Windows10 Home | 10 | 3.8.3 | Core i7-8750H 2.20GHz | 16GB | 22 |
2 | Windows10 Home | 10 | 3.7.3 | Core i7-8750H 2.20GHz | 16GB | 33 |
3 | Googleコラボラトリー | 35 | ||||
4 | MacOS High Sierra | 10.13.6 | 10.13.6 | Core i7 2GHz | 8GB | 62 |
5 | MacOS Catarlina | 10.15.3 | 3.8.3 | Core i5 1.8GHz | 8GB | 84 |
6 | Windows10 Home | 10 | 3.8.3 | Core i5 -3210M2.5GHz | 4GB | 85 |
7 | MacOS HighSierra | 10.13.6 | 3.7.7 | 3.06 GHz Intel Core 2 Duo | 16 GB | 90 |
8 | MacOS High Sierra | 10.13.6 | 2.7.16 | Core i7 2GHz | 8GB | 138 |
※GoogleコラボラトリーはOS対象ではないが比較対象とした
考察
1と2を見ていただくと分かりますが、Pythonバージョンが違うだけで9秒の差が生まれました。これにより、Pythonのバージョンが計算速度に関わっているのではないかと思われます。Python ver2.7.16 では計算結果が0になりました。(0が出るまで138秒)
最後に
皆さんもベンチマークをしたら結果を教えてもらえるとありがたいです。
[Python]ローカルとGoogleコラボラトリーの計算速度ベンチマーク
ローカルとGoogleコラボラトリーの計算速度ベンチマークをしました。
下にあるプログラムで1000万回ループ処理させたときの計算速度を計測しました。
ローカル環境
- iMac:27インチ,Late2009
- macOS: HighSierra ver10.13.6
- プロセッサ: 3.06 GHz Intel Core 2 Duo
- メモリ: 16 GB 1067 MHz DDR3
開発環境
- Python version:3.7.7
- IDLE version:3.7.7
実行したプログラム
import random count=0 E=10000000 for i in range(0,E): a=random.randint(0,1) #0が裏 1が表 b=random.randint(0,1) c=random.randint(0,1) d=a+b+c #一枚だけ表のときは合計が1になることを利用 #print(i,a,b,c) if d==1: count=count+1 p=count/E print(p)
Googleコラボラトリーについてはこちら
tamakon3.hatenablog.com
このプログラムを使った記事はこちら
tamakon3.hatenablog.com
[Python] 数Aの確率の問題を解いてみた
数Aの教科書にある問題をPythonで再現してみました。なお、答えは小数なので近似値になります
問題1
問題1 2個のさいころを同時に投げるとき、目の和が5になる確率を求めよ
import random count=0 E=10000 for i in range(0,E): a=random.randint(1,6) b=random.randint(1,6) c=a+b if c==5: count=count+1 p=count/E print(p)
解説
5,6行目 サイコロをa,bにして、乱数で1-6の乱数を発生させる。
7,9行目 出た目を合計し、5だった場合countという変数に1を加える。
3行目 それを回す回数をEとする。
最後 pで確率を求める。
問題2
問題2 3枚の硬貨を同時に投げるとき、そのうち1枚だけ表が出る確率を求めよ
import random count=0 E=10000000 for i in range(0,E): a=random.randint(0,1) #0が裏 1が表 b=random.randint(0,1) c=random.randint(0,1) d=a+b+c #一枚だけ表のときは合計が1になることを利用 if d==1: count=count+1 p=count/E print(p)
解説
5,6,7行目 コインをa,b,cとして、0か1の乱数を発生させる。0が裏 1が表とする。
8,9行目 dにa,b,cの合計を代入し、dが1だった場合countという変数に1を加える。
3行目 それを回す回数をEとする。
最後 pで確率を求める。
問題3
問題3 2個サイコロを同時に投げるとき、2個とも偶数の目がでる確率を求めよ
import random count=0 E=100000 for i in range(0,E): a=random.randint(1,6) b=random.randint(1,6) if a%2==0: if b%2==0: count=count+1 p=count/E print(p)
解説
5,6行目 サイコロをa,bにして、乱数で1-6の乱数を発生させる。
7,8行目 2で割ったあまりを求め、それが0ならば偶数と判断できる。
9行目 なのでa.bが偶数だった場合countという変数に1を加える。
最後 pで確率を求める。
まとめ
僕も最初はfor分や、変数に代入するやり方もわからなかったが何度も練習することで感覚的に分かってきた。Pythonの基礎構文を覚えるだけで数学の問題が解けてしまうのはすごいと思う。
[ブログ完全初心者]〜30記事までの収益・PV数〜
-先日当ブログで30記事を達成しました。なので、30記事までの収益等の話をしていこうと思います。
でも、30記事で収益なんて出ないでしょって思う方もいるかもしれませんが、結論から言うと4桁の収益がでました。そこまでの経緯を書いていきます!
目次
PV数
5/4日から爆発的に伸びており、その記事は書評をしました。(その記事を下に貼っておきます)この記事から収益が発生しました。
ちなみに5/4の記事が伸びた理由として、この本がまだ発売されてから日も浅かった&書評をしているブロガーがいなかったことが考えられます。
30記事までの収益
ぼくが主に使っているのアフェリエイトは
amazonアソシエイト
だけです。amazonアソシエイトは紹介料最大千円ですので本格的にやるのには向いていません。ですが、始めたての初心者ブロガーさんには非常におすすめです。
amazonアソシエイトの収益
証拠として載せておきます。
明らかにおかしい棒がありますが、それが5/4になります。
合計が1,411円です。
また、自分で言うのもアレですが色々なまとめサイト等を見ていると30記事でここまでいけるのは相当レアなケースだと
思われます。
これから
次の目標は50記事です。50記事書いて変化等があったらまた収益記事を書こうと思います。そして、アフェリエイトサイトも少しずつ増やしていこうと思っていますので
これからもよろしくおねがいします。
[Python]自動で模様を作る
先日ツイッターでupした、トライフォースのプログラムを応用して模様ができるプログラムを作ったので公開したいと思います。
twitterでupしたもの
なんとなく、プログラムでゼルダの伝説のトライフォースを書いてみました。#ブログ初心者 #ブログ書け #Python pic.twitter.com/i1JNU3ne0c
— たまこん@Pythonでゲーム作り (@TAmakonPython) 2020年5月23日
プログラム
from turtle import* a=10 r=120 p=1 col = ["orange","limegreen","gold","plum","tomato","blue"] for b in range(5): pensize(p) for i in range(6): color(col[i]) right(r) forward(a) forward(a) left(r) forward(a) left(r) forward(a) right(r) forward(a) right(r) forward(a) left(r) forward(a) left(r) forward(a) forward(a) right(r) right(60) a=a*2 p=b done()
リストの使い方はこちらです
tamakon3.hatenablog.com
Pythonとは!?
tamakon3.hatenablog.com
感想
意外とおもしろかったです。これを応用してなにかつくれればいいなと思います。
[Python入門]listの使い方まとめ
Pythonでなにか大きいプログラミングをするときに使う関数をlistといいます。
listはたくさんのデータを扱うときにまとめることができます。また、ゲーム制作以外でも使えるのでここで簡単に紹介して行こうと思います。
目次
1.listとは
変数にはデータうを1つずつ入れるのでデータが大量にあるときは、変数で扱うのは大変です。そこでまとめておいてその中から呼び出せるのがlistです。
listとは番号のついた箱のようなもので何番の中の値と番号で指定して、値を入れたり、取り出したりできます。これにより、データがたくさんあっても扱いやすいのです。
ゲームで実際に使った記事
2.listの基本
リスト一つ一つの値を[要素]といい、指定する番号のことを[インデックス]と呼びます。
また、要素は[]内に区切って使います。
そしてインデックスは[0]から始まり、その後1,2...と続きます。
ラーメンは0番目になっています。lunch[2]にすると...
0,1,2, の順なのでステーキが表示されました。
3.listを使う場面
listを使う場面は様々で例えば僕がはじめて記事にしたプログラムのなかで
こんな感じに使われていたり、パロディーゲームを作ったときも
かつらのx座標をまとめていました。このように使い方をある程度理解できれば必ず作業効率が上がります。
4.まとめ
listはたくさんのデータを扱うときに便利