我在國小課後社團任教,課程名稱是 "Maker 藍牙遙控車",顧名思義,除了教孩子們組裝車子之外,還需要一個手機程式,透過藍牙來遙控車子,這個APP是用APP Inventor 2寫成的,開啟APP之後,除了可以用畫面上的方向鍵來控制車子,也可以用"體感方式"來命令車子前進,後退,左轉和右轉, 把收機平放,前傾就是前進,後仰就是後退,左傾是左轉,右傾就是右轉,蠻好玩的。
螞蟻是一種非常神奇的生物,個子雖小,卻可以舉起自己體重 52 倍的東西,拖運超過自己體重1400 倍的物體。而且不只辛勤工作,更有龐大的組織能力,每天一點一滴的努力,終能構築出令人驚嘆的螞蟻宮殿。希望在學習的過程中,我們也能像螞蟻一樣,努力不懈,慢慢累積,有一天也可以建造出自己的知識王國。 蘋果公司創辦人賈伯斯曾說過: Stay hungry, stay foolish.(求知若渴,虛心若愚)。保持學習的習慣,從學習中尋找樂趣,記錄學習過程,並分享給其他的學習者~~~
2020年7月22日 星期三
用 APP Inventor 2 寫成手機遙控器(藍牙遙控車): squid v.5 大魷魚遙控器
我在國小課後社團任教,課程名稱是 "Maker 藍牙遙控車",顧名思義,除了教孩子們組裝車子之外,還需要一個手機程式,透過藍牙來遙控車子,這個APP是用APP Inventor 2寫成的,開啟APP之後,除了可以用畫面上的方向鍵來控制車子,也可以用"體感方式"來命令車子前進,後退,左轉和右轉, 把收機平放,前傾就是前進,後仰就是後退,左傾是左轉,右傾就是右轉,蠻好玩的。
2020年6月14日 星期日
APP Inventor 記憶卡牌的手機遊戲
我用APP Inventor寫的手機遊戲,規則是有八組不同數字的牌各兩張(共16張牌),分別隨機放在不同的位置,遊戲開始前給玩家看3秒後蓋牌,玩家須把相同的牌選出來,如果選錯牌遊戲會凍結兩秒才可繼續選牌,如果選對牌可馬上繼續選牌。遊戲花費時間越少表示記憶能力越高超。我們家大姊最快4秒,歡迎大家來挑戰喔!
APP Inventor寫手機程式超簡單,想知道這個遊戲怎麼寫嗎?我可以教你喔! 想讓孩子學APP inventor的家長可以聯絡"大魷魚創客"喔! 網址:https://www.facebook.com/csquid.maker/
APP Inventor寫手機程式超簡單,想知道這個遊戲怎麼寫嗎?我可以教你喔! 想讓孩子學APP inventor的家長可以聯絡"大魷魚創客"喔! 網址:https://www.facebook.com/csquid.maker/
2020年5月12日 星期二
2020年5月4日 星期一
最簡單的圖片裁切和縮放方式
由於Facebook, IG, Line等社群媒體的盛行,遇到圖片編修的機率非常高,要嘛太大太小需要改變尺寸,要嘛比例不對需要裁減,當然有很多影像處理軟體和線上網站可用,但是各位知道你得電腦中就有一個不用花錢,小而美的工具軟體可用嗎?
那就是微軟的小畫家。
Q. 如何開啟小畫家?
A. 它在"開始" -> "Windows附屬應用程式" -> "小畫家"
Q. 如何裁切圖片?
A. 開啟小畫家之後,按檔案->開啟舊檔 選到你要的圖片,然後選擇圖中的選取,這個時候你就可以任意選取圖中的一個方形區域,作為裁切的標的。決定裁切的區域之後按裁切,然後就完成了,記得另存新檔或存檔。
那就是微軟的小畫家。
Q. 如何開啟小畫家?
A. 它在"開始" -> "Windows附屬應用程式" -> "小畫家"
Q. 如何裁切圖片?
A. 開啟小畫家之後,按檔案->開啟舊檔 選到你要的圖片,然後選擇圖中的選取,這個時候你就可以任意選取圖中的一個方形區域,作為裁切的標的。決定裁切的區域之後按裁切,然後就完成了,記得另存新檔或存檔。
裁切前的圖片
選取你要的區域
裁切之後的圖片
Q. 如何縮放圖片?
A. 開啟小畫家之後,選取你要的圖片,然後點選"調整大小",然後就可以依照需要進行大小的調整,調整方式有兩種輸入百分比或像素,另外,系統預設是等比例縮放,如果你要長寬任意調整,就必須把"維持外觀比例"的選項取消。
"調整大小"的位置
縮放圖片時,要注意這三個選項,依需要選擇。
等比例縮小50%
非等比例縮放,會造成圖片變形,宜謹慎使用。
2020年5月1日 星期五
Arduino 循跡車程式
/**************************************************
Arduino 循跡車程式
硬體: Arduino Uno + L298N + TCRT5000 + TT減速馬達
原理是用TCRT5000感應模組(車頭左右各一個),
當感應器偵測到黑色物體時會傳回1,否則會傳回0,
據此我們可以判斷(左,右) =
(0,0)時,車子剛好在黑線這上方,所以直行,
(1,0)時,左邊已經壓線,所以要左轉,
(0,1)時,右邊已經壓線,所以要右轉,
(1,1)時,左右兩邊都已壓在黑線上,所以停止車子。
注意!!!!!
車子速度不可太快,否則一下子就會衝出線外,無法控制。
大魷魚創客工作室 2020.4.4
https://www.facebook.com/groups/806191766461206/
***************************************************/
int R_TCRT_Pin = 2; //右邊感應器連接在D2
int L_TCRT_Pin = 12; //左邊感應器連接在D12
const int IN1 = 3; //馬達控制板連接在D3, D5, D6, D9
const int IN2 = 5;
const int IN3 = 6;
const int IN4 = 9;
void setup() {
Serial.begin (9600);
pinMode(R_TCRT_Pin, INPUT); //把D2設成輸入模式
pinMode(L_TCRT_Pin, INPUT); //把D12設成輸入模式
}
void loop()
{
int R=0, L=0; //存放左,右感應器狀態的變數,預設值給定為0
byte speed = 128;
R = digitalRead(R_TCRT_Pin); //讀取右邊感應器的狀態
L = digitalRead(L_TCRT_Pin); //讀取左邊感應器的狀態
if( R==0 && L==0 ) Forward(speed); // (白,白): 車子剛好在黑線正上方,所以直行。
if( L==1 && R==0 ) Left(speed); // (黑,白): 左邊已經壓線,所以要左轉。
if( L==0 && R==1 ) Right(speed); // (白,黑): 右邊已經壓線,所以要右轉。
if( L==1 && R==1 ) Stop(); // (黑,黑): 左右兩邊都已壓在黑線上,所以停止車子。
}
void Forward(byte speed) /* 車子前進的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2, speed);
analogWrite(IN3, speed);
analogWrite(IN4, 0);
}
void Back(byte speed) /* 車子後退的函數 */
{ analogWrite(IN1, speed);
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, speed);
}
void Left(byte speed) /* 車子左轉的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2,speed);
analogWrite(IN3, 0);
analogWrite(IN4, speed);
}
void Right(byte speed) /* 車子右轉的函數 */
{ analogWrite(IN1, speed);
analogWrite(IN2, 0);
analogWrite(IN3, speed);
analogWrite(IN4, 0);
}
void Stop() /* 車子停止的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, 0);
}
Arduino 循跡車程式
硬體: Arduino Uno + L298N + TCRT5000 + TT減速馬達
原理是用TCRT5000感應模組(車頭左右各一個),
當感應器偵測到黑色物體時會傳回1,否則會傳回0,
據此我們可以判斷(左,右) =
(0,0)時,車子剛好在黑線這上方,所以直行,
(1,0)時,左邊已經壓線,所以要左轉,
(0,1)時,右邊已經壓線,所以要右轉,
(1,1)時,左右兩邊都已壓在黑線上,所以停止車子。
注意!!!!!
車子速度不可太快,否則一下子就會衝出線外,無法控制。
大魷魚創客工作室 2020.4.4
https://www.facebook.com/groups/806191766461206/
***************************************************/
int R_TCRT_Pin = 2; //右邊感應器連接在D2
int L_TCRT_Pin = 12; //左邊感應器連接在D12
const int IN1 = 3; //馬達控制板連接在D3, D5, D6, D9
const int IN2 = 5;
const int IN3 = 6;
const int IN4 = 9;
void setup() {
Serial.begin (9600);
pinMode(R_TCRT_Pin, INPUT); //把D2設成輸入模式
pinMode(L_TCRT_Pin, INPUT); //把D12設成輸入模式
}
void loop()
{
int R=0, L=0; //存放左,右感應器狀態的變數,預設值給定為0
byte speed = 128;
R = digitalRead(R_TCRT_Pin); //讀取右邊感應器的狀態
L = digitalRead(L_TCRT_Pin); //讀取左邊感應器的狀態
if( R==0 && L==0 ) Forward(speed); // (白,白): 車子剛好在黑線正上方,所以直行。
if( L==1 && R==0 ) Left(speed); // (黑,白): 左邊已經壓線,所以要左轉。
if( L==0 && R==1 ) Right(speed); // (白,黑): 右邊已經壓線,所以要右轉。
if( L==1 && R==1 ) Stop(); // (黑,黑): 左右兩邊都已壓在黑線上,所以停止車子。
}
void Forward(byte speed) /* 車子前進的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2, speed);
analogWrite(IN3, speed);
analogWrite(IN4, 0);
}
void Back(byte speed) /* 車子後退的函數 */
{ analogWrite(IN1, speed);
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, speed);
}
void Left(byte speed) /* 車子左轉的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2,speed);
analogWrite(IN3, 0);
analogWrite(IN4, speed);
}
void Right(byte speed) /* 車子右轉的函數 */
{ analogWrite(IN1, speed);
analogWrite(IN2, 0);
analogWrite(IN3, speed);
analogWrite(IN4, 0);
}
void Stop() /* 車子停止的函數 */
{ analogWrite(IN1, 0);
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, 0);
}
2020年4月21日 星期二
2020年4月4日 星期六
把Python程式變有趣:情人的愛心 ( 附 Python 完整程式碼)
白色情人節剛過,應景一下,用Python寫一個程式,在二維座標上,使用三角函數計算出一個愛心的圖形,並用matplotlib畫出來。獻給天下有情人,不管是結婚了沒。
這個程式很簡單,上半部是兩個半圓,下半部則是用 acos()的函數來完成,幾行程式就可以完成一個漂亮的心型圖案,寫這類程式可以讓寫程式本身變得更有趣,也可以把它當成另類禮物,送給你的愛人,是不是很酷呢。以下就是完整程式碼:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.set_aspect('equal')
plt.rcParams['font.sans-serif'] = ['Noto Sans CJK TC']
#plot part1 ( y >= 0 )
left = -2.0
right = 2.0
step = 0.0001
x = np.arange(left, right, step)
y = np.sqrt(1.0 - (np.abs(x) - 1.0)**2 )
ax.plot(x, y, color='#ff0000', linewidth = 10)
#plot part2 ( y < 0 )
y = np.arccos(1.0 - np.abs(x)) - np.pi
ax.plot(x, y, color='#9F0000', linewidth = 10)
ax.set(xlabel='x', ylabel='y', title='白色情人節快樂 ^_^')
ax.grid(color='b', linestyle='--', linewidth=1)
ax.legend(['y=sqrt(1-(|x|-1)^2)', 'y=acos(1-|x|)-PI'])
plt.show()
2020年2月4日 星期二
用Python寫經典遊戲"貪食蛇"(Snake Game),只要200行程式,真的! (附完整程式碼 Full Source code)
這個遊戲其實不難,我是用PyQt5的套件來實現我的視窗系統:先開視窗,產生20x20個Label,然後再用一個Queue來記錄蛇的位置,再來隨機放置紅點,使用一個timer來計時,每0.2秒觸發一次檢查程式並使蛇前進,寫出一個判斷是否碰觸到蛇身的函數,再穿插簡單的判斷,那整個程式就完成了。
不囉嗦,以下就是完整程式碼,請參考。如有任何問題,歡迎隨時跟我討論。
from PyQt5.QtWidgets import QWidget, QLabel
from PyQt5.QtCore import QTimer, Qt
import random
class Point:
pass
bonus = Point()
GAME_ROW = 20
GAME_COL = 20
GRID_WIDTH = 20
GRID_HEIGHT = 20
SNAKE_INIT_ROW = 10
SNAKE_INIT_LEMGTH = 5
SNAKE_Q_LENGTH = GAME_ROW * GAME_COL + 100
SNAKE_COLOR = "background-color:#ffffff;"
SNAKE_HEAD_COLOR = "background-color:#ffff00;"
BONUS_COLOR = "background-color:#ff0000;"
BG_COLOR = "background-color:#000000;"
snake_head = SNAKE_INIT_LEMGTH - 1
snake_tail = 0
SNAKE_ADD_LENGTH = 5
snake_move = 1
class myWindow(QWidget):
def __init__(self):
super().__init__()
def keyPressEvent(self, event):
global snake_dir
if event.key() == Qt.Key_Up:
if snake_dir != 2:
snake_dir = 1
if event.key() == Qt.Key_Down:
if snake_dir != 1:
snake_dir = 2
if event.key() == Qt.Key_Left:
if snake_dir != 4:
snake_dir = 3
if event.key() == Qt.Key_Right:
if snake_dir != 3:
snake_dir = 4
window = myWindow()
def inside_snake(mode, x, y):
#print('inside_snake():')
global snake_q, snake_head, snake_tail, SNAKE_Q_LENGTH
s = snake_head
e = snake_tail
if mode == 1:
if x == snake_q[s].x and y == snake_q[s].y:
#print('inside_snake(1)')
return True
while True:
s -= 1
if s == -1:
s = SNAKE_Q_LENGTH - 1
if x == snake_q[s].x and y == snake_q[s].y:
#print('inside_snake(0)')
return True
if s == e:
break
return False
def new_bonus():
global bonus, grids, GAME_COL, GAME_ROW, BONUS_COLOR
while True:
bonus.x = random.randint(0, GAME_COL-1)
bonus.y = random.randint(0, GAME_ROW-1)
if not inside_snake(1, bonus.x, bonus.y):
break
#print('new_bonus():', bonus.x, bonus.y)
grids[bonus.y][bonus.x].setStyleSheet(BONUS_COLOR)
def game_init():
global GAME_ROW, GAME_COL, grids, BG_COLOR, SNAKE_INIT_LEMGTH, snake_q, snake_head, snake_tail, snake_dir, game_mode, snake_move, score
for i in range(GAME_ROW):
for j in range(GAME_COL):
grids[i][j].setStyleSheet(BG_COLOR)
for i in range(SNAKE_INIT_LEMGTH):
snake_q[i].y = SNAKE_INIT_ROW;
snake_q[i].x = i;
grids[SNAKE_INIT_ROW][i].setStyleSheet(SNAKE_COLOR)
snake_head = SNAKE_INIT_LEMGTH - 1
snake_tail = 0;
grids[snake_q[snake_head].y][snake_q[snake_head].x].setStyleSheet(SNAKE_HEAD_COLOR)
while True:
snake_dir = random.randint(1, 4)
if snake_dir != 3:
break
game_mode = 1
snake_move = 1
score = 0
new_bonus()
#--------------------------------- main program ----------------------------------------------
grids = []
for y in range(GAME_COL):
g_row=[] #for 1 row only
for x in range(GAME_ROW):
g = QLabel(window)
g.setStyleSheet(BG_COLOR) #set all grids with black color
g.setFixedSize(GRID_WIDTH, GRID_HEIGHT)
g.move(GRID_WIDTH*x, GRID_HEIGHT*y)
g_row.append(g)
grids.append(g_row) #create 2-D array of grids
snake_q = []
for i in range(SNAKE_Q_LENGTH):
p = Point()
snake_q.append(p)
for i in range(SNAKE_INIT_LEMGTH):
p = Point()
p.y = SNAKE_INIT_ROW
p.x = i
snake_q[i] = p
grids[SNAKE_INIT_ROW][i].setStyleSheet(SNAKE_COLOR)
grids[snake_q[snake_head].y][snake_q[snake_head].x].setStyleSheet(SNAKE_HEAD_COLOR)
while True:
snake_dir = random.randint(1, 4)
if snake_dir != 3:
break
game_mode = 1
snake_move = 1
score = 0
new_bonus()
timer = QTimer(window)
def timer_tick():
global snake_q, snake_head, SNAKE_Q_LENGTH, GAME_ROW, GAME_COL, timer, SNAKE_ADD_LENGTH, snake_move, score, snake_tail, BONUS_COLOR
#print('snake_q len=', len(snake_q), 'snake_head=', snake_head)
y = snake_q[snake_head].y
x = snake_q[snake_head].x
snake_head += 1
if snake_head == SNAKE_Q_LENGTH:
snake_head = 0
snake_q[snake_head].y = y
snake_q[snake_head].x = x
if snake_dir == 1:
snake_q[snake_head].y -= 1
if snake_q[snake_head].y < 0:
snake_q[snake_head].y = GAME_ROW - 1
if snake_dir == 2:
snake_q[snake_head].y += 1
if snake_q[snake_head].y >= GAME_ROW:
snake_q[snake_head].y = 0
if snake_dir == 3:
snake_q[snake_head].x -= 1
if snake_q[snake_head].x < 0:
snake_q[snake_head].x = GAME_COL - 1
if snake_dir == 4:
snake_q[snake_head].x += 1
if snake_q[snake_head].x >= GAME_COL:
snake_q[snake_head].x = 0
grids[snake_q[snake_head].y][snake_q[snake_head].x].setStyleSheet(SNAKE_HEAD_COLOR)
grids[y][x].setStyleSheet(SNAKE_COLOR)
if inside_snake(1, bonus.x, bonus.y):
new_bonus()
snake_move += SNAKE_ADD_LENGTH
score += 100
print('score=', score)
if inside_snake(0, snake_q[snake_head].x, snake_q[snake_head].y):
print('game over')
timer.stop()
game_init()
timer.start()
return
if snake_move == 1:
grids[snake_q[snake_tail].y][snake_q[snake_tail].x].setStyleSheet(BG_COLOR)
snake_tail += 1
if snake_tail == SNAKE_Q_LENGTH:
snake_tail = 0
else:
snake_move -= 1
window.show()
timer.timeout.connect(timer_tick)
timer.start(200)
訂閱:
文章 (Atom)