C ++在win32控制台中制作游戏

时间:2017-02-24 09:42:01

标签: c++ winapi

所以我的问题有点棘手,至少对我而言。我正在尝试用C ++制作游戏以获得它的乐趣,基本上我就像飞鸟一样,鸟不会移动,但鸟后面的地图总是从右向左移动。基本上我到目前为止所做的是创建一个小网格5个空格向下和80个空格。我基本上在地图底部的顶部5个空格处绘制了下划线字符_,玩家从左边开始是“O”三个空格。麻烦的是让第五个空间上方的4个空间移动,但同时不要移动玩家“O”。这是我的代码和到目前为止发生的事情的草图。对不起,我真的很难解释。我真的尽力了。问题是我并没有真正理解这一切。

#include <iostream>
#include <cstdlib>
#include <string>
#include <conio.h>
using namespace std;
bool gameOver;


// Global variables
const int WIDTH = 80;
const int HEIGHT = 5;
int x, y;
int speedX;
int percentX;
int someArray[100];
string anotherArray[100];
enum eKeys { STOP = 0, SPACE};
int gameSpeed;
eKeys key;
// Function declarations
void input() {
    if (_kbhit()) {
        switch (_getch()){
        case ' ': 
            key = SPACE;
            break;
        }
    }
}
void draw() {

    for (int j = 0; j < HEIGHT; j++) {
        for (int i = 0; i < WIDTH; i++) {
            if (j < 4) {
                std::cout << " ";
                if (WIDTH == 20) {
                    _sleep(10);
                }
            } 
            if(j == 4){
                anotherArray[i] = "_";
                std::cout << anotherArray[i];

            }
            if (j== 3 && i == 3) {
                std::cout << "O";
            }
            if (j == 3 && i == 140) {

            }


        }
    }
}
void setup() {
    gameOver = false;
    key = STOP;
    x = 3;
    y = 2;
}
void logic() {
    switch (key) {
    case SPACE:

        break;
    }
}
int main()
{
    //  Your code goes here
    setup();
    //while(gameOver == false){
        draw();
        input();
        logic();
    //}

    //  Make sure we place the end message on a new line
    std::cout << endl;

    //  The following is system dependent.  It will only work on Windows
    std::system("PAUSE");

    /* 
    // A non-system dependent method is below
    cout << "Press any key to continue";
    cin.get();
    */
    return 0;
}

此代码在控制台中生成此输出.... “这是控制台的顶部”

0

按任意键继续......

我想要的是“_____”以上的所有内容都是在没有玩家移动的情况下从右向左移动。除非按空格键跳转,否则“O”的y坐标将会改变。我也知道这可能会在课堂上做得更好但我在书中没有那么深入,而我的c ++课程现在刚刚开始运作,所以现在最好远离它。

2 个答案:

答案 0 :(得分:2)

如果我已经正确理解,你想在Windows控制台上使用C ++ level io和conio.h函数制作一个ASCII艺术游戏。对不起,你在路边:

  • C ++级别(iostreams和C stdio或posix函数)旨在以顺序方式输出文本数据,因此屏幕上没有绝对定位可用
  • conio.h只包含一些在MS / DOS时间用于在键盘或屏幕上进行简单i / o操作的函数 - &gt;没有绝对定位

在旧的MS / DOS时代,屏幕内存曾经可以在众所周知的地址直接访问,游戏(或应用程序)开发人员在需要特殊效果时使用它来绕过正常的IO功能。不确定控制台仿真是否支持它,我建议你不要使用它。

现在正确的方法是使用WINAPI的Console functions。它们通过conio仿真和正常的io功能在引擎盖下使用,但提供游戏所需的一切,绝对定位,甚至可以通过ReadConsoleOutput和{{读取和写入屏幕的任意区域。 1}}

同时,您可以使用WriteConsoleOutput从键盘获取输入事件。

当然,您已经不再与非Windows平台兼容,但是由于您已经使用过conio,我认为这里不关心可移植性。

答案 1 :(得分:0)

你不必担心这里的效率。

将背景存储在80 x 25阵列中。然后在每次移动时向左滚动,只需通过它暴力。复制到另一个缓冲区,用精灵覆盖,然后将整个内容写到屏幕上。

不要使用cout。使用conio printat()函数。