控制台textgame.exe适用于Windows 7,而不适用于Vista ...为什么?

时间:2011-06-02 03:54:41

标签: windows console compatibility

嘿所以我使用pdCurses库和microsoft opperating系统工具制作了一个文本游戏。这是我的包含,并在下面查看其他探索:

#include <iostream>
#include <time.h> // or "ctime"
#include <stdio.h> // for 
#include <cstdlib> 
#include <Windows.h> 
#include <conio.h>
#include<curses.h>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <ctime>

#include <myStopwatch.h> // for keeping times
#include <myMath.h>      // numb_digits() and digit_val();

myStopwath / Math.h包括:

#include <stdio.h>
#include <math.h>
#include <tchar.h>

所以我在运行Windows 7的计算机上测试了游戏(其中包含一个包含.exe和pdcurses.dll的文件夹)并且效果很好,但是当在另一台具有vista或更旧版本的计算机上运行时我的游戏来了起因,但由于所有球员的生命几乎瞬间丧失而立即结束......这怎么可能?

如果您想查看完整的源代码,请转到此Link

谢谢!

3 个答案:

答案 0 :(得分:6)

在主游戏循环中,您没有在将coll变量传递给theScreen.check_collision()之前初始化它。如果玩家没有危险,那么该功能不会更新此值。回到主循环,你不检查check_collision()的返回值,程序现在根据该变量中的未初始化值做出决策。欢迎来到广泛的未定义行为世界。

您在不同操作系统上看到的差异很可能是由于不同堆管理器初始化内存页面的方式。即使您的播放器存活了一段时间,在第一次碰撞后,该内存位置现在保持“X”,然后永远不会被清除,并且虽然结果仍然是“未定义”,但在大多数架构中,这将导致注册新的每次迭代都会发生碰撞,解释为什么你的“生命”会如此迅速地消失。

要解决此问题,您需要做两件事:

  1. 通过check_collision的所有代码路径都必须写入'buff'out参数。最简单的方法是在函数的第一行将其初始化为0。 (或者,如果它打算作为输入/输出参数,那么你需要在调用check_collision()之前在主循环中初始化它。)
  2. 根据check_collision()的返回值而不是out参数做出决定。 (或者,如果返回值确实不重要,则将函数的返回类型更改为void)

答案 1 :(得分:0)

string_lines中的第23行在结尾处缺少逗号。不要以为这是你的整个问题,但这也不是好事。

你没有说你是否在每个操作系统(Vista等)下单独重新编译它。如果你重新编译,是否使用了相同版本的编译器。

答案 2 :(得分:0)

Windows 7随Visual C ++ 2008运行时一起提供。 Windows Vista提供了Visual C ++ 2005运行时。 XP附带Visual C ++ 6.0运行时。

由于您在Visual Studio 2010中编译了应用程序,因此很可能未将其编译为针对较旧的操作系统。

尝试在您正在测试的计算机上安装最新的运行时,如果在执行此操作后它可以正常工作,您就知道要重新编译项目以支持较旧的操作系统。

http://www.microsoft.com/download/en/details.aspx?id=5555 x86 http://www.microsoft.com/download/en/details.aspx?id=14632 x64