Я сделал эту простую игру, потому что я не мог сделать тетрис (я не мог правильно разместить фигуру на игровом поле), и я хотел бы, чтобы кто-то проанализировал мой код и сказал мне, если я плох, потому что я действительно могу »не усложняю игру.
Такие функции, как 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();
}```