在c ++中,与HANDLE和COORD等效的mac是什么?

时间:2015-05-16 19:36:31

标签: c++

好的,所以我是一名大学生,我们的教授给了我们这个代码来检查,我想知道是否还有另一种方法可以做到这一点,但对于OS X.我的教授正在使用HANDLE,我几乎不明白这是什么,教授告诉我他将HANDLE创建为输出流的指针,因此我们没有#include Windows.h,因此它与mac相当。您在此代码中看到的所有内容都是我的教授,包括评论。

//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;
}

0 个答案:

没有答案