跳至正文
View Categories

3 min read

主要内容 #

1. 控制游戏的角色 #

在游戏中,一般我们是怎么控制角色的移动呢?

经常的,我们使用wasd四个按键,或者上下左右四个按键,来控制角色。

这八个按键,都可以在 ASCII 表上查找到。

2. 方向键的 ASCII 码 #


请找出方向键的 ASCII 码值。

本次课程中,我们使用WASD这四个键来控制角色的移动。

试一试:
请编写程序,实现如下功能:

  • 1. 输入w/W,输出“向前”;
  • 2. 输入s/S,输出“向后”;
  • 3. 输入a/A,输出“向左”;
  • 4. 输入d/D,输出“向右”;
  • 5. 输入q/Q,输出“退出”;
  • 以上功能,除了 5 之外,其他均可以重复执行;

    /*
    请完成后,查看示例程序。
    
    
    
    
    
    */

    示例程序:

    #include < iostream > 
    #include < Windows.h >
    int main()
    {
        char key;
        for(;;)
        {
            std::cin >> key;
            system("cls");
            if(key == 'w' || key == 'W')       // 如果是使用向上键,可以写作:key == 24
                std::cout << "向前";
            else if(key == 's' || key == 'S')
                std::cout << "向后";
            else if(key == 'a' || key == 'A')
                std::cout << "向左";
            else if(key == 'd' || key == 'D')
                std::cout << "向右";
            else if(key == 'q' || key == 'Q')
            {
                std::cout << "退出";
                break; 
            }
        }
        return 0;
    }

    3. 输出坐标变换 #

    试一试:
    请设定初始坐标为(50,25),然后实现如下的坐标变化。

  • 1. 输入w/W,坐标变化为 (x, y-1);
  • 2. 输入s/S,坐标变化为 (x, y+1);
  • 3. 输入a/A,坐标变化为 (x-1, y);
  • 4. 输入d/D,坐标变化为 (x+1, y);
  • 5. 输入q/Q,输出“退出”;
  • 以上功能,除了 5 之外,其他均可以重复执行;

    /*
    请完成后,查看示例程序。
    
    
    
    
    
    */

    示例程序:

    #include < iostream > 
    #include < Windows.h >
    int main()
    {
        char key;
        int x(50), y(25); 
        for(;;)
        {
            std::cout << "当前坐标为:" << x << ", " << y << std::endl;
            
            std::cin >> key;
            system("cls");
            if(key == 'w' || key == 'W')
                y = y-1;
            else if(key == 's' || key == 'S')
                y = y+1;
            else if(key == 'a' || key == 'A')
                x = x-1;
            else if(key == 'd' || key == 'D')
                x = x+1;
            else if(key == 'q' || key == 'Q')
            {	
                std::cout << "退出";
                break; 
            }
        }
        return 0;
    }

    4. 坐标变换和移动字符 #

    试一试:
    在屏幕上坐标为(50,25)的位置,输出字符串“dashima”,然后实现如下的坐标变化。

  • 1. 输入w/W,星号向上移动一位;
  • 2. 输入s/S,星号向下移动一位;
  • 3. 输入a/A,星号向左移动一位;
  • 4. 输入d/D,星号向右移动一位;
  • 5. 输入q/Q,输出“退出”;
  • 以上功能,除了 5 之外,其他均可以重复执行;

    /*
    请完成后,查看示例程序。
    
    
    
    
    
    */

    示例程序:

    #include < iostream > 
    #include < Windows.h >
    int main()
    {
        char key;
        int x(50), y(25); 
        for(;;)
        {
            //std::cout << "现在的坐标为:" << x << ", " << y << std::endl;
            for(int j=0; j < y; j++)
                std::cout << std::endl;
            
            for(int j=0; j < x; j++)
                std::cout << " ";
            
            std::cout << "dashima";
            
            std::cin >> key;
            system("cls");
            if(key == 'w' || key == 'W')
                y = y-1;
            else if(key == 's' || key == 'S')
                y = y+1;
            else if(key == 'a' || key == 'A')
                x = x-1;
            else if(key == 'd' || key == 'D')
                x = x+1;
            else if(key == 'q' || key == 'Q')
            {	
                std::cout << "退出";
                break; 
            }
                
        }
        return 0;
    }

    5. *不阻塞方式 #

    以上代码中,我们使用的是 cin,作为读取输入字符的函数。
    这样做,有一个缺点,那就是每次输入,需要回车才可以执行。
    这种现象,我们称为“阻塞主线程”。由于大家还没有学习过“线程”,一下内容不要求大家掌握。

    这里,我们介绍一个不阻塞的函数,让我们的示例程序,更加贴近我们平时的使用体验。

    示例程序:

    #include <iostream> 
    #include <windows.h>
    #include <conio.h>
    int main()
    {
        char key;
        int x(50), y(25);
        // 显示 dashima 的初始位置
        for (int j = 0; j < y; j++)
            std::cout << std::endl;
    
        for (int j = 0; j < x; j++)
            std::cout << " ";
    
        std::cout << "dashima";
    
        for (;;)
        {
            if (_kbhit() == 1)   // 检查键盘的按键输入
            {
                key = _getch();  // 使用此函数,获得不阻塞的按键输入
    
                system("cls");   // 清除屏幕
                if (key == 'w' || key == 'W')
                    y = y - 1;
                else if (key == 's' || key == 'S')
                    y = y + 1;
                else if (key == 'a' || key == 'A')
                    x = x - 1;
                else if (key == 'd' || key == 'D')
                    x = x + 1;
                else if (key == 'q' || key == 'Q')
                {
                    std::cout << "退出";
                    break;
                }
    
                // 更新位置
                for (int j = 0; j < y; j++)
                    std::cout << std::endl;
    
                for (int j = 0; j < x; j++)
                    std::cout << " ";
    
                std::cout << "dashima";
    
            }
            Sleep(10);
        }
        return 0;
    }
    </conio.h></windows.h></iostream>

    习题 #

    课后练习