小遊戲

王政祺、林尚廷、劉至軒

始計第一

兵者,國之大事,死生之地,存亡之道,不可不察也。

警告

  • 今天你將獲取的技能:

孫子兵法

玩遊戲

  • 今天你不會有下列體驗:

寫程式

Python

EGGNOGG+

關於這個遊戲

  • 單機雙人對戰遊戲
  • 刺激、耐玩、簡單
  • 技巧成分可以很高
  • 三分鐘至六十分鐘

故經之以五事,校以之計,而索其情:

一曰道

1P

← →:左右移動

↑↓:上下舉劍

2P

A D:左右移動

W S:上下舉劍

媽!我會走路了!

v.s

二曰天

1P

V:跳躍

B:攻擊

2P

<:跳躍

>:攻擊

哪有只能動的道理?

v.s

按住下舉劍 + 攻擊 = 下刺

按住上舉劍 + 攻擊 = 上刺

三曰地

1P + 2P

移動時 + 長按攻擊 = 丟劍

按住上舉劍 + 丟劍 = 上丟劍

按住下舉劍 + 丟劍 = 軟丟劍

騰空 + 按住下舉劍 + 丟劍 = 下丟劍

武器不是拿來扔的嗎?不然要幹嘛

四曰將

1P + 2P

按住下舉劍 + 跳 = 蹲下

移動時 + 蹲下 = 貼地滑行

蹲下或滑行時剛好腳下有劍 = 撿劍

扔掉的劍將何去何從?

五曰法

從對方的頭上踩下去可以使人遲鈍

沒劍也可以舉劍,變成舉拳腳

無劍騰空時向對方 (下+攻擊) 可以踢掉對方的劍

無劍且對方騰空時可以 (上+攻擊) 踢掉對方的劍

重生可以獲得劍,但一張地圖最多四支劍

小技巧 & 小知識

吾以此知勝負矣

1P + 2P

跑到對面最底端 = 獲勝

殺人 = 取得 Go,有 Go 才能往下一張地圖跑

沒有 Go 的一方跑往下一張地圖 = 瞬移

啊... 是要怎麼贏啊,我都殺他十次了

開始吧

夫未戰而廟算勝者,得算多也;

未戰而廟算不勝者,得算少也。

多算勝,少算不勝,而況於無算乎?

吾以此觀之,勝負見矣。

作戰第二

凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧,則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。

Congratulations

上次三位 kahoot 的贏家,記得拿飲料喔 XD

輸了沒拿到怎麼辦 QAQ

勝敗乃兵家常事

兵家勝敗真常事,捲甲重來未可知

Welcome to Python

知兵之將,生民之司命,國家安危之主也

Python is powerful... and fast;

plays well with others;

runs everywhere;

is friendly & easy to learn;

is Open.

Python 的強大應用

善用兵者,役不再籍,糧不三載,取用於國,因糧於敵,故軍食可足也。

  • 網路應用程式
  • 數值分析
  • 作業系統
  • 深度學習
  • 科學計算
  • ...
  • 遊戲製作

Python 的缺點

不盡知用兵之害者,則不能盡知用兵之利也。

  • 太慢
  • 強制縮排
  • 型別轉換問題
  • 無法編譯
  • ...
  • 加分號

Python 環境安裝

地者,高下、遠近、險易、廣狹、死生也。

  1. Windows 搜尋「環境變數」

  2. 打開「編輯系統環境變數」再打開「環境變數」

  3. 找到並打開 "Path" 這個變數,並將電腦中 "python.exe" 的路徑複製上去

  4. 打開 cmd,打 "python" 出現 >>> 就代表 OK 了喔

For Windows

Python 環境安裝

地者,高下、遠近、險易、廣狹、死生也。

懶人工具

Hello Python!

記得要用半形驚嘆號!

你的 cmd 出現 >>> 了嗎?

Try this!

>>> print("Hello Python!")

Hello Python!

記得要用半形驚嘆號!

單雙引號是一樣的喔 XD

Try this!

>>> print('Hello Python!')

Hello Python!

記得要用半形驚嘆號!

行尾要加分號;

Try this!

>>> print("Hello Python!");

我想存Code啦

昔殷之興也,伊摯在夏;周之興也,呂牙在殷。

我想存Code啦

昔殷之興也,伊摯在夏;周之興也,呂牙在殷。

將檔案存成 ".py" 編輯器就會幫你上色啦! 還有自動完成喔XD

執行.py檔

故殺敵者,怒也;取敵之利者,貨也。

cd 到檔案位置之後用 python 關鍵字 + 檔名執行!

打註解

將者,國之輔也。輔周則國必強,輔隙則國必弱。

註解不會被執行的東西 = ="

Try this!

print("Hello Python!");
# print("foo")
""" print("bar")
print("bar") """

變數 - 會變的數

一曰度,二曰量,三曰數,四曰稱,五曰勝。

變數像一個容器可以存放數字、字串、各種東西

Try this!

num = 2147483647
print(num) # 2147483647
school = "Jianguo"
print(school) # Jianguo

輸入輸出

用兵之法,無恃其不來,恃吾有以待也;無恃其不攻,恃吾有所不可攻也。

input('提示字') / print('輸出字')

Try this!

x = input()
print("Hello", x)
x = input('insert x')
print("x = ", x)

延伸 - print()

- 我不要換行啦 QQ

- 我不要空格啦 QQ

Try this!

print('Hello', 'Python')
print('Hello', 'Python', end = '!')
print('Hello', 'Python', sep = '')
print('A', 'C', sep = 'b', end = 'd')

延伸 - 觀世 input()

- 怎麼加法啊 QQ

Try these!

x = input()
print(x + 1)
x = int(input())
print(x + 1)
x = input()
print(x + '1')
x = int(input())
print(x + '1')

小練習:小對話機器人

name = input()
print("Hello,", name, "how old are you?")
age = input()
print("That is very young! What is your favourite food?")
food = input()
print("Oh! I really like", food, "too! We have very similar tastes!")

範例

延伸 - 孫子兵法細讀

孫子曰: 凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧,則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。

用戰也勝,久則鈍兵挫銳,攻城則力屈,久暴師則國用不足。夫鈍兵挫銳,屈力殫貨,則諸侯乘其弊而起,雖有智者不能善其後矣。故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也。故不盡知用兵之害者,則不能盡知用兵之利也。

用兵之法:興兵作戰需要準備的物資
饋糧:運送糧食
賓客之用:招待使節、策士的用度
膠漆之材:用於武器維修的膠漆等材料費用
用戰也勝:軍隊作戰就要求速勝
國用:國家財用
屈力殫貨:軍事實力耗盡,國內物資枯竭

延伸 - 孫子兵法細讀

善用兵者,役不再籍,糧不三載取用於國,因糧於敵,故軍食可足也。國之貧於師者遠輸,遠輸則百姓貧;近師者貴賣,貴賣則百姓財竭,財竭則急於丘役。力屈財殫,中原內虛於家,百姓之費,十去其七;公家之費,破軍罷馬,甲冑矢弓,戟盾矛櫓,丘牛大車,十去其六。

役不再籍,糧不三載:不用再次徵集兵員,不用多次運送軍糧
取用於國,因糧於敵:武器裝備由國內供應,從敵人那裡設法奪取糧食
遠輸:長途運輸
貴賣:物價飛漲
急於丘役:賦稅和勞役加重

延伸 - 孫子兵法細讀

故智將務食於敵,食敵一鐘,當吾二十鐘;忌桿一石,當吾二十石。

故殺敵者,也;取敵之利者,也。車戰得車十乘以上,賞其先得者,而更其旌旗。車雜而乘之,卒善而養之,是謂勝敵而益強

故兵貴勝,不貴久。 故知兵之將,民之司命。國家安危之主也。

務食於敵:在敵國解決糧草問題
怒:激勵
貨:獎賞
雜而乘之,善而養之:把搶得的戰車編入我方車隊,善待俘虜使他們歸順。
勝敵而益強:戰勝敵人而使自己越發強大
民之司命:掌握著民眾生死的人

Next

謀攻第三

謀攻第三

孫子曰:凡用兵之法,全國為上,破國次之;全軍為上,破軍次之;全旅為上,破旅次之;全卒為上,破卒次之;全伍為上,破伍次之。是故百戰百勝,非善之善者也;不戰而屈人之兵,善之善者也。

首先,你會需要這個

這節課凡是少於十的數字都是用上古漢語標註

趕快記起來!

Data Typing(資料型別)

兵無成勢,無恒形,能因敵變化而取勝者,謂之神。故五行無常勝,四時無常位,日有短長,月有死生。【虛實篇】

來認識常見的資料型別吧!

與資料型別來蕉流蕉流

數字類

integer (int) : 整數

num1 = int(input()) #輸入一個整數
num2 = int(32.0) #將浮點數變成整數

最常用到的!

數字類

integer (int) : 整數

num1 = float(input()) #輸入一個整數
num2 = float(226) #將整數變成浮點數

float (float) : 浮點數(小數)

num1 = int(input()) #輸入一個整數
num2 = int(32.0) #將浮點數變成整數

最常用到的!

由於電腦沒辦法完整儲存無限多位的小數點可能會有誤差,請酌量食用

數字類

integer (int) : 整數

num1 = float(input()) #輸入一個整數
num2 = float(226) #將整數變成浮點數

float (float) : 浮點數(小數)

num1 = int(input()) #輸入一個整數
num2 = int(32.0) #將浮點數變成整數

最常用到的!

由於電腦沒辦法完整儲存無限多位的小數點可能會有誤差,請酌量食用

我沒打錯字

字串

之前有遇到過!是存一串字元的一個資料型別

name = input()
print("Hello, " + name + "!")
name = "INFOR"
print("Hello, " + name + "!")
name = 'INFOR'
print("Hello, " + name + "!")

用雙引號、

單引號都行!

註:其他語言幾乎都會分!

得知變數型別

『聖嘆之評《西廂》,可謂晰毛辯發,窮幽極微,無復有遺議於其間矣。」

var = 50
print(type(var))

就用type函式而已XD

<class 'int'>

運算子

《史記‧高祖本紀》:「夫運籌帷幄(帳)之中,決勝千里之外,吾不如子房。」

四加一等於五則運算

四加一等於五則運算

加法

a = 2
b = 2147483645
print(a + b)
2147483647

四加一等於五則運算

加法

a = 2
b = 2147483645
print(a + b)
2147483647

減法

a = 65
b = 23
print(a - b)
42

四加一等於五則運算

加法

a = 2
b = 2147483645
print(a + b)
2147483647

減法

a = 65
b = 23
print(a - b)
42

乘法

a = 32
b = 16
print(a * b)
512

四加一等於五則運算

小數除法

a = 3
b = 2
print(a / b)
1.5

整數除法

a = 3
b = 2
print(a // b)
1

四加一等於五則運算

小數除法

a = 3
b = 2
print(a / b)
1.5

整數除法

a = 3
b = 2
print(a // b)
1

一個/兩個斜線!

四加一等於五則運算

小數除法

a = 3
b = 2
print(a / b)
1.5

整數除法

a = 3
b = 2
print(a // b)
1

直接除一波

只取商:

3 \div 2 = 1 \dots 1

進階運算子

模數 (取餘數)

a = 72
b = 7
print(a % b)
2

次方

a = 2
b = 5
print(a ** b)
32
2^5 = 32
72 \div 7 = 10 \dots 2

比較運算子

故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。

等於

print(3 == 3)
True

不等於

print(3 != 5)
True

比較運算子

小於

print(2 < 7)
True

小於或等於

print(2 <= 5)
True

大於

print(1000 > 1)
True

大於或等於

print(3 >= 3)
True

邏輯運算子

邏輯且

print(2 < 7 and 10 >= 9)
True

邏輯或

print(3 > 5 or 3 <= 5)
True

邏輯非

print(not 10 < 5)
True

孟子曰:「予豈好辯哉?予不得已也。」

得為真若且唯若

兩邊都為

為真若且唯若

兩邊其中一者都為真,兩個都真當然也可以

得為真若且唯若

後面的不為真

接下來有三個問題,請回答以練習

對邏輯運算子的敏銳度

你來的路上突然當成台灣總統

or

你現在是高中生

TRUE

雖然各位不是總統(參選年齡限制是四十歲)但是大家都是高中生!

not not not not not not not not not not not 今天是禮拜五

FALSE

今天是禮拜五沒有錯!不過有十一個not,所以就是False了!

not 你人現在不在臺北 and 你會吸毒

FALSE

不過有反例

判斷式

夫將者,國之輔也。輔周則國必強,輔隙則國必弱。

「若」

「若」

「上善水,水善利萬物而不爭。」

「若」

「上善水,水善利萬物而不爭。」

「若」

「如果這樣就那樣,否則如果那樣就這樣,否則就那樣」

src: xkcd

基本語法

if [某邏輯判斷]:
  做事
elif [某邏輯判斷]:
  做其他的事
else:
  做比其他更其他的事

可以有很多個elif!

程式會找第一個符合的進去跑裡面的程式,其他的就不跑了

若都不符合,那可以寫else,處理都不符合以上條件的case

實際例子:判斷分數

score = 73

if score >= 90:
  print("Wow! You scored over 90 points!")
elif score >= 30 and score <= 60:
  print("Retake the test")
elif score < 30:
  print("R.I.P.")
else:
  print("You did pretty good! Keep going!")
You did pretty good! Keep going!

練習練習!

  • 判斷閏年
  • 判斷一個數字是否為偶數
  • 判斷一個人的分數是否及格
  • 自己設定一個密碼,別人要猜那個密碼
  • ... 

有問題隨時舉手!

兵眾孰強?

For Loop

「閒雲潭影日悠悠,物換星移幾度秋。」

                                         唐. 王勃〈滕王閣〉

想不到梗... 基礎語法

for x in range(5):
  print(x)

變數名稱!可以任意取

會從reːŋs(零)跑到hljids(四)

空格表示在迴圈內

0
1
2
3
4

稍微進階的語法

for x in range(3, 7, 2):
  print(x)

數字一定小於sn̥ʰid(七)

一開始是suːm(三)

然後每次跳njis(二)

3
5

有一個for loop,就可以有千千萬萬個for loop!

動中有靜,For中有For

for x in range(5):
  for y in range(5):
    print("x = " + x + ", y = " + y)
x = 0, y = 0
x = 0, y = 1
x = 0, y = 2
x = 1, y = 0
x = 1, y = 1
x = 1, y = 2
x = 2, y = 0
x = 2, y = 1
x = 2, y = 2
x = 0: y = 0, 1, 2\\ x = 1: y = 0, 1, 2\\ x = 2: y = 0, 1, 2\\

實體例子:輸出

res = 0
n = 10
for x in range(n + 1):
  res = res + x
  
print(x)
55
1 + 2 +\dots + n

可以改成輸入一個數字而不是寫死的嗎?

請練習用for迴圈而不要用公式解!

練習練習!

  • 輸出到      的所有平方數
  • 將    以下的不為三的倍數但為五的倍數的數字都輸出
  • 請輸出一個    階的三角形!
  • 請輸出費氏數列的前    項!(可能有點難)
  • ... 

有問題隨時舉手!

士卒孰練?

n^2
n
n
n
*
**
***
****
*****

五階的三角形

軍形第四

昔之善戰者,先為不可勝,以待敵之可勝。

Warm up

學而時習之 不亦胖乎

Data type

資料型別

Data type

資料型別

複習得啦 XD

<class 'str'>

<class 'int'>

<class 'float'>

<class 'bool'>

...

Data type

Integer = input()
print(type(Integer))

Data type

A = input()
print(type(2 * A))

Data type

2qbx = int(input())
print(type(2qbx))

Data type

A = 3.0
print(type(2 * A))

Data type

A = 3.0
print(type(2 > A))

Data type

A = 3.0
print(type(2 or A))

Data type

print(type(chr(ord('a'))))

Data type

print(type(print))

Data type

print(type(type))

Operators

mp4算子

Operators

print(2 + 2)

Operators

print(2 >= 2)

Operators

print(2.3 and 2)

Operators

print(0.0 and 2)

Operators

print(3 / 2)

Operators

print(3 // 2)

Operators

print(2.3 // 2)

Operators

print(0 or 0.0)

Operators

print(0 and 0.0)

Operators

x = int(input())
print(x + 2.3 > x + 2)

Operators

x = int(input())
print(int(x + 2.3) > x + 2)

IFs and FORs

IFs and FORs

i = 3
for i in range (5):
    i += 1
print(i)

IFs and FORs

i = 3
if i in range (5):
    i += 1
print(i)

IFs and FORs

suum, sum = 3, 0
for i in range (10, 3, -2):
    sum += i
print(suum + sum)

IFs and FORs

for 軟 in range(0, -1):
	print(軟)

While Loop

逝者如斯夫 不捨晝夜

只要

我喜歡,有什麼不可以?

只要

某個條件符合了,就做某件事

只要肚子餓了,我就一直吃東西

只要爸媽還沒回家,我就繼續打電動

只要這一題還沒AC我就繼續debug

只要還沒中樂透,我就繼續買彩券

有沒有人可以再舉例子?

還是想不到梗... 基礎語法

while [某個條件符合]:
  做事

關鍵字!

跳過與離開

遇到需要跳過的條件,分為

「先不要」 (continue)

「絕對不要」(break)

兩種

跳過

遇到錯誤的東西會直接進行迴圈的下一輪,等同於直接跳到迴圈開始,並且進入下一輪

while x < 100:
  if x > p:
    continue
  做事做事
  做事做事
  做事做事
  做事做事
  做事做事
  

糖炒例子:

當符合第njis(二)行的條件,那會直接跳回第二行

離開

遇到錯誤的東西會直接跳出迴圈,不幹了

while x < 100:
  if x > p:
    break
  做事做事
  做事做事
  做事做事
  做事做事
  
迴圈外的事

糖炒例子:

當符合第njis(二)行的條件,那會去做第kuʔ(九)行的事

糖炒例子

輸出ɡjub(10)以下的奇數

for n in range(10):
  if n % 2 == 0:
    continue
  print(n)

輸出數字直到遇到kuʔ(9)的倍數

for n in range(10):
  if n % 9 == 0:
    break
  print(n)

無限迴圈

輪迴(梵語:संसार,轉寫:Saṃsāra),是一種思想理論,認為生命會以不同的面貌和形式

x = 7
while x > 0:
  x = x + 1
  print(x)

永遠都會符合條件!

程式跑不完!

有兩種方法可以解決:

1. 避免寫出會爆的程式

2. 常念阿彌陀佛

練習練習!

  • 我不想要想練習了啦,想要做出什麼就做吧!你們已經有初階的能力可以寫出自己的程式了!回家就開始寫出一個小遊戲吧!
  • 剪刀石頭布
  • 1A2B
  • 神奇寶貝???
  • 對話機器人?
  • 數學的一些工具

皇天不負苦瓜人!

多多去玩,修改,寫程式才會進步!

Lists

就是一堆咚咚

Lists

[]

一個中括號

Lists

[9, 8.0, '2qbx', [4, 5]]

中括號裡面可以放所有東西

Lists

a = [9, 8.0, '2qbx', [4, 5]]
print(a)
print(a[0])

輸出 & 取值

Lists

a = [9, 8.0, '2qbx', [4, 5]]
a.append(5)
a.extend([4, 'miku'])
print(a)

加值機

Lists

a = [9, 8.0, '2qbx', [4, 5]]
for i in a:
    print(i)

列舉

Lists

a = [9, 8.0, '2qbx', [4, 5]]
print(a[-2])
print(a[0:3])
print(a[1:])
print(a[-1:])
print(a[0:-1])
print(a[3:-3])
del a[3]
print(a)

try try see

Lists

a = [9, 4, 8, 8, 7]
print(len(a))
print(max(a) - min(a))
print(a.count(8))
a.sort()
a.reverse()
print(a)

更多東西 猜猜看它在幹嘛!

練習

a = [9, 4, 8, 8, 7]
print(min(a) or max(a))

修改一個字元 使得輸出變成 9

練習

a = input().split(' ')
for i in range(len(a)):
    a[i] = int(a[i])
# code here

一開始輸入 N 個數字 找出第 K 大的數值

Functions

對於每一個\(x\)值,都恰有一個\(y\)值與之對應,則稱\(y\)是\(x\)的函數

-- 國中數學老師

Functions

def 函數名稱(引數一, 引數二 ...):
  做事坐視作勢;
  return 回傳值

Functions

def 加法(欸, 逼):
    return 欸 + 逼

print(加法(5, 2))

簡單 Java

Functions

def 吠市樹烈(恩):
    if 恩 <= 1:
        return 恩
    else:
        return 吠市樹烈(恩 - 1) + 吠市樹烈(恩 - 2)
    
print(吠市樹烈(5))

吠市樹烈第恩項

Functions

def 吠市樹烈(恩):
    樹烈 = [0, 1]
    for 項數 in range(2, 恩+1):
        樹烈.append(樹烈[-1] + 樹烈[-2])
    return 樹烈
    
print(吠市樹烈(5))

吠市樹烈前恩項

list 也可以當回傳值!

Functions

def 執行(操作, 欸, 逼):
    return 操作(欸, 逼)

def 加法(欸, 逼):
    return 欸 + 逼
    
print(執行(加法, 3, 5))

函數也可以是函數的引數!

λάμδα expression

加法 = lambda 欸, 逼: 欸 + 逼;
print(加法(3, 5))

print((lambda 欸, 逼: 欸 + 逼)(2, 4))

IPA: [lamða]

Functions

def 取得函數(運算):
    加法 = lambda 欸, 逼: 欸 + 逼;
    乘法 = lambda 欸, 逼: 欸 * 逼;
    if 運算 == '加法':
        return 加法
    else:
        return 乘法
    
print(取得函數('加法')(3, 5))
print(取得函數('乘法')(3, 5))

函數也可以是函數的回傳值!

練習

def 微分(欸夫):
  # code here
  return 欸夫的微分

def 函數(愛克斯):
  return 2*(愛克斯**2) + 7

print(微分(函數)(5))

設計一個函數\(F\)

它接受一個函數\(f\),回傳一個函數\(f'\) (\(f\)的微分)

兵勢第五

凡治衆如治寡,分數是也;鬥衆如鬥寡,形名是也;

三軍之衆,可使必受敵而無敗者,奇正是也;

兵之所加,如以碫投卵者,虛實是也。

今天要教的是

Divide & Conquer !

有興趣者請轉至週一C++演算法課

Set

集合

將數個物件歸類而分成為一個或數個形態各異的大小整體

集合(Sets)

  • 無序性
  • 互異性
  • 確定性
  • 特應性 (Atopic)

來一點 code 吧

# 宣告一個新的 set
qbx = {"Miku", "Ranran", "Ramen", "WW5"}
# 輸出整個 set
print(qbx)
# 依序輸出 set 裡的每個元素
for i in qbx:
  print(i)

有人發現問題嗎???

加入、刪除元素

# 宣告一個新的 set
programmer = {"Computer", "Algorithm", "Python", "Miku"}
# 加入一個元素
programmer.add("liver")
# 刪除一個元素
programmer.remove("Miku")

要是沒有這個元素可以刪除呢?

不問可否,不論曲直,非秦者去,為客者逐,然則是所重者在乎色樂珠玉,而所輕者在乎人民也,此非所以跨海內制諸侯之術也。

-李斯 諫逐客書-

換一種寫法

# 宣告一個新的 set
programmer = {"Computer", "Algorithm", "Python", "Miku"}
# 加入一個元素
programmer.add("liver")
# 刪除一個元素
programmer.discard("Miku")

len()

# 宣告一個新的 set
programmer = {"Computer", "Algorithm", "Python", "Liver"}
# 得到set的size
print(len(programmer))

逝者如斯,而未嘗往也;盈虛者如彼,而卒莫消長也

-蘇軾 赤壁賦-

 union() 

ericxiao = {"Biology", "Earth science"}
# 將兩個 set 合併
IOI2020 = programmer.union(ericxiao)

泰山不辭土壤,故能成其大;河海不擇細流,故能就其深;王者不卻眾庶,故能明其德。

-李斯 諫逐客書-

clear()、del

subject = {"Biology", "Earth science"}
# 刪除整個set內的元素
subject.clear()
# 刪除整個set
del subject

將欲取之,必先予之

-老子 道德經-

惟日月之逾邁兮,俟河清其未極。 冀王道之一平兮,假高衢而騁力。

王粲 登樓賦-

實作一個代辦事項清單,可以支援使用者隨時增加事項與刪除已完成事項,並能夠隨時輸出當前的代辦清單。

Dictionary

字典

為詞語提供音韻、釋義、例句用法等等的工具書

CREATE

Infor32 = {
  "Ericxiao": "C+++Algorithm",
  "Thomas": "MachineLearning",
  "25871014": "Python"
}
print(Infor32)

GET

Infor32 = {
  "Ericxiao": "C+++Algorithm",
  "Thomas": "MachineLearning",
  "25871014": "Python"
}
print(Infor32["25871014"])
print(Infor32.get("25871014"))

MODIFY

Eric = {
  "Age": 17,
  "Grade": 11,
  "Score": 799
}
Eric["Score"] = 800

當然也可以這樣

INFOR32 = {
  "Eric": {
  	"Age": 17,
  	"Grade": 11,
 	"Score": 800
  },
  "Sean": {
    "Age": 16,
    "Grade": 11
  }
}
print(INFOR32["Eric"]["Score"])

夫人之相與詞解,俯仰一世詞解,或取諸懷抱,晤言詞解一室之內;或因寄所託,放浪形骸之外。

-王羲之 蘭亭集序-

實作一個個人資料登記表,輸入一個人的姓名、年紀、身高、體重並紀錄之,每次可以用一個人的名字查到他的基本資料

Classes / Objects

物件

Create a Class

class Person:
  name = "03t"
  age = 17
p1 = Person()

俗說開天闢地,未有人民,女媧搏黃土做人。

__init__() Function

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
p1 = Person("Eric", 17)

劇務,力不暇供,乃引繩於泥中,舉以為人。

Class 裏頭可以有什麼

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def hello(self):
    print("Hello my name is " + self.name)
p1 = Person("Eric", 17)
p1.hello()

讓我們來回顧一下

你以為看這個是看好玩的嗎?

練習:

請實作出一個封神榜的dictionary,裏頭有2~4個封神榜裡的重要人物,由於怕有人看不懂上古漢語,因此這些人物必須有將數字轉為上古漢語數字的能力,並且替每個角色設計一個特殊能力

(Hint:  object裡可以有函數!)

虛實第六

孫子曰:凡先處戰地而待敵者佚,後處戰地而趨戰者勞。故善戰者,致人而不致於人。

Review 

不明的舉動 

A: 欸我的code又吃CE了,你要不要幫我debug

B: 你的變數忘記宣告了啦,而且這裡要加分號

A: 可是我是Python欸QQ

B: 那你幹嘛用DevC++啦

結構化程式設計 

循序

選擇

重複 

資料結構們

資料結構不外乎

變數

List

 

頂多多個 Set, Dictionary

但是那個太難了 國際競賽才會出現

好用的東西

函數
Lambda expression
Class
物件

物件導向程式設計

一堆物件在互相溝通
物件,顧名思義就是東西

例如:
你是一個東西
但我的腦袋就不是一個東西

類別與屬性

不同的東西可能有不同的類別
比如說桌子是桌子 椅子是椅子

而相同類別的東西也可能有不一樣的地方
稱為屬性
比如說180公分的人跟157.4的人
這個公分數就是人的屬性

類別與屬性

class people:
    height = 157.4

thomas = people()
print(thomas.height)
thomas.height = 180
print(thomas.height)

類別與屬性

class people:
    def __init__(self, height):
      self.height = height

thomas = people(157.4)
print(thomas.height)

類別與方法

是東西當然可以做事
相同類別的東西可以做相似的事

比如說人可以裝弱 吸塵器可以吸東西
而膝蓋什麼都不能做

像這樣東西可以做的事叫做方法

類別與方法

class people:
    def __init__(self, height):
      self.height = height
    def eat(self, food):
      self.height += food

thomas = people(157.4)
print(thomas.height)
thomas.eat(0.1)
print(thomas.height)

繼承

繼承,顧名思義就是搶財產
也就是偷方法與屬性

一個類別可以偷另一個類別的屬性
被偷的就稱為父類別

繼承

class people:
    def __init__(self, height):
      self.height = height
 
class hunter(people):
  def __init__(self, height, skill):
    super().__init__(height)
    self.skill = skill
  def hunt(self):
    print('hunting with skill', self.skill)

class farmer(people):
  ...
  ...

thomas = hunter(157.4, 100)
thomas.hunt()

覆載

不但能搶,還能搶過來再改掉

class people:
    def __init__(self, height):
      self.height = height
    def eat(food):
      self.height += food
 
class hunter(people):
  def __init__(self, height, skill):
    super().__init__(height)
    self.skill = skill
  def hunt(self):
    print('hunting with skill', self.skill)
  def eat(self, food):
    self.height += food
    self.skill += food / 10
    
thomas = hunter(157.4, 100)
thomas.eat(100)
thomas.hunt()

運算子

東西可以跟東西比大小

東西可以跟東西加 加起來可以是奇怪的東西

class 軟軟:
    def __init__(self, 軟肚子):
        self.軟肚子 = 軟肚子
    def __gt__(self, other):
        return self.軟肚子 > other.軟肚子

雪初音 = 軟軟(40)
聖誕軟 = 軟軟(50)
print(雪初音 > 聖誕軟)

運算子

__lt__
__le__
__gt__
__ge__
__eq__
__ne__
__add__
__iadd__
__sub__
__isub__
__mul__
__imul__
__truediv__
__iturediv__
__floordiv__
__ifloordiv__
__mod__
__imod__
__pow__
__ipow__
class 軟軟:
    def __init__(self, 軟肚子):
        self.軟肚子 = 軟肚子
    def __gt__(self, other):
        return self.軟肚子 > other.軟肚子
    def __add__(self, other):
        return self.軟肚子 + other.軟肚子

雪初音 = 軟軟(40)
聖誕軟 = 軟軟(50)
print(雪初音 > 聖誕軟)

練習

建中考幹題(?)

實作一個分數型別

可以加減乘除
可以賦值與比大小
可以印出來或轉成小數印出來

練習

實作一個動物類別
屬性有身長、體重...
方法有叫、睡覺...

實作兩個繼承動物型別的兩種型別
(例如 貓、蝗蟲)
並重載動物型別方法

軍爭第七

孫子曰:凡用兵之法,將受命於君,合軍聚衆,交和而舍,莫難於軍爭。

函數與模組

# mod.py
def add(a, b):
    return a + b
import mod
a = int(input())
b = int(input())
print(mod.add(a, b))

類別與模組

# mod.py
class people:
    def __init__(self, height):
      self.height = height
import mod
thomas = mod.people(157)
print(thomas.height)

模組與套件

套件萬能

有人說Python很爛,是因為太多套件

有人喜歡用Python,也是因為太多套件

 

numpy

scipy

socket

Keras

Pygame

套件萬能

下載套件蠻麻煩的

所以用 Google Colab (?)

 

https://colab.research.google.com/notebooks/welcome.ipynb#

NumPy

pip install 套件名稱

NumPy 陣列

# 引入 numpy 模組
import numpy as np
np1 = np.array([1, 2, 3])
np2 = np.array([3, 4, 5])

np3 = np.zeros([2, 3])
# array([[ 0.,  0.,  0.], [ 0.,  0.,  0.]])

np4 = np.ones([2, 3])
# array([[ 1.,  1.,  1.], [ 1.,  1.,  1.]])

NumPy 陣列

# 引入 numpy 模組
 import numpy as np
 np1 = np.array([1, 2, 3])
 np2 = np.array([3, 4, 5])

 # 陣列相加
 print(np1 + np2) # [4 6 8]

 # 顯示相關資訊
 print(np1.ndim, np1.shape, np1.dtype)
 # 1 (3,) int64 => 一維陣列, 三個元素, 資料型別

 np3 = np.array([1, 2, 3, 4, 5, 6])

NumPy 陣列

np3 = np3.reshape([2, 3])
print(np3.ndim, np3.shape, np3.dtype) # 2 (2, 3) int64
np3 = np3.astype('int64')
np3.dtype # dtype('int64')

NumPy 陣列

np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3[2]) # 3

np3 = np3.reshape([2, 3])
print(np3[1, 0]) # 4
np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3 > 3) # [False False False  True  True  True]
print(np3[np3 > 3]) # [4 5 6]

NumPy 陣列

np3 = np.array([1, 2, 3, 4, 5, 6])
np3 = np3.reshape([2, 3])
print(np3.sum(axis=1)) # 將 axis=1 橫向加總 [6 15]
print(np3.sum(axis=0)) # 將 axis=0 直向加總 [5 7 9]

Matplotlib

# 引入模組
import numpy as np
import matplotlib.pyplot as plt

Matplotlib

# 折線圖
x = np.array([3, 5, 3, 6])
y = np.array([4, 6, 8, 2])
plt.plot(x, y)
plt.show()
# 散佈圖
x = np.array([1, 3, 2, 8, 9])
y = np.array([4, 5, 3, 6, 3])
plt.scatter(x, y)
plt.show()

Matplotlib

# 圓餅圖
data = np.random.randint(1, 11, 5) # 生成
x = np.arange(len(data))

plt.pie(data)

plt.show()

Matplotlib

# 長條圖
labels = ['Physics', 'Chemistry', 'Literature', 'Peace']
foo_data = [3, 6, 10, 4]
bar_width = 0.5
xlocations = np.array(range(len(foo_data))) + bar_width

plt.bar(xlocations, foo_data, width=bar_width)

plt.title('Stock Price')
plt.show()

九變第八

孫子曰:凡用兵之法,將受命於君,合軍聚眾。圮地無舍,衢地合交,絕地無留,圍地則謀,死地則戰。途有所不由,軍有所不擊,城有所不攻,地有所不爭,君命有所不受。

人,要懂得應變!

大家學會了Python的基礎,本來要上PyGame遊戲引擎的,不過沒時間了,所以... 

首先,希望大家在聽這堂課的時候,同時以創造者和接受者的角度去看,去分析。

Game Design

&

User Experience 

希望大家能有這個知識,學習PyGame之後能做出屬於自己的小遊戲!

遊戲設計(Game Design)

狀態機器

(State Machine)

什麼是狀態機器?

類似一個流程圖,將遊戲的所有可能狀態與連結關係都紀錄於其中

狀態機器

圈圈加箭頭的東東

想像現在是1979年,你/妳是軟體公司Namco的一個員工,你/妳想要開發一個遊戲,稱為「Pacman」,你/妳想要寫出其中鬼的行走邏輯,你/妳會怎麼寫呢?

遊戲 Pacman 的遊戲頁面

可以表示成一個狀態機器!

整個遊戲都是FSM!

將「在遊戲中」、「設定」、「主頁面」想成一個大的FSM!

常見的遊戲類型

Common Patterns (Genres) in Game Design

目標

Ex. 高分,殺敵,摧毀某障礙物...

玩家

瓶頸、阻礙

改變此兩者以達到最佳的遊戲體驗!

平台遊戲

目標:達到右邊救公主

瓶頸:有敵人與自然障礙

Game: Super Mario

射擊遊戲

目標:射殺所與敵人

瓶頸:敵人會造成傷害,可能會死掉

Game: Raze

策略遊戲

目標:摧毀敵人陣營(比較多樣化)

瓶頸:通常有同樣的資源,所以必須以智取勝

Game: Warlords: Rise of Demons

格鬥遊戲

目標:打爆對方

瓶頸:對方想要打爆你

Game: Naruto vs Bleach (火影忍者對死神)

物理遊戲

目標:算出題目

瓶頸:題目超難

This is not a game

物理遊戲

目標:砸壞對方的城堡

瓶頸:要控制好彈藥、角度、力道

Game: Crush the Castle

閒置遊戲

目標:得到高分

瓶頸:耐心、時間有限

Game: Cookie Clickers

音樂遊戲

目標:得到高分

瓶頸:反應速度有限

Game: Lin Bing Hsuan

音樂遊戲

目標:得到高分

瓶頸:反應速度有限

Game: Beat Saber

這些只是常見的一些遊戲類型,當然還有很多!最好是融合以上兩、三個遊戲類型來創造新的遊戲!

閒置 + 策略 + 生存

Game: A Dark Room

得有策略性的閒置,還有RPG元素融合於其中

美術設計

The best and most beautiful things in the world cannot be seen or even touched - they must be felt with the heart.

--Helen Keller

Of course, for her, nor heard.

遊戲的美術風格很重要!

如果這個...

Game: 返校

的畫風是這樣...

Game : Moshi Monsters

美術大概就被炒魷魚了吧

來介紹一下常見的遊戲美術風格!

當然,每個人都有自己的變化,所以只是大概講一下

 

Voxel (方塊)風格

相對容易,為獨自開發者(Indie Developers)所偏好,還有3D!

Game: Minecraft

復古(8-Bit/Retro)風格

相對容易,也不一定要8-bit,只要有「格子感」即屬之。

Game: The Legend of Zelda

日本動漫風

就... 日本動漫油宅風格啊

Game: Doki Doki Literature Club

3D graphics 就算了,因為畢竟是要自己寫遊戲,幾乎不可能有太複雜的3D建模

遊戲美術風格千變萬化,程式的部分甚至沒有美術重!

User Experience

使用者體驗——讓大家都喜歡用你的程式!

不只要可用,還得易用

文字 < 圖片

指引玩家

  • 用箭頭指引玩家
  • 只給玩家一條路走
  • 以利誘之(金幣,加成之類的)
  • 不要讓玩家不知道要幹嘛!

邊玩邊教

  • 單純教學很智障
  • 設計一些關卡,慢慢讓玩家熟悉

Game: FireBoy & WaterGirl

有一個終極目標

  • 不是每一個遊戲都一定要有
  • 讓玩家在玩的同時有一個終極的目標

Game: Pokemon

要成為區域冠軍是神奇寶貝中終極目標之一,此為迄今七個區域的冠軍。

回饋系統

  • 做一件事就有短期回饋/長期回饋
  • 沒有廣島回饋
  • 讓玩家一直想玩像某人吸毒一樣
  • Ex. 成就系統,造成傷害

Show, not tell

  • 是剛才的東東的廣義
  • 盡量透過遊戲來推展故事,不要有一個旁白在那邊說

HUD

  • 人通常一次只能記憶七個東西
  • 幫助他們記憶!有一個區域寫著資訊也不錯呀
  • 不要影響到遊戲

Game: League of Legends

就這樣了!

希望大家可以運用所學,寫出屬於自己的小遊戲!

Python小遊戲

By 林尚廷

Python小遊戲

INFOR 32nd x 33rd 放學社課 -- Python 小遊戲

  • 665