【发布时间】:2015-10-02 19:01:19
【问题描述】:
我正在使用 C++ 制作一个简单的游戏 这只是一个带有 ASCII 地图的瓷砖游戏。 游戏本身运行良好,但是当我移动播放器时控制台屏幕(地图)闪烁,我不知道如何解决这个问题。有任何帮助,谢谢!
代码:
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <ctime>
#include <vector>
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;
vector<string> map;
int playerX = 10;
int playerY = 10;
int oldPlayerX;
int oldPlayerY;
bool done = false;
void loadMap();
void printMap();
void setPosition(int y, int x);
void eventHandling();
int main()
{
loadMap();
map[playerY][playerX] = '@';
printMap();
while(!done){
eventHandling();
printMap();
}
exit(1);
return 0;
}
void eventHandling(){
char command;
command = _getch();
system("cls");
oldPlayerX = playerX;
oldPlayerY = playerY;
if(command == 'w'){
playerY--;
}else if(command == 'a'){
playerX--;
}else if(command == 'd'){
playerX++;
}else if(command == 's'){
playerY++;
}
if(map[playerY][playerX] == '#'){
playerX = oldPlayerX;
playerY = oldPlayerY;
}
setPosition(playerY,playerX);
}
void setPosition(int y, int x){
map[oldPlayerY][oldPlayerX] = '.';
map[y][x] = '@';
}
void printMap(){
for(int i = 0 ; i < map.size() ; i++){
cout << map[i] << endl;
}
}
void loadMap(){
ifstream file;
file.open("level.txt");
string line;
while(getline(file, line)){
map.push_back(line);
}
}
【问题讨论】:
-
这一切都是因为
system("cls");而发生的。使用另一种方法,例如自己打印整个页面或通过到处打印空格字符手动清除它,然后打印您的地图数据。 -
你最好不要打电话给
system("cls");。我知道当你第一次开始制作命令行游戏时感觉“更干净”,但大多数程序不这样做,而且人们通常不喜欢在他们没有尝试这样做时清除屏幕。此外,它不是可移植的,而您的其余代码可能是。 -
using namespace std;是一种不好的做法,所以不要养成这样做的习惯。只需写出std::map、std::ifstream、std::cout、std::getline等。如果你不这样做,它最终会咬你的(你不知道std中的所有内容,如果你使用相同的呢?命名为什么?) -
你们认为清除控制台屏幕的正确方法是什么?
-
@HugoCornel 不要清除它。没有一些第三方库(这也将受到限制),就没有可移植的方式。你的程序不知道它正在写入屏幕,它只知道它正在写入
stdout,它可能是一个文件、一个管道、一个套接字、一个打印机,谁知道呢?