請完成車子吃寶物的遊戲, 其中
map 是一個二維陣列
用來表示地圖的內容
map_reset() 的作用是清除地圖內容以及重設邊界
map_show() 則是把 map 的內容顯示到螢幕上
blocks 也是二維陣列
記錄磚牆的位置
會透過 blocks_read() 從input 中讀取位置資訊
然後用 blocks_put_on_map() 在地圖 map 裡面的對應位置放置磚牆
磚牆是固定的
車子前進時如果遇到磚牆會被擋住
jewels 二維陣列記錄寶物的位置
會藉由 jewels_read() 從檔案 input 中讀取位置資訊
然後用 jewels_put_on_map() 在地圖 map 裡面的對應位置放置寶物
車子只要碰到寶物就會撿起來 (包含寶物一開始就在車子下)
car 二維陣列記錄車子的外觀 @ @ 表示車頭方向
車子的起始位置是row: 3, column: 4 (車子最左上角的座標)
用來記錄車子目前位置的變數是 car_row 和 car_col
車子的方向則是由 car_direction 表示
我們可以用 0, 1, 2, 3 來分別代表車子朝向 右、下、左、上
所以如果 car_direction 的值等於 2 表示車子目前朝左
而遊戲一開始是初始成朝上
car_earnings 則是記錄撿到的寶物數量
需要自行完成的函數是
car_rotate90() 和 car_move()
car_rotate90() 要將 car 二維陣列順時鐘旋轉 90 度
並且更新 car_direction 的值 讓它符合目前方向
car_move() 則要將 car 依照目前方向
向前移動一格
在移動之前必須先判斷是否會被磚牆擋住
也不能超出 map 原本的外牆
移動之後
要將碰到的寶物撿起來 (撿走之後就沒了 不能重複撿)
車子的移動是根據input的指示
只有兩種動作
'R' 代表順時鐘旋轉九十度
'F' 代表前進一格
做完全部的動作之後
最後要輸出車子目前的狀態
#include#define MAP_SIZE 12 #define CAR_SIZE 3 int map[MAP_SIZE][MAP_SIZE]; void map_reset(void); void map_show(void); int blocks[MAP_SIZE][MAP_SIZE]; void blocks_read(void); void blocks_put_on_map(void); int jewels[MAP_SIZE][MAP_SIZE]; void jewels_read(void); void jewels_put_on_map(void); int car[CAR_SIZE][CAR_SIZE] = {{'@', 'O', '@'}, {'O', 'O', 'O'}, {'O', 'O', 'O'}}; int car_row = 3, car_col = 4; int car_direction = 3; int car_earnings; void car_rotate90(void); void car_put_on_map(void); void car_move(void); int main(void) { int ch; jewels_read(); blocks_read(); while ((ch=getchar()) != EOF) { if (ch=='R') { car_rotate90(); } if (ch=='F') { car_move(); } map_reset(); jewels_put_on_map(); blocks_put_on_map(); car_put_on_map(); /*可以利用map_show()把目前狀態印出來, 但上傳時記得拿掉*/ /*map_show();*/ } printf("%d\n", car_earnings); printf("%d %d\n", car_row, car_col); char dirs[] = "RDLU"; printf("%c\n", dirs[car_direction]); return 0; } void blocks_read(void) { int n, i; int row, col; scanf("%d", &n); for (i=0; i Input
jewels個數
jewels位置
blocks個數
blocks位置
車子移動動作的序列
Output
最終得分
車子最終位置
車子最終方向
Sample Input Download
Sample Output Download
Tags
Discuss