2020年10月4日 星期日

pygame玩遊戲系列(5)~偵測按鍵動作讓物件持續移動

 前面介紹了如何透過鍵盤按鍵的操作讓物件進行移動的操作!

透過上述操作的方式,透過偵測是否有按鍵被「按下去」來進行移動,這樣的方式讓物件移動時,移動模式是按一次指定的按鍵,車子移動一次(也就是設定的2單位),若要讓車子一直移動就需要不斷的重複按指定按鍵。

即使你一直按住指定按鍵時,系統只會偵測到一次「按鍵被按下去」的訊號,車子依舊只會移動一次,不會一直跑!(這就是上一篇我們留下要思考的點之一)

這次,我們就來看看如何設計讓使用者「按住」指定按鍵時,遊戲中的物件(小車)可以持續移動吧!

在實作貼出程式碼前,我們先來思考一下設計的注意事項:

有關如何讓遊戲中物件(小車)移動的概念,就請參考前一篇相關的介紹及說明,這裡就不重複敘述了!

一、首先先談一下:在pygame中,按鍵被「按下去(KEYDOWN)」和被「按住不放(PRESSED)」是不同的二種事件,要仔細分清楚~不能混為一談喔!

二、我們希望使用者「按住」鍵盤「L」或是「向左(←)」按鍵時,小車會持續向左移動,但當小車移動到遊戲視窗左邊界時,就停住不會再移動了(以免小車跑出遊戲視窗外)!

三、我們希望使用者「按住」鍵盤「R」或是「向右(→)」按鍵時,小車會持續向右移動,但當小車移動到遊戲視窗右邊界時,就停住不會再移動了(同樣是避免小車跑出遊戲視窗外)!

好囉~~那為了達成以上的設計目標,主要的核心就是如何偵測遊戲過程是否有按鍵被「按住」又是那些按鍵被「按住」了!是吧~~?!

一樣先貼出完整程式碼直接觀看囉~~~

import pygame, sys
from pygame.locals import *

pygame.init()
bg = pygame.image.load("./imgs/bg-02.jpg")     #設定背景圖來源
car_img = pygame.image.load("./imgs/car6.png")    #設定要被控制的小車圖檔來源
screen = pygame.display.set_mode((500, 380))    #設定視窗資訊
pygame.display.set_caption('騎車春遊趣')       #設定視窗標題

car_x = 240 #設定腳踏車圖檔起始x座標位置

while True:   #主視窗循環
    screen.blit(bg, (0, 0))  # 設定視窗的背景圖片及相對位置
    for event in pygame.event.get():   #偵測視窗中獲取的事件資訊
        if event.type == QUIT:      #如果出現[關閉]事件(按了關閉視窗的按鈕)時
            pygame.quit()      #離開pygame
            sys.exit()      #離開系統

    key_p = pygame.key.get_pressed()  #偵測是否有按鍵被按住的狀態
    # 若是L鍵或是向左(←)鍵被按住而且車子的x座標大於0(視窗左邊邊界位置,避免車子跑出視窗左邊界)
    if (key_p[pygame.K_l] or key_p[pygame.K_LEFT]) and car_x >= 0:
        car_x -= 2  #車子向左移動2單位
    if (key_p[pygame.K_r] or key_p[pygame.K_RIGHT]) and car_x <= 436:
    #若是R鍵或是向右(→)鍵被按住而且車子的x座標小於436(視窗寬度500-車子圖檔的寬度64,避免車子跑出視窗右邊)
        car_x += 2  #車子向右移動2單位

    screen.blit(car_img, (car_x, 270))  # 在指定的位置繪製出車子
    pygame.display.update()    #更新視窗

大家可以對照前一篇的按下按鍵的移動方式一起比較其中差異!

【OnCode大叔簡單玩python】~使用python進行md5與SHA雜湊加密

 這次來玩一下資料的加密!

MD5和SHA1、SHA2都是目前常用的資料加密方式,尤其是在一些帳號、密碼的認證、儲存操作中,也都會有此需求!

在python中可以很輕易地實現以上的雜湊加密操作喔!這次就紀錄、分享這部分的操作!

認識一下:MD5SHA2

在python3中主要是透過「hashlib」模組來完成MD5和SHA1、SHA2的加密操作!

現在就透過以下程式碼來直接看看如何進行相關的雜湊加密實作:

import hashlib

data = "wan"

md5 = hashlib.md5()
sha1 = hashlib.sha1()
sha256 = hashlib.sha256()
sha224 = hashlib.sha224()
sha512 = hashlib.sha512()

# 須先將資料編碼,再更新相關雜湊值
md5.update(data.encode("utf-8"))
sha1.update(data.encode("utf-8"))
sha256.update(data.encode("utf-8"))
sha224.update(data.encode("utf-8"))
sha512.update(data.encode("utf-8"))

#取得相關雜湊加密結果
h_md5 = md5.hexdigest()
h_sha1 = sha1.hexdigest()
h_sha256 = sha256.hexdigest()
h_sha224 = sha224.hexdigest()
h_sha512 = sha512.hexdigest()

print("原始資料:"+data)
print("md5雜湊加密:"+h_md5)
print("SHA1雜湊加密:"+h_sha1)
print("SHA256雜湊加密:"+h_sha256)
print("SHA224雜湊加密:"+h_sha224)
print("SHA512雜湊加密:"+h_sha512)

雜湊加密結果如下:


也是相當簡單的操作就可以實作完成的!

其實重點應該是如何將相關的操作實際應用到系統的設計及思維中,這也是程式設計中最重要、最有趣的地方!

好了~~這次的紀錄、分享就到這囉!

2020年9月20日 星期日

動手自己來~~用Flask+MySQL做個簡易的課堂管理系統

 最近回到學校上課心情輕鬆愉悅許多,也有機會胡思亂想一番!

因為在初期規劃上課時,想說利用ClassDojo這套APP來做為上課輔助管理之用

但發現實在不是很好用~~包含班級建置管理及學生表現紀錄、項目等等,對於我個人來說~都還是有頗多不適之處!又查試了一些其他的APP也還是無法滿意,想想也不難吧??乾脆自己試著打照個系統來用~~因此就有了這個課堂管理系統冒了出來

這個系統一方面為了滿足上課需求,另一方面當然也是練練手、讓腦袋保持運作狀態~呵!
系統設計上使用:Python的微框架Flask做為系統架構+搭配MySQL資料庫
不得不說這樣的架構加上jinja2的HTML 模板,在開發上真是強大又便利啊!



前前後後根據需求,依序開發、改良、增修相關功能紀錄如下:
一、班級、學生管理



二、學生表現管理及操作
三、教室課表管理


四、課程教學資源管理



五、臨時性QRCode產生及管理

目前暫時滿足上課的需求及應用了~~開心簡單紀錄分享一下!

2020年8月30日 星期日

pygame玩遊戲系列(4)~用鍵盤控制物件的移動

 前一篇談到了如何讓物件可以跟著滑鼠移動

但有時候我們會希望是透過鍵盤來控制遊戲中的物件啊~~例如:

按「→」按鍵,車子就往右走;按「←」按鍵,就往左走;按「↑」按鍵,就網上或跳一下...等等!尤其是一些射擊的遊戲可能還會加上發射子彈等控制需求!

所以呢~這次就跳脫滑鼠,換介紹一下如何透過鍵盤來控制遊戲中的物件移動!

為了「乾淨」起見~~我們先回到pygame玩遊戲系列(2)剛載入完圖片的狀態........

也就是回到腳踏車還不會移動的起始狀態,接下來是著思考看看:如何讓腳踏車能夠移動呢?

1.如何讓腳踏車像又(→)移動:在遊戲畫面中,一個物件(腳踏車)向右邊移動,就是讓腳踏車圖檔在畫面上繪製的座標(x軸,y軸)位置,向x軸的方向增加!

2.同樣的概念,若是想要讓車子往畫面的左邊(←)移動(也就是後退嚕啦~~),那就得想辦法讓圖檔的x軸減少囉!

~~那就程式方面的需求來看,也就是如何讓腳踏車圖檔的繪製位置可以透過改變座標中的x位置來達成移動的目標囉!

在前一篇我們是透過讀取滑鼠的位置,並將滑鼠座標的x軸作為腳踏車圖檔的x座標來改變腳踏車的位置,這次我們則是要透過偵測鍵盤動作來改變腳踏車圖檔的x座標位置!

所以這次的練習,著重二個重點:

1.在pygame中如何偵測鍵盤的動作?(是否按了鍵盤?按了甚麼按鍵?)

2.偵測到按了指定的按鍵(→或←)後,如何改變腳踏車出現的x座標

OK~~照慣例,先上程式碼再說(完整程式碼):

import pygame, sys
from pygame.locals import *

pygame.init()
bg = pygame.image.load("./imgs/bg-02.jpg")     #設定背景圖來源
car_img = pygame.image.load("./imgs/car6.png")    #設定要被控制的小車圖檔來源
screen = pygame.display.set_mode((500, 380))    #設定視窗資訊
pygame.display.set_caption('騎車春遊趣')       #設定視窗標題

car_x = 240 #設定腳踏車圖檔起始x座標位置

while True:   #主視窗循環
    screen.blit(bg, (0, 0))  # 設定視窗的背景圖片及相對位置
    for event in pygame.event.get():   #偵測視窗中獲取的事件資訊
        if event.type == QUIT:      #如果出現[關閉]事件(按了關閉視窗的按鈕)時
            pygame.quit()      #離開pygame
            sys.exit()      #離開系統

        if event.type == pygame.KEYDOWN:   #假如發生有鍵盤被按下的事件
            if event.key == pygame.K_LEFT:   #若按鍵盤事件的按鍵是←(向左)按鍵的話
                car_x = car_x - 2			#車子的x位置(car_x)就減2
            elif event.key == pygame.K_RIGHT:  #若按鍵盤事件的按鍵是→(向右)按鍵的話
                car_x = car_x + 2			#車子的x位置(car_x)就加2			

    screen.blit(car_img, (car_x, 270))  # 設定要被控制的小車出現起始位置
    pygame.display.update()    #更新視窗

其中都有每行程式碼的註解供參!

比較需要注意(補充說明)的應該就是:

2020年8月23日 星期日

pygame玩遊戲系列(3)~讓物件跟著滑鼠跑

 用設計遊戲學習程式並透過一些操作來釐清程式操作上的觀念相當實用、有趣!

個人喜歡一點一點、一步一步地藉由小小物件的操作及練習、思考來強化程式的操控及應用

並且透過這個過程去思考程式的可能性及應用面,不然說實在的~~學程式到底要幹嘛咧~~趕流行喔........無聊!

前面pygame玩遊戲系列(2)已經練習了如何將圖形物件載入到遊戲視窗了~~接下來可以做啥呢?

可以自己先想想或期望一下....車子會跑?會唱歌?會跳...等等(一定要自己有想法或期望啊)

這次呢~~個人練習目標是:讓視窗中的腳踏車會跟著滑鼠的動作進行「橫向」移動(就是前進、後退啦!)

要達成這目標,真的很簡單~~簡單到只要新增一行程式碼、小小修改一個座標參數即可!

在之前的基礎下~~~

只要新增一行、修改一個座標參數如下:

去執行看看~~會發現:那台腳踏車已經會跟著滑鼠的移動跑起來了~~~驚不驚訝、開不開心...呵!(學程式要有那種看到成果~~~大叫一聲~耶!的快樂啦....耶!)

=======================================================

完成之後來看一下:

在pygame中獲取滑鼠x,y座標位置的方法為:x, y = pygame.mouse.get_pos()

接著將小車在視窗上繪製的x座標,設定為滑鼠位置的x位置,這樣小車位置就會隨著滑鼠移動而前進或後退囉!(試試看~很好玩的!)

============================================

腦力激盪時間:

pygame玩遊戲系列(2)~圖片的載入及設定

 距離前一篇介紹pygame的基礎視窗架構介紹的紀錄居然又過了將近三個月~~時間真是快啊!

相對於上次只能顯示一個陽春到不知所云的視窗,這次就先針對如和設定背景圖、載入遊戲圖形元件等做初步介紹!

先看成果目標:

=====================================================

一樣先上程式碼的部分:

本次的程式部分,去除前一篇視窗基礎結構的部分,新增的部分主要只有程式碼中的:

5, 6, 8, 11, 17 這五行~~也就是這五行讓整個遊戲視窗繽紛美麗起來了!

現在就簡要記述一下相關內容:(其實每一行程式後方都有註解說明了)

2020年8月21日 星期五

解決python視覺化套件 Matplotlib無法顯示中文之方法

 Matplotlib是python相當受歡迎的視覺化套件

(安裝套件方式:pip install matplotlib)

但是呢~~在預設情形下,若圖表中的設定使用到中文的話,則會發生以下這種情形(Windows10環境)

也就是中文字無法正常呈現~~~挖咧~那就不要用中文嘛!(正解~誤,sorry)

所以看到很多網上或教學文章或範例都避免使用中文標籤,甚至有誤導成不能使用中文.....!

(事實上~~當然是可以的囉~~應該這樣才令人滿意嘛)

自己在之前剛接觸到Matplotlib時,為了解決這個中文顯示這令人困擾的問題~花了一些時間查閱Google大神的封神榜資料~~看到不少精彩的文章,被玩了好一陣子....呵!

後來總算釐清並總結自己覺得(強調囉~~是自己覺得喔!)最單純有效的方式如下:

→問題原因:簡單講就是Matplotlib預設的字型不支援中文嘛

所以呢~~~~

→解決方法:拿個中文字型去覆蓋掉他的預設字型就可以支援中文了啊

所以咧~~~我的作法就是將windows中系統的「標楷體」(kaiu.ttf)複製到Matplotlib的字型資料夾中,將其預設的字型「DejaVuSans.ttf」給取代掉即可!