主要内容 #
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>
习题 #