Я сделал простую игру Connect 4 в C ++.Мой код хорош? - PullRequest
0 голосов
/ 04 июля 2019

Я сделал эту простую игру, потому что я не мог сделать тетрис (я не мог правильно разместить фигуру на игровом поле), и я хотел бы, чтобы кто-то проанализировал мой код и сказал мне, если я плох, потому что я действительно могу »не усложняю игру.

Такие функции, как NoFlicker и ShowCursor, которые я скопировал из Интернета, но AlignString я создал сам и горжусь этим xD

Я объясню функции, потому что это непозвольте мне опубликовать этот пост.Функция changeP () меняет местами игроков до того, как я создал эту функцию и отредактировал свой код, у меня были player1pick и player2pick, теперь она более понятна. Функция Результат (char p) берет p из winCheck (pChar) pChar - символ активного игрока, и winCheck () проверяет, есть ли4 блока одним из способов, а затем возвращаем p в result ()

Первым делом в главной консоли реселл также из интернета Setup () все настраивает перед тем, как новая игра Pick () запрашивает у активного игрока прорисовку колонки() рисует поле и помеченные линии предназначены для его раскрашивания, но оно сложнее, чем я думал

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

using namespace std;


bool gameOver, p1t, p2t;
char p1[25], p2[25], player[25];// , winner[25];
const unsigned short int X = 9, Y=7;
char field[7][8];//7 - lower border, 8 - 2 side borders
int temp[7] = {6,6,6,6,6,6,6};//to know on what lvl next block will be placed
int cPick, pColor;//column pick
char pChar;//player char for later change by players desire


void NoFlicker(short int x, short int y) {  //No flickering fix (Internet)
    COORD pos = { x, y };
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}//End of NoFlicker
void ShowCursor(bool showFlag) {                //Show the cursor while drawing (Internet)
    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

    CONSOLE_CURSOR_INFO     cursorInfo;

    GetConsoleCursorInfo(out, &cursorInfo);
    cursorInfo.bVisible = showFlag; // set the cursor visibility
    SetConsoleCursorInfo(out, &cursorInfo);
}//End of ShowCursor
void AlignString(string text, int y) {      //Aligns strings to the Middle (by me)
    int size;
    size = 60 - (text.length() / 2);
    for (int ent = 0; ent <= y; ent++) {
        cout << "\n";
    }
    for (int gap = 0; gap < size; gap++) {
        cout << " ";
    }
    cout << text;
}//End of AlignString

void draw() {


    NoFlicker(0, 40);
    cout << "\t\t\t\t\t\t\t 1234567 \n";
    for (int i = 0; i < Y; i++) {
        cout << "\t\t\t\t\t\t\t";
        for (int j = 0; j < X; j++) {
            if (i == Y-1 || j == 0 || j == X-1) {
                //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9);
                field[i][j] = 219;
                //cout << field[i][j];
            }else if (cPick == j) {
                //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), pColor);
                field[temp[cPick - 1]][j] = pChar;
                //cout << field[i][j];
            } /*else {
                if (field[i][j] == 1){
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
                    cout << field[i][j];
                } else if(field[i][j] == 2) {
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
                    cout << field[i][j];
                } else {
                    field[i][j] = ' ';
                    cout << field[i][j];
                }*/

            cout << field[i][j];
        }cout << endl;
    }

    /*cout << endl;
    for (int i = 0; i < 7; i++) {
        cout <<temp[i];
    }cout << endl;*/
}

void changeP() {//changes players
    if (p1t) {
        pChar = 1; //current player's symbol
        pColor = 14;
        strcpy_s(player, p1);//googled this function
        p1t = false; //player's 1 turn
        p2t = true;//player's 2 turn
    }
    else if (p2t) {
        pChar = 2;
        pColor = 4;
        strcpy_s(player, p2);
        p1t = true;
        p2t = false;
    }
}

void result(char p) {
    if (p == 1) {
        gameOver = true;
        AlignString(p1, 1);
        AlignString("Won the game! It was fair match", 1);
        AlignString("New game will start in less than 10 seconds!", 10);
    }
    else if (p == 2) {
        gameOver = true;
        AlignString(p2, 1);
        AlignString("Won the game! It was fair match!", 1);
        //strcpy_s(winner, p1);
        AlignString("New game will start in less than 10 seconds!",10);
    }

}

char winCheck(char p) {
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 9; j++) {
            if (field[i][j] == p && field[i+1][j + 1] == p && field[i+2][j + 2] == p && field[i+3][j + 3] == p) {//Diagonal Right Down Check
                return p;
            }
            if (field[i][j] == p && field[i][j + 1] == p && field[i][j + 2] == p && field[i][j + 3] == p) {//Horizontal Check
                return p;
            }
            if (field[i][j] == p && field[i-1][j + 1] == p && field[i-2][j + 2] == p && field[i-3][j + 3] == p) {//Diagonal Right Up Check
                return p;
            }
            if (field[i][j] == p && field[i - 1][j] == p && field[i - 2][j] == p && field[i - 3][j] == p) {//Vertical Check
                return p;
            }
        }
    }
}

void pick() {
    AlignString(player, 1);
    AlignString("you can pick your column --> ",1);
    cin >> cPick;
    if (cPick > 7 || cPick < 1) {
        AlignString("nIllegal pick. Try again!", 1);
        pick();
    } else {
        temp[cPick - 1] -= 1;
        if (temp[cPick - 1] < 0) {
            AlignString("This column is full. Try another one!",1);
            pick();
        }
        system("cls");
    }
}

void setup() {
    ShowCursor(false);
    gameOver = false;
    p1t = true;
    p2t = false;
    AlignString("Player 1, write your name or how you wanna be called here --> ",5);
    //cout << "\n\t\t\t\";
    cin.getline(p1, 25);
    AlignString("Ok now, Player 2, write your name or how you wanna be called here --> ",1);
    cin.getline(p2, 25);

    system("cls");
    draw();
}

void main() {

    HWND console = GetConsoleWindow();
    RECT r;
    GetWindowRect(console, &r); //stores the console's current dimensions
    MoveWindow(console, r.left, r.top, 900, 900, TRUE); // 800 width, 100 height

    setup();
    while (!gameOver) {
        changeP();
        pick();
        draw();
        result(winCheck(pChar));
    }
    Sleep(10000);
    main();

}```
...