たまこんブログ

学生×プログラミング→2020年3月ブログ開設!趣味の一環でPythonでつくったゲーム や自分が読んで役に立った 本、知識などを紹介しています!

 [Python]迷路プログラム用の新たなエディタを作ってみた

前に作ったプログラムの迷路プログラムの床パターンを作る新たなエディタを作ってみました。Excelで作り、Pythonに貼り付けるということをできるようにしました。

前回の迷路
tamakon3.hatenablog.com

メリット

  • Excelで作るため""を削除する手間がありますが、視覚的に作れるので見やすい
  • 貼り付けるのがそこそこ簡単にできる
  • 色んなパターンが作れる


ただし、全てTkinterで表せるのですが第一段階としてExcelでつくってみました。
f:id:tamakon3:20200606230346p:plain

実行結果

f:id:tamakon3:20200606230503p:plain
Excelで書いたものが、Pythonで簡単に表現できます

プログラム

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()

使い方

  • Excelで0(床)か1(壁)で書きます
  • 右下の赤いセルをコピーして、Pythonのエディタに貼り付けてください。
  • そのとき、""が入るので手動で削除してください

Point

  • Excelの条件付き書式でカラースケールで1と0の塗り分けをした。
  • Pythonに合うように数字の結合をした。

例)=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計算速度ベンチマーク

今回は、WindowsMacの様々なバージョン,CPUごとでPythonのバージョンも変えてベンチマークしてみました。

f:id:tamakon3:20200601223026j:plain

目次

 

結果

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対象ではないが比較対象とした 

 

f:id:tamakon3:20200601221211p:plain


考察

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


結果

f:id:tamakon3:20200530153630p:plain
ローカルが1分30秒で、Googleコラボラトリーが35秒でした。
僕が使っているiMacは古いので計算速度が遅いことが明らでした。
コラボラトリー速すぎぃ

 [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数

f:id:tamakon3:20200525121128p:plain

f:id:tamakon3:20200525121228p:plain
5/4日から爆発的に伸びており、その記事は書評をしました。(その記事を下に貼っておきます)この記事から収益が発生しました。

ちなみに5/4の記事が伸びた理由として、この本がまだ発売されてから日も浅かった&書評をしているブロガーがいなかったことが考えられます。

 

tamakon3.hatenablog.com

 


 

 

30記事までの収益

ぼくが主に使っているのアフェリエイト

amazonアソシエイト

だけです。amazonアソシエイトは紹介料最大千円ですので本格的にやるのには向いていません。ですが、始めたての初心者ブロガーさんには非常におすすめです。

 

amazonアソシエイトの収益

f:id:tamakon3:20200525123702p:plain

 証拠として載せておきます。

明らかにおかしい棒がありますが、それが5/4になります。

合計が1,411円です。

また、自分で言うのもアレですが色々なまとめサイト等を見ていると30記事でここまでいけるのは相当レアなケースだと

思われます。

 

これから

次の目標は50記事です。50記事書いて変化等があったらまた収益記事を書こうと思います。そして、アフェリエイトサイトも少しずつ増やしていこうと思っていますので

これからもよろしくおねがいします。

 

[Python]自動で模様を作る

f:id:tamakon3:20200527154141j:plain
先日ツイッターでupした、トライフォースのプログラムを応用して模様ができるプログラムを作ったので公開したいと思います。



twitterでupしたもの




結果

yutubeに試しにのせてみました。※画質悪いです

[Python]自動で模様を作る
画像
f:id:tamakon3:20200524180539p:plain


プログラム

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はたくさんのデータを扱うときにまとめることができます。また、ゲーム制作以外でも使えるのでここで簡単に紹介して行こうと思います。

f:id:tamakon3:20200521231442j:plain

 

 

 目次

 



 

1.listとは

f:id:tamakon3:20200521233450j:plain

変数にはデータうを1つずつ入れるのでデータが大量にあるときは、変数で扱うのは大変です。そこでまとめておいてその中から呼び出せるのがlistです。

 listとは番号のついた箱のようなもので何番の中の値と番号で指定して、値を入れたり、取り出したりできます。これにより、データがたくさんあっても扱いやすいのです。

 

ゲームで実際に使った記事

tamakon3.hatenablog.com

 

 

 

 

 

2.listの基本

リスト一つ一つの値を[要素]といい、指定する番号のことを[インデックス]と呼びます。

また、要素は[]内に区切って使います。

 そしてインデックスは[0]から始まり、その後1,2...と続きます。

f:id:tamakon3:20200521234039p:plain

ラーメンは0番目になっています。lunch[2]にすると...

 

f:id:tamakon3:20200521234105p:plain

0,1,2, の順なのでステーキが表示されました。

3.listを使う場面

listを使う場面は様々で例えば僕がはじめて記事にしたプログラムのなかで

f:id:tamakon3:20200521235212p:plain

こんな感じに使われていたり、パロディーゲームを作ったときも

f:id:tamakon3:20200521235606p:plain

かつらのx座標をまとめていました。このように使い方をある程度理解できれば必ず作業効率が上がります。

 

tamakon3.hatenablog.com

 

 

tamakon3.hatenablog.com

4.まとめ

listはたくさんのデータを扱うときに便利