题目

来源:广州大学第十四届ACM大学生程序设计竞赛(同步赛)

《蔚蓝(Celeste)》是一款像素风格的平台类游戏,玩家需要操纵一名叫 Madeline 的小女孩,在避免触碰到各种各样的致命的障碍的同时向山上进发。

游戏中 Madeline 可以实现以下几种动作:

  1. 向左或向右走 (Walk)。(按左方向键或右方向键)
  2. 速降 (QuickDrop) 或下蹲 (Squat)。(按下方向键)
  3. 向左上、上、右上、左、右、左下、下、右下八个方向进行猛冲 (Dash)。(同时按住一个或两个方向键和 X 键)
  4. 靠近墙体时抓住 (Grasp) 墙体。(靠近墙体时按 Z)
  5. 在地面上或在墙体上跳跃 (Jump)。(在地面上或在墙体上按 C)

将 Madeline 的某些动作转换成键盘动作。

输入描述:

如果是第一种动作或第三种动作,会输入两个字符串,第一个字符串是方向,第二个字符串是动作。
八种方向:左上、上、右上、左、右、左下、下、右下分别对应 leftup、up、rightup、left、right、leftdown、down、rightdown。
第一种动作只会有 left 和 right。
其他三种动作只会有一个字符串,可能为 QuickDrop、Squat、Grasp、Jump。

输出描述:

对于每一个动作,输出需要按的键。
如果是第三种动作,先输出方向键,再输出 X;如果是需要按住两个方向键,先输出左或右方向键,再输出上或下方向键。
方向键的输出中左、右、上、下分别为 left、right、up、down。

解题思路

将 Madeline 的动作 a1[i] 和 d1[j] 转换成相应的键盘动作 a2[i] 和 d2[j]。

C++代码

#include<iostream>
using namespace std;

string d1[8] = { "leftup", "up", "rightup", "left", "right", "leftdown", "down", "rightdown" };
string d2[8] = { "left up", "up", "right up", "left", "right", "left down", "down", "right down" };
string a1[6] = { "Walk", "QuickDrop", "Squat", "Dash", "Grasp", "Jump" };
string a2[6] = { "", "down", "down", "X", "Z", "C"};

int main(){
    int T;
    cin >> T;
    string s;
    while(T--){
        cin >> s;
        bool flag = false;
        for(int i=0; i<8; ++i){
            if(s==d1[i]){
                cout << d2[i] << " ";
                flag = true;
                break;
            }
        }

        if(flag)
            cin >> s;

        for(int i=0; i<6; ++i){
            if(s==a1[i]){
                cout << a2[i] << endl;
                break;
            }
        }
    }
    return 0;
}