主要内容 #
1. 控制游戏的角色 #
在游戏中,一般我们是怎么控制角色的移动呢?
经常的,我们使用wasd四个按键,或者上下左右四个按键,来控制角色。
这八个按键,都可以在 ASCII 表上查找到。
2. 方向键的 ASCII 码 #
请找出方向键的 ASCII 码值。
本次课程中,我们使用WASD这四个键来控制角色的移动。
试一试:
请编写程序,实现如下功能:
以上功能,除了 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),然后实现如下的坐标变化。
以上功能,除了 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”,然后实现如下的坐标变化。
以上功能,除了 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>
习题 #