【ラズパイ】SSD1306で大きく数字を表示する【Python】【入門】
みなさんこんにちは。
SSD1306って使いやすいですけど標準の関数のみで数字を表示したら小さくて遠くから見ずらいですよね?
今回はmicropythonで画面いっぱいに数字を表示できるようにしてみようと思います!
使用例
下記の動画で使用しています!
このように画面全体に表示します。
youtu.be
数字を表示してみる
コード
def WriteDigitalNumber(i,wh,oled): #width space wi_s = 5 #height space hi_s = 8 #width wi = 19 #height hi = 48 w = 0 if wh == 1: w = 5 elif wh == 2: w = 34 elif wh == 3: w = 61 elif wh == 4: w = 75 elif wh == 5: w = 104 else : print('number is out of index') if i == 0: oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 1: oled.vline(w+wi,hi_s,hi,1) elif i == 2: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,int(hi/2),1) oled.hline(w,hi_s+int((hi/2)),wi,1) oled.vline(w,hi_s+int((hi/2)),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 3: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 4: oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) elif i == 5: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 6: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 7: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) elif i == 8: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 9: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1)
解説
oledにある描画関数の
vline(縦線)とhline(横線)を使用しています。
使い方
下のようにした場合0が1番目の位置に表示されます
#0を一番目に表示 WriteDigitalNumber(0,1,oled) # 引数1:表示する数字、引数2:表示する位置(1から5まで)、引数3:oled
下の画像のように、真ん中のスペースが足りていないので3番目の位置は各々小数点とか描画したらいいと思います。
#0を一番目に表示 WriteDigitalNumber(0,1,oled) #0を2番目に表示 WriteDigitalNumber(0,2,oled) #3を4番目に表示 WriteDigitalNumber(3,4,oled) #9を5番目に表示 WriteDigitalNumber(9,5,oled)
サンプル
ラズパイピコにて超音波センサーの測定結果を表示するために使用しました。
import machine import utime import ssd1306 # 超音波センサー trigger = machine.Pin(14, machine.Pin.OUT) echo = machine.Pin(15, machine.Pin.IN) # ssd1306 sda = machine.Pin(6) scl = machine.Pin(7) i2c = machine.I2C(1,sda=sda, scl=scl, freq=400000) oled_width = 128 oled_height = 64 oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) def read_distance(): trigger.low() utime.sleep_us(2) trigger.high() utime.sleep(0.00001) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff distance = (timepassed * 0.0343) / 2 return distance def WriteDigitalNumber(i,wh): #width space wi_s = 5 #height space hi_s = 8 #width wi = 19 #height hi = 48 w = 0 if wh == 1: w = 5 elif wh == 2: w = 34 elif wh == 3: w = 61 elif wh == 4: w = 75 elif wh == 5: w = 104 else : print('number is out of index') if i == 0: oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 1: oled.vline(w+wi,hi_s,hi,1) elif i == 2: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,int(hi/2),1) oled.hline(w,hi_s+int((hi/2)),wi,1) oled.vline(w,hi_s+int((hi/2)),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 3: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 4: oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) elif i == 5: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 6: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1) oled.hline(w,hi_s+hi,wi,1) elif i == 7: oled.hline(w,hi_s,wi,1) oled.vline(w+wi,hi_s,hi,1) elif i == 8: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,hi,1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 9: oled.hline(w,hi_s,wi,1) oled.vline(w,hi_s,int(hi/2),1) oled.hline(w,hi_s+int(hi/2),wi,1) oled.vline(w+wi,hi_s,hi,1) oled.hline(w,hi_s+hi,wi,1) elif i == 10 and wh == 3: oled.vline(w+3,hi_s+3,42,1) oled.vline(w+3,hi_s+18,14,0) def WriteDigitalDot(position): wh = position #print(wh) #width space wi_s = 5 #height space hi_s = 8 #width wi = 19 #height hi = 48 w = 0 if wh == 1: w = 5 elif wh == 2: w = 34 elif wh == 3: w = 61 elif wh == 4: w = 75 elif wh == 5: w = 104 else : print('number is out of index') #oled.hline(w,hi_s+hi,wi,1) oled.fill_rect(w,hi,5,5,1) if __name__ == "__main__": while True: oled.fill(0) oled.rect(0,0,128,64,1) d = read_distance() d = round(d, 2) if d < 100: n=0 if d < 10: n=1 WriteDigitalNumber(0,1) for i in str(d): n+=1 if i == ".": WriteDigitalDot(3) continue WriteDigitalNumber(int(i),n) print(d) oled.show() utime.sleep(0.3)
【スマブラSP】ルキナの様々な横強の振り方
みなさんこんにちは。
今回は横強、上強、空前だけで気付いたらVIPに入れていたルキナについての記事です。
そして今回はおそらくその3つの中でもダントツで振るであろう横強の様々な振り方について軽くまとめていこうと思います。
横強の利点
- リーチが短いキャラ(カービィなど)に有利を取れる。
- DAより上にもリーチがあるため小ジャンプにも当たることがある。
- 振り続けると相手がいらつく(大事)
デメリット
- DAの方が飛ぶ
様々な横強の振り方
滑り横強を振る(重要)
詰めるときに振ります。
相手にガーキャン掴みされない位置に入れるように練習しましょう。
下強と空前を混ぜながら振る
横強だけ振っててもOP相殺もかかるので距離に応じて空前、下強を使います。
どれだけ油断しても絶対に相手の間合いに入らないことを意識しましょう。
近づかれたらガーキャン上Bで距離を取る
一度間合いに入られて流れをつかまれてしまうと、火力がそこまで高くないルキナは押し切られがちなので、相手に流れをつかまれないようにガーキャンで間合いをリセットしつつ戦います。
【Python入門】Tkinterでマルバツゲームを作ってみよう!【サンプルコード有】【コピペ可】【チュートリアル】
みなさんこんにちは。
今回は↓のような実際に遊べるマルバツゲームをTkinterで作っていこうと思います。
初期化
import tkinter as tk from tkinter import messagebox from functools import partial import random import sys screenHeight = 390 screenWidth = 390 class Application(tk.Frame): def __init__(self,master = None): super().__init__(master) self.mainframe = tk.Frame(self.master) self.mainframe.pack() self.frame1 = tk.Frame(self.master) self.frame1.grid(row=0,column=0,in_=self.mainframe,pady=50) self.cells = [[tk.StringVar() for i in range(3)] for j in range(3)] self.createButtonsWithGrid(cellSize=9,gridSize=3,fontSize=10) def createButtonsWithGrid(self,cellSize,gridSize:int,fontSize=0,cellSpace=0): for i in range(0,gridSize): for j in range(0,gridSize): button = tk.Button( self.frame1, relief="groove", width=cellSize, height=int(cellSize/2), #text=text, textvariable=self.cells[i][j], font=("System",fontSize), command=partial(self.clicked,(i,j)) ) button.grid(column=j,row=i,padx=cellSpace,pady=cellSpace) ~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~ if __name__ == "__main__": root = tk.Tk() root.title("○×ゲーム") # Screen size root.geometry(str(screenWidth)+"x"+str(screenHeight)) app = Application(master = root) root.mainloop()
初期化は以上のように行っています。
Tkinterではボタンなどのテキストに変数を割り当てることができるので、
文字列で二次元配列を作成しボタンにそれぞれ割り当てています。
#3x3の文字列の二次元配列を作成 self.cells = [[tk.StringVar() for i in range(3)] for j in range(3)] #ボタンの作成 for i in range(0,gridSize): for j in range(0,gridSize): button = tk.Button( self.frame1, relief="groove", width=cellSize, height=int(cellSize/2), #text=text, #ボタンに文字列を割り当てる textvariable=self.cells[i][j], font=("System",fontSize), command=partial(self.clicked,(i,j)) ) button.grid(column=j,row=i,padx=cellSpace,pady=cellSpace)
また以下のようにすることでボタンをグリッド配列にしています。
#行と列にそれぞれボタンを配置 button.grid(column=j,row=i,padx=cellSpace,pady=cellSpace) #pax,pady : ボタン外のスペース
そしてボタンを格納したフレームを中央に配置するために別のフレームを親にしています。
#メインフレームを作成 self.mainframe = tk.Frame(self.master) self.mainframe.pack() self.frame1 = tk.Frame(self.master) #メインフレームを親化 self.frame1.grid(row=0,column=0,in_=self.mainframe,pady=50)
勝ち負けの判定
if p[0] == maxIndex: if p[1] == maxIndex: if (self.checkCell((p[0],p[1]-2),c) and self.checkCell((p[0],p[1]-1),c)): return True elif (self.checkCell((p[0]-2,p[1]),c) and self.checkCell((p[0]-1,p[1]),c)): return True elif (self.checkCell((p[0]-2,p[1]-2),c) and self.checkCell((p[0]-1,p[1]-1),c)): return True elif p[1] == 0: if (self.checkCell((p[0]-2,p[1]),c) and self.checkCell((p[0]-1,p[1]),c)): return True elif (self.checkCell((p[0],p[1]+2),c) and self.checkCell((p[0],p[1]+1),c)): return True elif (self.checkCell((p[0]-2,p[1]+2),c) and self.checkCell((p[0]-1,p[1]+1),c)): return True ~~~~~~~~~~省略~~~~~~~~~ #チェック用関数 def checkCell(self,p,c): return self.cells[p[0]][p[1]].get() == c
以上のように角の場合は横二つを、間のマスの場合は両隣を見て勝ち負けを判定します。
引き分けの判定
以下のようにして空白のマスがあるか確認し、なければ引き分けになるようにしています。
def checkWholeBoard(self): for i in self.cells: for j in i: if (j.get() == ""): return False return True
敵の配置
敵はランダムにでた数字で配置しています。
def setEnemy(self): #置ける場所がない場合は中断 if self.checkWholeBoard(): return (-1,-1) i = random.randint(0,len(self.cells)-1) j = random.randint(0,len(self.cells)-1) #置ける場所が見つかるまで引く while (self.checkCell((i,j),"o") or self.checkCell((i,j),"x")): i = random.randint(0,len(self.cells)-1) j = random.randint(0,len(self.cells)-1) self.changeCell((i,j),"x") return (i,j)
全体のコード(コピペ可)
【Python】Tkinterで長方形をグリッド状に配置する方法【コピペ可能】(rectangles,grid)
今回はPythonのGUIの作るための標準ライブラリである。「Tkinter」で長方形(rectangle)をグリッド状に簡単に配置する方法の一つを忘備録として書いていこうと思います。
※今回はgrid関数は用いません
使用例
図形間にスペースを開けることも可能です。
以下のように簡単にできます。
def createRectanglesWithGrid(gridPosX,gridPosY,cellSize,gridSize:int,cellSpace=0): for i in range(0,gridSize): for j in range(0,gridSize): x0 = cellSize*j + gridPosX y0 = cellSize*i + gridPosY x1 = cellSize*(j+1) + gridPosX - cellSpace y1 = cellSize*(i+1) + gridPosY - cellSpace canvas.create_rectangle( x0,y0,x1,y1 )
解説の必要もないと思いますが長方形をずらしながら配置しているだけの簡単なものになります。
【Python入門】乱数でおみくじを作ってみよう!【random】
みなさんこんにちは!
今回は超簡単なおみくじをPythonで作ってみたいと思います!
今回の記事のターゲット
ということで最初は今回の軸となる乱数を生成する関数であるrandomについて解説していきます!
ランダムの使い方
ランダムモジュールはPythonに標準ついているため特にインストールなどは必要ありません。そして今回は整数の乱数を取得するためにrandom.randint()を使っていきます!
randint() - 整数の乱数
randintは下のようにすることで乱数を簡単に取得できます。# importを忘れずに! import random #1から3の乱数 randomNum = random.randint(1,3)
ランダムモジュールにはほかにも便利な関数があるので一部紹介しておきます!
import random # 0から1までの浮動小数点数(float) random.random() # 任意の範囲の浮動小数点数(float) random.uniform(0,1) # ランダムな配列の要素の取得 random.choice(["a","b","c"])
おみくじを作ってみよう!
ということで超簡単なおみくじのコードはこちらになります!# importを忘れずに! import random randomNum = random.randint(1,3) if randomNum == 1: print("大吉!") elif randomNum == 2: print("中吉") else: print("小吉")
配列を使う場合
ちなみに文字列の配列を使うともう少し短くてできます。# importを忘れずに! import random list = ["大吉!","中吉","小吉"] print(random.choice(list))
スプラシリーズ未経験者でも9日間でウデマエS到達できたので使いやすかった武器(シューターのみ)ランキング【スプラ3】【スプラトゥーン3初心者】
みなさんこんにちは。
今回の記事ではスプラトゥーンを3から始めた僕が開始9日(一週間と2日)でウデマエS達成できたのでそんな初心者の視点から使いやすかった武器とかまとめてみます。
※初心者向けの記事です
使った武器
基本シューターのみです。なので他のメタ武器(洗濯機、リッター)については正直よくわかりません。
なのでここではシューターのみで個人的に使いやすかった武器についてまとめていきます。
※初心者目線で書いていきます。
1位 - .52ガロン
なんか前作でも強かったらしいです。
確定2発のおかげでまだジャイロ初心者の僕でも結構戦えました。
なので初心者でなかなかキルが取れないって人におすすめです。
ただサブがボムじゃないのでチャージャーに圧かけたりとかはできないのがつらいところです。
良かった点
- 確定2発でエイム負けしてても勝てたり相打ちに持っていけることがある
- スぺシャルを脳死で出しやすい
- サブのシールドが使いやすい
悪かった点
- ボムで遠くに圧をかけたりできない
2位 - スプラシューター(スシ)
最初攻略サイトでスシってのが何かずっとわかりませんでした。
ちなみに僕はお寿司は食べれないです。
ウルトラショットの使うタイミングは当て方が結構(初心者の僕には)難しめです。
そのかわりすぐに開放できる上対面もそこそこ強いのでおすすめのブキです。
良かった点
- 確定3発
- すぐにブキを開放できる
- キューバンボムが無難に使いやすい
- ウルトラショットが強い
悪かった点
- .52ガロンと射程が被ってるため相手にすると撃ち負けやることがある
- ウルトラショットが難しい
3位 - N-ZAP85
エナジードリンクがかなり強いです。移動速度はもちろん復活速度も速くなるのでチームをサポートしたい人にもオススメです。
ですが設置は味方がちゃんと飲める場所にしましょう。
良かった点
悪かった点
- .52ガロンと射程が被ってるため相手にすると撃ち負けやることがある
ランクはやはり上がりやすい(体感)
未経験者は特に上がりやすい(かも?)
ウデマエは一度上がったら下がらない上、
今作のランクシステムでは2のレートを引き継いでいるらしいので逆に未経験者の方が強い相手とマッチングしずらくランクを上げやすいそうです
まとめ
ただウデマエは3か月ごとにリセットのためそのときにランクシステムも変わってしまう可能性があります。
なので上げれるうちにあげておきましょう!
他のおすすめ記事↓
【スマブラSP】リドリーでVIPへ行くための立ち回りなどをまとめてみる
こんにちはdntfです。
今回はリドリーでVIPいったのでそこまでの戦い方をある程度簡潔にかいていきます。
※個人的な考え、立ち回りなので参考程度に読んでください
主な技
おそらくこの記事にたどり着いている方たちはリドリーの基本的なコンボなどはもう知ってると思うので局所的な立ち回りを書いていきます。
使いやすい技から順に書いていきます。
空N - 8f
発生が短い上に技範囲もかなり大きいので着地隙消すときにも使えます。近づかれたりガーキャンでとりあえず打つ感じでいいです。
判定がリドリーを中心に大きいのでめくりにもつかえます。
空後 - 10f
主なバースト択です。
かなり飛ぶので%がたまってたら積極的に狙っていきましょう。
ガーキャンからもかなり当てやすいです。
空前 - 10f
コンボから復帰阻止まで使える便利技です。
下強 - 9f
リーチがめちゃくそ長い技です。
中距離でおくことが多くなります。
見た目よりもかなり判定がかなり長い上にコンボにつなげられる技なので強いです。
横強 - 10f
崖狩りでかなり強いです。
ある程度持続がある上に先端ならバーストも狙えるので置くだけでもかなり強いです。
シフトもできるので無敵が切れた相手を殴ることもできます。
上スマ - 12f
上スマの中でもかなり強い部類に入ります。
発生が短い上に範囲が広く、ガーキャンでの撃破や色々な場面で使えます。
コンボ
下投げ or 下強 -> 空前
撃墜帯まで幅広く使えるコンボです。
(0%)下投げ -> 横強上シフト
0%時に空前のコンボをするとキャラによっては抜けられることがありますが、上シフトにすることで確定します。
立ち回り
中距離では下強、横強。近距離では空Nなどを主に振る
リドリーの下強は見た目よりもかなり長いリーチのある技かつ当てれば空前にもつなげられる技なので多めに振って立ち回りましょう。
近距離では困ったらとりあえず空Nを振って、後半は空後や上スマで撃墜を狙っていきましょう。
最後に
興味があればこちらも