來一場競速的排位賽吧!駕駛著自己的車子享受在馬路上狂飆的快感吧!注意前方與左右來車來妨礙你,閃避其他車子的步步逼近,同時還要小心速度太慢被遠遠甩在後頭喔!關卡還有金幣競爭模式,在競速之餘盡可能的去搶奪路上散落的金幣,衝向終點成為最終贏家。
- 增加 autoCar.py 可在AI使用,並自動玩遊戲 (感謝台南市資訊教育中心開發提供)
- 更新程式碼內容,以運行於 MLGame 9.5.*
- 直接啟動 main.py 即可執行
# main.py
game = RacingCar.RacingCar(user_num=2, game_mode="NORMAL", car_num=50, racetrack_length=10000, rounds=1, sound="off")
user_num
:玩家數量,最多可以4個玩家同時進行同一場遊戲,如果以鍵盤控制,最多只能2位玩家。game_type
:遊戲模式,分為普通模式(NORMAL
)、重生模式(RELIVE
)與金幣模式(COIN
)。car_num
:車子數量的上限,包含玩家與電腦的車都會被計入。rounds
:遊戲重複啟動的次數,系統將計算每輪遊戲結果並提供積分。sound
:可輸入on
或是off
,控制是否播放遊戲音效。racetrack_length
:遊戲終點距離
- 遊戲最多可以四個人同時進行,有普通模式、金幣模式和重生模式。
- 使用鍵盤 上、下、左、右 (1P)與 W、A、S、D (2P)控制自走車。
- 若車子之間發生碰撞,則雙方皆淘汰出局。
- 在重生模式下,玩家與其他車子發生碰撞時並不會出局,唯速度減速為0,並進入三秒的無敵時間,此三秒內與其他車子碰撞不會導致玩家降速。
- 在金幣模式下,玩家之間可以控制車子爭奪金幣。
- 普通模式:以最快的速度到達終點。
- 金幣模式:在遊戲時間截止前,盡可能吃到更多的金幣
- 重生模式:以最快的速度到達終點。
- 無論是何種遊戲模式,車子能順利到達終點即可過關。
- 車子在遊戲過程中被淘汰,即算失敗。
-
行動機制
- 上鍵(W鍵):車子以3px/frame的速度向左平移
- 下鍵(S鍵):車子以3px/frame的速度向右平移
- 右鍵(D鍵):車子向前加速
- 左鍵(A鍵):車子剎車減速
車子的最高速度為15px/frame,當車子左右平移時速度將會略微下降為14.5px/frame。 車子沒有加速或剎車時,會以0.9px/frame左右的速度怠速前進。
-
遊戲物件
- 螢幕大小 1000 x 700px
- 車子大小 60 x 30px
- 金幣大小 30 x 30px
-
物件移動方式
- 電腦的車 車子從畫面左方或右方出現,不會切換車道。 前方有車(不論是電腦還是玩家)會剎車減速,否則不斷加速至最高速 每台車最高速度皆不一樣,範圍為10~14。
- 金幣 隨機從畫面右方出現,以5 px/frame的速度移動。 電腦車子碰到金幣時金幣不會消失。
# Begin from MLGame 9.5.*
python -m mlgame -i ml/ml_play_template.py ./ --game_type COIN --car_num 40 --racetrack_length 10000 --round 2 --sound off
遊戲參數依序是 game_type
car_num
racetrack_length
rounds
sound
class MLPlay:
def __init__(self,ai_name:str,*args,**kwargs):
self.other_cars_position = []
self.coins_pos = []
self.ai_name = ai_name
print("Initial ml script")
print(ai_name)
print(kwargs)
def update(self, scene_info: dict,*args,**kwargs):
"""
Generate the command according to the received scene information
"""
# print(scene_info)
if scene_info["status"] != "GAME_ALIVE":
return "RESET"
return ["SPEED"]
def reset(self):
"""
Reset the status
"""
# print("reset ml script")
pass
- scene_info 的資料格式如下
{
"frame": 25,
"id": 1,
"x":20,
"y": 260,
"all_cars_pos": [
[20,260],
[20,260]
],
"distance": 27,
"velocity":0.9,
"coin_num":0,
"coin":[
[825,460]
],
"status": "GAME_ALIVE"
}
frame
:遊戲畫面更新的編號。id
:玩家的遊戲編號。x
:玩家車子的X座標,表示車子的左邊座標值。y
:玩家車子的Y座標,表示車子的上方座標值。all_cars_pos
:場景中所有車子的位置清單,清單內每一個物件都是一個車子的左上方座標值。distance
:玩家目前已行近的距離。velocity
:玩家目前的車速。coin_num
:玩家目前吃到的金幣數量(若為普通模式則固定為0)。coin
:場景中所有金幣的位置清單,清單內每一個物件都是一個金幣的左上方座標值。(若為普通模式則為空清單)。status
:目前遊戲的狀態GAME_ALIVE
:遊戲進行中GAME_PASS
:遊戲通關GAME_OVER
:遊戲結束
- 在 update() 最後要回傳一個字串,主角物件即會依照對應的字串行動,一次可以執行多個行動。
SPEED
:向前加速BRAKE
:煞車減速MOVE_LEFT
:向左移動MOVE_RIGHT
:向右移動
- 最後結果會顯示在console介面中,若是PAIA伺服器上執行,會回傳下列資訊到平台上。
{
"frame_used": 100,
"state": "FAIL",
"attachment": [
{
"player": "1P",
"coin":1,
"distance": "6490m",
"single_rank":1,
"accumulated_score":4
}
]
}
frame_used
:表示使用了多少個framestate
:表示遊戲結束的狀態FAIL
:遊戲失敗FINISH
:遊戲完成
attachment
:紀錄遊戲各個玩家的結果與分數等資訊player
:玩家編號coin
:玩家單局吃到的金幣(若為普通模式則無此欄位)distance
:玩家單局行走的距離single_rank
:玩家單局的排名accumulated_score
:玩家的累計積分(用於玩多次遊戲時)