文系忘備録

どこにでもいる文系大学生の忘備録です

MENU

【ラズパイ】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)

全体のコード(コピペ可)


Tic-Tac-Toe with TKinter

【Python】Tkinterで長方形をグリッド状に配置する方法【コピペ可能】(rectangles,grid)

今回はPythonGUIの作るための標準ライブラリである。「Tkinter」で長方形(rectangle)をグリッド状に簡単に配置する方法の一つを忘備録として書いていこうと思います。

※今回はgrid関数は用いません

使用例

createRectanglesWithGrid(gridPositionX,gridPositionY,cellSize=39,gridSize=8)

図形間にスペースを開けることも可能です。

createRectanglesWithGrid(gridPositionX,gridPositionY,cellSize=50,gridSize=3,cellSpace=10)

以下のように簡単にできます。

    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で作ってみたいと思います!

今回の記事のターゲット

  • Python初心者
  • 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か月ごとにリセットのためそのときにランクシステムも変わってしまう可能性があります。

なので上げれるうちにあげておきましょう!

 

他のおすすめ記事↓

 

dntf.hatenablog.com

 

 

 

【スマブラSP】リドリーでVIPへ行くための立ち回りなどをまとめてみる

こんにちはdntfです。

今回はリドリーでVIPいったのでそこまでの戦い方をある程度簡潔にかいていきます。

なにげ初VIP

※個人的な考え、立ち回りなので参考程度に読んでください

 

主な技

おそらくこの記事にたどり着いている方たちはリドリーの基本的なコンボなどはもう知ってると思うので局所的な立ち回りを書いていきます。

使いやすい技から順に書いていきます。

空N - 8f

発生が短い上に技範囲もかなり大きいので着地隙消すときにも使えます。近づかれたりガーキャンでとりあえず打つ感じでいいです。

判定がリドリーを中心に大きいのでめくりにもつかえます。

空後 - 10f

主なバースト択です。

かなり飛ぶので%がたまってたら積極的に狙っていきましょう。

ガーキャンからもかなり当てやすいです。

空前 - 10f

コンボから復帰阻止まで使える便利技です。

下強 - 9f

リーチがめちゃくそ長い技です。

中距離でおくことが多くなります。

見た目よりもかなり判定がかなり長い上にコンボにつなげられる技なので強いです。

横強 - 10f

崖狩りでかなり強いです。

ある程度持続がある上に先端ならバーストも狙えるので置くだけでもかなり強いです。

シフトもできるので無敵が切れた相手を殴ることもできます。

上スマ - 12f

上スマの中でもかなり強い部類に入ります。

発生が短い上に範囲が広く、ガーキャンでの撃破や色々な場面で使えます。

コンボ

下投げ or 下強 -> 空前

撃墜帯まで幅広く使えるコンボです。

(0%)下投げ -> 横強上シフト

0%時に空前のコンボをするとキャラによっては抜けられることがありますが、上シフトにすることで確定します。

立ち回り

中距離では下強、横強。近距離では空Nなどを主に振る

リドリーの下強は見た目よりもかなり長いリーチのある技かつ当てれば空前にもつなげられる技なので多めに振って立ち回りましょう。

近距離では困ったらとりあえず空Nを振って、後半は空後や上スマで撃墜を狙っていきましょう。

最後に

興味があればこちらも

 

dntf.hatenablog.com