5534 - I2P_LAB05_2   

Description

請完成車子吃寶物的遊戲, 其中

map 是一個二維陣列
用來表示地圖的內容
地圖的大小為12x12
map_reset() 的作用是清除地圖內容以及重設邊界
map_show() 則是把 map 的內容顯示到螢幕上

blocks 也是二維陣列
記錄磚牆的位置
會透過 blocks_read() 從input 中讀取位置資訊
然後用 blocks_put_on_map() 在地圖 map 裡面的對應位置放置磚牆
磚牆是固定的
車子前進時如果遇到磚牆會被擋住

jewels 二維陣列記錄寶物的位置
會藉由 jewels_read() 從檔案 input 中讀取位置資訊
然後用 jewels_put_on_map() 在地圖 map 裡面的對應位置放置寶物
車子只要碰到寶物就會撿起來 (包含寶物一開始就在車子下)

car 二維陣列記錄車子的外觀 @ @ 表示車頭方向
車子的大小為4x4
車子的起始位置是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的指示
只有兩種動作
'L' 代表逆時鐘旋轉九十度
'F' 代表前進一格
做完全部的動作之後
最後要輸出車子目前的狀態

#include 
#define MAP_SIZE 12
#define CAR_SIZE 4

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', '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=='L') {
            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