好的,我是一名大学生,我们的教授给了我们这段代码供您检查,我想知道是否还有另一种方法可以做到,但对于OSX。我的教授正在使用一个HANDLE,但我几乎不知道这是什么,教授告诉我他将HANDLE创建为指向输出流的指针,因此对于mac而言,这等效于它,因为显然我们没有#include Windows.h。 您在这段代码中看到的所有内容都是我教授的内容,包括注释。

//This is an example of a simple platformer made in the console. This
//makes no claims as the best way of doing things as I created this
//live before a class (while taking suggestions from them).

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>

using namespace std;

const int MAX_ROWS = 20;
const int MAX_COLS = 60;

//this is a reference to cout (we got this when we changed the output color)
//we can use this to setCursorPosition
HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
//this is the place that we can set the cursor to when we are not using it
COORD zero;

//basic cardinal directions
enum Direction
{
    UP = 8,
    DOWN = 2,
    RIGHT = 6,
    LEFT = 4,
    NORTH = UP,
    SOUTH = DOWN,
    EAST = RIGHT,
    WEST = LEFT
};

//each place on the gameboard is a tile (tiles in this game are 1 character in length, though they do not have to be)
class Tile
{
public:
    char display;
    bool isPassible;
    COORD pos;
    Tile(char d, bool b, int y, int x)
    {
        display = d;
        isPassible = b;
        pos.X = x;
        pos.Y = y;
    }
    void Display()
    {
        SetConsoleCursorPosition(output, pos);
        cout << display;
        SetConsoleCursorPosition(output, zero);
    }
};

class Player
{
public:
    COORD pos;
    char display;
    int JumpAmt;

    //player constructor (x and y are starting location)
    Player(int x, int y)
    {
        pos.X = x;
        pos.Y = y;
        display = 'C';
        JumpAmt = 0;
    }

    //This gets the input and decides how to use it (this should be called in the main game loop)
    bool Act(vector<vector<Tile>> GameBoard)
    {
        bool didMove = false;
        COORD oldPos;
        oldPos.X = pos.X;
        oldPos.Y = pos.Y;
        if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
        {
            //make sure the movement is not off the game board and that there is not a wall in the way
            if (pos.X + 1 < MAX_COLS && GameBoard[pos.Y][pos.X + 1].isPassible)
            {
                //actually move the character
                pos.X += 1;
                didMove = true;
            }
        }
        if (GetAsyncKeyState(VK_LEFT) & 0x8000)
        {
            if (pos.X - 1 > 0 && GameBoard[pos.Y][pos.X - 1].isPassible)
            {
                pos.X -= 1;
                didMove = true;
            }
        }
        //You can only jump if you are on the ground
        if (pos.Y + 1 < MAX_ROWS && !(GameBoard[pos.Y + 1][pos.X].isPassible))
        {

            if (GetAsyncKeyState(VK_UP) & 0x8000)
            {
                if (pos.Y - 1 > 0 && GameBoard[pos.Y - 1][pos.X].isPassible)
                {
                    pos.Y -= 1;
                    didMove = true;
                    JumpAmt = 4;
                }
            }
        }
        //When you are not jumping fall (gravity)
        if (JumpAmt == 0)
        {
            if (pos.Y + 1 < MAX_ROWS && GameBoard[pos.Y + 1][pos.X].isPassible)
            {
                pos.Y += 1;
                didMove = true;
            }
        }
        //This is what happens during your jump
        if (JumpAmt > 0)
        {
            JumpAmt--;
            if (pos.Y - 1 > 0 && GameBoard[pos.Y - 1][pos.X].isPassible)
            {
                pos.Y -= 1;
                didMove = true;
            }
        }

        //If you did move anywhere then update the board
        if (didMove)
        {
            Display(oldPos, GameBoard);
        }
        return didMove;
    }
    void Display()
    {
        //draw myself at my position
        SetConsoleCursorPosition(output, pos);
        cout << display;
        SetConsoleCursorPosition(output, zero);
    }
    void Display(COORD fix, vector<vector<Tile>> GameBoard)
    {
        //clear my old position
        GameBoard[fix.Y][fix.X].Display();
        Display();
    }

};

int main()
{
    //zero is used after anything is drawn to reset the cursor (this should never be changed after this)
    zero.X = 0;
    zero.Y = 0;

    //this is a 2 dimentional array of tiles
    vector<vector<Tile>> GameBoard;

    //init all the tiles to blank (we will later add in platforms and stuff over top of these)
    for (int row = 0; row < MAX_ROWS; row++)
    {
        vector<Tile> thisRow;
        for (int col = 0; col < MAX_COLS; col++)
        {
            thisRow.push_back(Tile(' ', true, row, col));
        }
        GameBoard.push_back(thisRow);
    }
    //Build the game specific tiles (in a perfect world these would be read in from a file)
    GameBoard[4][2] = Tile('-', false,4,2);
    GameBoard[4][3] = Tile('-', false, 4,3);
    GameBoard[4][4] = Tile('-', false, 4,4);
    GameBoard[4][5] = Tile('-', false, 4,5);
    GameBoard[4][6] = Tile('-', false, 4,6);
    GameBoard[7][9] = Tile('-', false, 7,9);
    GameBoard[7][10] = Tile('-', false, 7,10);
    GameBoard[5][10] = Tile('-', false, 5,10);
    GameBoard[8][14] = Tile('*', false, 8, 14); //this marks the win square

    //display the board once
    for (int row = 0; row < MAX_ROWS; row++)
    {
        for (int col = 0; col < MAX_COLS; col++)
        {
            GameBoard[row][col].Display();
        }
    }

    //Bob is our hero
    Player bob = Player(3, 3);

    while (true)
    {
        bob.Act(GameBoard);
        bob.Display();
        Sleep(50);

        //if bob falls down he dies
        if (bob.pos.Y > 18)
        {
            bob.pos.X = 3;
            bob.pos.Y = 3;
            //bob.display = 65 + rand() % 26;
        }
        //if bob gets here he wins
        if (bob.pos.Y == 7 && bob.pos.X == 14)
        {
            COORD pos;
            pos.Y = 20;
            pos.X = 0;
            SetConsoleCursorPosition(output, pos);
            cout << "You are Awesome";
            break;
        }
    }

    COORD pos;
    pos.Y = 21;
    pos.X = 0;
    SetConsoleCursorPosition(output, pos);
    system("Pause");
    return 0;
}

  ask by SMoctezuma translate from so

本文未有回复,本站智能推荐:

2回复

相当于C ++中的NSMutableArray?

什么是最接近Objective-C NSMutableArray的C ++对象? 谢谢 !
1回复

相当于C ++中的BitmapSource?

我有一个用C#编写的工作代码,该代码需要一个字节数组来表示位图图像,并使用base64对其进行编码,因此可以在浏览器中显示。 它工作正常,但我需要在C ++中做同样的事情。 我有字节数组,其中包含与C#中的字节数组相同的内容。 问题是BitmapSource会压缩位图,而我不明白如何
5回复

相当于C ++中的Lua“和/或”?

在Lua中,你可以这样做: 这相当于(至少我相信它相当于): 在C ++中是否有与此类似或相似的内容?
2回复

相当于perror的C ++流是什么? [重复]

这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 用C ++替代perror() 我找不到相当于perror的流。 有这样的事吗? 我喜欢可以打电话
1回复

相当于JavaFx和AnimationTimer类的C ++是什么?

我有一个用JavaFX编写的俄罗斯方块游戏。 我想将其翻译成C ++以学习C ++。 我可以在C ++中使用什么来显示图形和游戏循环时间,就像我对JavaFX和AnimationTimer类所做的那样?
3回复

在Mac上相当于C ++ / Windows SendMessage()(如果有)吗?

Mac OS中有与SendMessage等效的功能吗?
2回复

C ++中的Action类? (相当于C#)

在我的C#游戏引擎中,我曾经通过向管理器对象添加/删除操作来处理有序绘制,管理器对象按优先级对操作进行排序,然后执行它们。 这是一个非常简单的例子: 通过添加一些辅助方法,代码变得非常优雅,并且易于在我的引擎中使用。 我最近搬到了C ++,我找不到任何简单的方法来实现相同的结
2回复

C#相当于C ++中的ifstream / ofstream

我知道之前可能已经提到了这个问题,但是我无法在任何地方找到它,而且我无法得到关于我在Google上查看的任何内容的明确答案。 我需要知道C#等价于C ++的ifstream / ofstream。 例如,如果我有以下C ++代码: 什么是C#等价物? 我发现一个网站说(
2回复

相当于C#中的C结构

有人可以帮我解决C#中相当于这个C代码的问题吗? 谢谢!
1回复

相当于C中的Union的C ++?

最近我一直在学习C,并且遇到了Union的概念。 我喜欢它,因为它可以用来表示任何数据类型。 当然,它仅在某些罕见和特殊情况下才有用。 在C ++中,一切都由类完成。 当然,可以使用类来实现类似Union之类的类似功能。 所以我想知道C ++是否支持同等的Union,这样我就不会再发明