2048遊戲:數字合併方法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

2048遊戲是個單人遊戲,玩家在 4 x 4 的格子內使用上、下、左、右來移動格子內的數字,移動之後相鄰且相同的數字會加總起來。(詳細遊戲規則可參考:https://char.tw/blog/post/41098784)

而此遊戲其中的數字合併加總的方法被CourseraPrinciples of computing part I
當成一個mini project作為python練習題,於是筆者照著網頁所提到的方法來練習一下。方法如下:
步驟一
將輸入的非零數字往左移動。
例如:
[0, 2, 0, 2] ==> [2, 2, 0, 0]
[2, 0, 0, 2] ==> [2, 2, 0, 0]

步驟二
合併相同的數字。
例如:
[2, 2, 0, 0] ==> [4, 0, 0, 0]
[2, 2, 2, 0] ==> [4, 2, 0, 0]
[2, 4, 4, 2] ==> [2, 8, 2, 0]


實作出來的Python程式碼

演算法:二分搜尋法( Binary Search Algorithm )

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

最近想著怎麼教國中生二分搜尋法(Binary Search),就找到在可汗學院上的猜數字遊戲,就將此網頁的教學觀念改成在下的版本。

可汗學院上的猜數字有兩題,一題是猜1到16的數字:


一題是猜1到300的數字:

根據以上的範例,就找了這個網頁 http://ftp.phjh.tc.edu.tw/~klychen/Research/FinalNumber/ChooseNum.php 給學生試試,並詢問學生底下兩個問題:

  1. 能在幾次內猜中?
  2. 用了什麼策略?

之後再解釋怎麼做才能保證在10次內猜中 1 到 1000 之間的數字,並解釋什麼是二分搜尋法,
結果發現其實有些國中生早就有怎麼解題的觀念了,只是不知道這個觀念是二分搜尋法的基礎,二分搜尋法適合在已經排序好的資料,而且也是個類似 divide and conquer 的方法。

<輕鬆的運算思維>一文閱讀心得

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此文為閱讀 <輕鬆的運算思維> 一文的心得。

運算思維可以融入其他科目中,例如數學或國文。因為「預測與邏輯判斷」是運算思維的核心之一。

舉例來說,我們要用電腦來判斷兩個數字大小時,流程可能如下(以中文表示):
請輸入第一個數字。
請輸入第二個數字。
如果 第一個數字
大於 第二個數字 時
    顯示 【第一個數字比第二個數字大】
否則
    顯示 【第二個數字比第一個數字大】
可使用 Scratch 來完成:

將積木換成英文版:


也可以 Python 來達成:



最後以 C 程式語言當結尾:

簡言之,若不考慮用哪種程式語言時,可以用中文的句子來描述並訓練一些邏輯概念,邏輯有了之後,利用 Blockly 相關工具(例如陳會安的ArduBlockly中文離線版、Blockly的範例程式CodeEditor)來熟悉一些邏輯觀念與程式語言語法之間的轉換,最後再開始學習程式語言的語法(筆者就是曾經深受程式語言的語法所困擾)。數學的例子可參考第一式:必殺-剪刀石頭布

OpenCV-Python on Windows with Anaconda 3

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

OpenCV is a open source computer vision library for real-time applications. It supports many programming languages such as C++, C, Python and Java. In this tutorial, OpenCV is installed with Anaconda 3 running on Windows 10. OK, let's get started.
OpenCV 是一套開發電腦視覺即時處理的函式庫,支援多種程式語言,例如C++、C、Python、Java,本文會在Windows 10上安裝OpenCV與Anaconda 3,我們開始吧!

1. Anaconda 3 安裝 (Anaconda 3 Installation)

Go to https://www.anaconda.com/download/ and download Anaconda 3. Then install it with default settings.
至 https://www.anaconda.com/download/ 下載 Anaconda 3,使用預設設定來安裝。



2. 使用 Anaconda Prompt (Using Anaconda Prompt)


Open the Anaconda Prompt in Anaconda 3 application folder. And test it with the command:
開啟應用程式Anaconda中的Prompt,輸入下面指令:

1
conda --version

The conda version will display on the prompt windows:
conda的版本資訊會顯示在 prompt 視窗中:


3. 建立Python環境 (Create an Python Environment)

Enter the following commands in the prompt windows:
在prompt視窗中輸入下面指令:

1
2
conda create --name userNameCV python=3.6
activate userNameCV

The "userNamceCV" could be any name you like.
"userNamceCV" 可以任意命名。



Checking the Python version:
檢查 Python 版本:
1
python--version




4. 安裝 OpenCV 3 與相依套件 (Install OpenCV 3 and Dependencies)

Enter the following commands in the prompt windows:
在prompt視窗中輸入下面指令:
1
2
3
conda install numpy
conda install anaconda-client
conda install -c conda-forge opencv






Now, checking OpenCV 3 is installed.
檢查Python版本:
python
>>> import cv2
>>> cv.__version__


Congratulation!!! Now, you can use Python and OpenCV3.
恭喜,現在你可以用Python來執行OpenCV3了。

References:
[1] https://github.com/conda-forge/opencv-feedstock/blob/master/README.md
[2] https://chrisconlan.com/installing-python-opencv-3-windows/

OpenCV-Python in Windows 在Windows上使用OpenCV-Python

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

筆者嘗試在自己的筆電上裝OpenCV-Python,參考的文章為:Install OpenCV-Python in Windows。需要下載三個軟體套件:

  1. Python-2.7.x
  2. Numpy
  3. Matplotlib (選擇性的套件,建議安裝,因為OpenCV的教學文章常用到)


使用預設選項安裝此三個套件,而Python會安裝在C:\Python27\

安裝完後請開啟 Python IDLE,輸入 import numpy檢查Numpy是否可正常使用。


從 sourceforge site下載最新版的 OpenCV,並解壓縮。

opencv/build/python/2.7/x86/ cv2.pyd 複製到 C:/Python27/lib/site-packages


請開啟 Python IDLE,輸入 import cv2print( cv2.__version__ ) 指令,若有輸出 OpenCV 的版本,就是安裝成功了。

接下來就可以使用 OpenCV 與 Python 來做 Computer Vision 相關的應用了。

程式設計師需要知道的圖形使用者介面(GUI)觀念 ( Basic GUI Concepts for a Programmer )

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

早期的電腦(DOS時代)都是文字介面,也就沒什麼講究畫面的設計方式,約莫五六年前吧,UI設計已經成為一個產品重要的因素之一,最經典的例子就是iPhone手機的硬體介面。想了解什麼是UI可參考此文:什麼是 UI/使用者介面。本文會以程式設計師的角度來談談所需要知道的觀念:

  • 什麼是圖形使用者介面(Graphical User Interface)。
  • 事件處理(Event Handling)。
  • MVC模式(Model–view–controller)。
  • 手機GUI程式和電腦GUI程式有什麼不同。


什麼是圖形使用者介面(Graphical User Interface)

簡單來說就是使用者與電腦互動的圖形畫面,例如Linux上的Unity、GNOME、KDE、Android手機畫面、iPhone手機畫面等。請參考由 https://en.wikipedia.org/wiki/Graphical_user_interface所節錄的畫面:

事件處理(Event Handling)

看過GUI的畫面之後,程式設計師應該會想知道如何寫一個GUI程式吧!那就需要了解GUI程式中是如何處理使用者按下滑鼠左鍵、用鍵盤打字等訊息。這部分的觀念清楚後,要學GUI程式設計就不會那麼難了。首先可以玩玩Code.org上的製作一個Flappy遊戲來認識什麼是事件。

再來看一下鍵盤與滑鼠事件在電腦中的運作情況,見下圖:

電腦上所有的硬體都先由驅動程式做處理,當使用者按下滑鼠左鍵時,驅動程式會通知作業系統「滑鼠左鍵按下」,接著作業系統會將此訊息送給有註冊「滑鼠左鍵按下」事件且運用中的程式,接著就會根據程式中的功能做處理,以「按下鍵盤」事件為例子,整個流程大約如下:

  1. 使用者「按下鍵盤」。
  2. 驅動程式通知作業統使用者「按下鍵盤」。
  3. 作業系統的Event API發送訊息「按下鍵盤」給有註冊訊息處理的程式(Programs)。
  4. 執行 FunctionA、FunctionB、FunctionC 程式功能。

以上是精簡過的流程,不同的作業系統與不同的GUI Libraries會有些差異。有了以上的觀念後,就可以在程式中來做GUI的事件處理了。以Java語言為例(詳細解說可參考此文),在程式內的流程如下圖:


以按鈕處理滑鼠按下的事件為例,上圖的Event Source就是Button,Event Listener為Mouse Listener,而Event Handler可能有五種:press、release、click、enter、exit。程式碼大概如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MouseClickDemo implements MouseListener {
        // Other components initialization
        // Register for mouse events on Button.
        btn.addMouseListener(this);
        addMouseListener(this);
    ...

    public void mousePressed(MouseEvent e) {
 // don't care, do nothing
    }

    public void mouseReleased(MouseEvent e) {
 // don't care, do nothing
    }

    public void mouseEntered(MouseEvent e) {
 // don't care, do nothing

    }

    public void mouseExited(MouseEvent e) {
 // don't care, do nothing
    }

    public void mouseClicked(MouseEvent e) {
 // Put your code here to handle mouse click event
    }

}

若是用 Python 和 Tkinter 呢?底下為一個參考的做法:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# !/usr/bin/python3
import tkinter
from tkinter import messagebox

mainWin = tkinter.Tk()

# Event Handler for mouse click
def btnHandler():
   messagebox.showinfo( "Btn Click", "Button click")

# Register mouse click event
Btn = tkinter.Button(mainWin, text ="Click Me", command = btnHandler)

Btn.pack()
mainWin.mainloop()
其他語言就請參考所用的 GUI 程式庫了。(題外話:Windows上的組合語言可參考小木偶的網頁)

MVC模式(Model–view–controller)

MVC 是一種設計UI的軟體架構模式,原本是在桌面環境下的設計架構,目前在網頁(web)、行動設備(Mobile)等軟體開發上越來越流行了,甚至有些軟體開發的framework都依照MVC的架構來設計函式庫,所以開始來聊聊MVC的觀念,底下會以Web Application來說明MVC,請見下圖:
Model:由Controller來管理,用來儲存與表示資料結構。若是以資料庫系統來儲存的話,Model就是用來執行新增(Create)、查詢(Query)、修改(Modify)之資料庫系統。

View:呈現在使用者面前的資訊,可以為網頁或是網頁上的圖片、文字等,資料處理後的網頁結果就是View。

Controller:用來處理使用者與Model之間的操作,Web Server可為Web Application 中的 Controller。

手機GUI程式和電腦GUI程式有什麼不同

目前手機作業系統以Android與iOS為主流,所以會針對這兩個系統做說明,而目前Android所採用的程式語言為Java,所以在GUI的事件處理方式與桌機上的Java GUI是一樣的方式,而Android系統的GUI就不是以AWT或是SWING為函式庫,而是在Java API Framework下的View System,整體架構跟Desktop不一樣。而 iOS 呢?用的是Cocoa API,多了個 Event Loop 的觀念,而大多數的GUI函式庫是以 Event Loop 為事件處理的實作方式。Cocoa API 也是用事件處理的方式來判斷「鍵盤按下、滑鼠左鍵按下」等事件。總結一句話,「用的GUI函式庫不一樣,呈現畫面的API就不一樣,但事件處理到處存在。」

以上用圖片與簡短文字說明,希望讀者對GUI程式設計有個基礎觀念。