From 46c95c9e7e56e4f0163ad027a57179bcd0c3708c Mon Sep 17 00:00:00 2001 From: p2woakbh8 <2028513801@qq.com> Date: Wed, 3 Jan 2024 19:21:06 +0800 Subject: [PATCH] ADD file via upload --- main.cpp | 498 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 498 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..56f15f5 --- /dev/null +++ b/main.cpp @@ -0,0 +1,498 @@ +#include +#include +#include +#include +#include +#include +//#include "Rand&Print.h" +//#include "do.h" +using namespace std; +using std::cout; +//using namespace xzb; +//using namespace wwh; + +const int MapSize = 4; +int MAP[MapSize][MapSize]; +int score{ 0 }; + + +void Initialize(int(&MAP)[MapSize][MapSize]);//定义函数Initialize,初始化MAP +int Rand_Odd_Even();//定义函数Rand_Odd_Even,在1到100之间取随机数给下面RandAddition函数备用(如果取到奇数,后面就添加数字2,偶数就添加数字4) +int RandBlank(int start, int end);//定义函数RandBlank,生成start和end之间的随机整数 +void RandAddition(int(&MAP)[MapSize][MapSize]);//定义函数RandAddition,在空格中随机放入2或4 +void PrintRule(int counter);//定义函数PrintRule,明确十六个元素的输出法则 +void PrintMap(int(&MAP)[MapSize][MapSize]);//打印 + + +int Updo(int(&MAP)[MapSize][MapSize]); +bool Upable(int(&MAP)[MapSize][MapSize]); +int Downdo(int(&MAP)[MapSize][MapSize]); +bool Downable(int(&MAP)[MapSize][MapSize]); +int Leftdo(int(&MAP)[MapSize][MapSize]); +bool Leftable(int(&MAP)[MapSize][MapSize]); +int Rightdo(int(&MAP)[MapSize][MapSize]); +bool Rightable(int(&MAP)[MapSize][MapSize]); +int mymax(int(&MAP)[MapSize][MapSize]); + +int main() +{ + srand(static_cast(time(0))); + std::cout << "点击上下左右进行操作" << endl; + cout << "当上下左右都尝试过并且无法操作时,游戏结束" << endl; + Initialize(MAP); + for (int i{ 1 }; i <= 15; ++i) + { + RandAddition(MAP); + } + PrintMap(MAP);//void 函数,打印表格 + bool up = true;//上滑能否操作 + bool left = true; + bool down = true; + bool right = true; + bool able = true;//游戏结束标志 + while (able)//判断能不能操作一次 + { + able = up || down || left || right; + char c=_getch();//输入 + switch (c) + { case 72: + { + if (Upable(MAP)) + { + up = true; + down = true; + left = true; + right = true; + score = score; + RandAddition(MAP); + cout << "得分:" << score << endl; + } + else up = false, cout << "无法上滑操作" << endl; + }//int 上滑并计算分数 + PrintMap(MAP); + break; + case 75: + { + if (Leftable(MAP)) + { + up = true; + down = true; + left = true; + right = true; + score = score; + RandAddition(MAP); + cout << "得分:" << score << endl; + } + else left = false, cout << "无法左滑操作" << endl; + }//int 左滑 + PrintMap(MAP); + break; + case 80: + { + + if (Downable(MAP)) + { + up = true; + down = true; + left = true; + right = true; + score = score; + RandAddition(MAP); + cout << "得分:" << score << endl; + } + else down = false, cout << "无法下滑操作" << endl; + }//int 下滑 + PrintMap(MAP); + break; + case 77 : + { + if (Rightable(MAP)) + { + up = true; + down = true; + left = true; + right = true; + score = score; + RandAddition(MAP); + cout << "得分:" << score << endl; + } + else right = false, cout << "无法右滑操作" << endl; + }//int 右滑 + PrintMap(MAP); + break; + default: + break; + } + + } + cout << "您本次游戏获得的分数是:" << score << endl; + cout << "您本次游戏合成最大的数为:" << mymax(MAP) << endl;//查找最大的数 +} + +void Initialize(int(&MAP)[MapSize][MapSize])//定义函数Initialize,初始化MAP +{ + for (int i = 0; i < MapSize; i++) + { + for (int j = 0; j < MapSize; j++) + { + MAP[i][j] = 0; + } + } +} + +int Rand_Odd_Even()//定义函数Rand_Odd_Even,在1到100之间取随机数给下面RandAddition函数备用(如果取到奇数,后面就添加数字2,偶数就添加数字4) +{ + int a = 1, b = 100; + return (rand() % (b - a + 1)) + a; +} + +int RandBlank(int start, int end)//定义函数RandBlank,生成start和end之间的随机整数 +{ + return (rand() % (end - start + 1)) + start; +} + +void RandAddition(int(&MAP)[MapSize][MapSize])//定义函数RandAddition,在空格中随机放入2或4 +{ + int additionDiamonds{};//添加的数字是2还是4 + if (Rand_Odd_Even() % 2 == 0) + additionDiamonds = 4; + else additionDiamonds = 2; + int emptyPlaid[MapSize * MapSize][2] = { 0 };//定义数组emptyPlaid,储存空的格子对应的编号 + int emptyPlaidLine{ 0 };//定义整型emptyPlaidLine作为数组emptyPlaid的行编号 + for (int i = 0; i < MapSize; i++) + { + for (int j = 0; j < MapSize; j++) + { + if (MAP[i][j] == 0) + { + emptyPlaid[emptyPlaidLine][0] = i; + emptyPlaid[emptyPlaidLine][1] = j; + ++emptyPlaidLine; + } + } + } + int lock = RandBlank(0, emptyPlaidLine - 1);//调用RandBlank,锁定要填数字的空格子 + int i = emptyPlaid[lock][0]; + int j = emptyPlaid[lock][1]; + MAP[i][j] = additionDiamonds; +} + +void PrintRule(int counter)//定义函数PrintRule,明确十六个元素的输出法则 +{ + int t = MAP[counter / 4][counter % 4]; + if (t != 0) + { + cout << left << setw(6) << setfill(' ') << t; + } + else + { + cout << left << setw(6) << setfill(' ') << "-"; + } +} + +void PrintMap(int(&MAP)[MapSize][MapSize]) +{ + int counter{}; + for (int i = 0; i < 4; ++i) + { + for (int j = 0; j < 4; ++j) + { + PrintRule(counter++); + } + cout << endl << endl; + } + +} + +int Updo(int(&MAP)[MapSize][MapSize]) +{ + int col{ 0 }; + int row{ 0 }; + for (col = 0; col <= 3; ++col)//列 + { + + for (row = 0; row <= 2; ++row) + { + if (MAP[row][col] == 0)//判断0的存在与否 + { + for (int i{ row }; i <= 2; ++i) + { + MAP[i][col] = MAP[i + 1][col]; + } + MAP[3][col] = 0; + } + } + for (row = 0; row <= 2; ++row) + { + if (MAP[row][col] == 0)//判断0的存在与否 + { + for (int i{ row }; i <= 2; ++i) + { + MAP[i][col] = MAP[i + 1][col]; + } + MAP[3][col] = 0; + } + } + for (row = 0; row <= 2; ++row) + { + if (MAP[row][col] == 0)//判断0的存在与否 + { + for (int i{ row }; i <= 2; ++i) + { + MAP[i][col] = MAP[i + 1][col]; + } + MAP[3][col] = 0; + } + } + row = 0; + if (MAP[0][col] == MAP[1][col])//不用考虑0,一样操作 + { + score += MAP[0][col]; + MAP[0][col] *= 2; + if (MAP[2][col] == MAP[3][col])//不能一次性合成两次 + { + score += MAP[1][col]; + MAP[1][col] = 2 * MAP[2][col]; + MAP[2][col] = 0, MAP[3][col] = 0; + } + else MAP[1][col] = MAP[2][col], MAP[2][col] = MAP[3][col], MAP[3][col] = 0; + } + else if (MAP[1][col] == MAP[2][col]) + { + score += MAP[1][col]; + MAP[1][col] *= 2; + MAP[2][col] = MAP[3][col]; + MAP[3][col] = 0; + } + else if (MAP[2][col] == MAP[3][col]) + { + score += MAP[2][col]; + MAP[2][col] *= 2; + MAP[3][col] = 0; + } + else; + } + return score; +} + +bool Upable(int(&MAP)[MapSize][MapSize]) +{ + int is{ 0 }; + int MAP2[MapSize][MapSize]; + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + MAP2[row][col] = MAP[row][col]; + } + } + Updo(MAP); + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + if (MAP2[row][col] != MAP[row][col]) + is += 1; + } + } + return is > 0 ? true : false; +} + +int Downdo(int(&MAP)[MapSize][MapSize]) +{ + int col{ 0 }; + int row{ 0 }; + for (col = 0; col <= 3; ++col)//列 + { + + for (row = 3; row >= 1; --row) + { + if (MAP[row][col] == 0) + { + for (int i{ row }; i >= 1; --i) + { + MAP[i][col] = MAP[i - 1][col]; + } + MAP[0][col] = 0; + } + } + for (row = 3; row >= 1; --row) + { + if (MAP[row][col] == 0) + { + for (int i{ row }; i >= 1; --i) + { + MAP[i][col] = MAP[i - 1][col]; + } + MAP[0][col] = 0; + } + } + for (row = 3; row >= 1; --row) + { + if (MAP[row][col] == 0) + { + for (int i{ row }; i >= 1; --i) + { + MAP[i][col] = MAP[i - 1][col]; + } + MAP[0][col] = 0; + } + } + row = 0; + if (MAP[3][col] == MAP[2][col])//不用考虑0,一样操作 + { + score += MAP[3][col]; + MAP[3][col] *= 2; + if (MAP[1][col] == MAP[0][col]) + { + score += MAP[1][col]; + MAP[2][col] = 2 * MAP[1][col]; + MAP[1][col] = 0, MAP[0][col] = 0; + } + else MAP[2][col] = MAP[1][col], MAP[1][col] = MAP[0][col], MAP[0][col] = 0; + } + else if (MAP[1][col] == MAP[2][col]) + { + score += MAP[1][col]; + MAP[2][col] *= 2; + MAP[1][col] = MAP[0][col]; + MAP[0][col] = 0; + } + else if (MAP[1][col] == MAP[0][col]) + { + score += MAP[1][col]; + MAP[1][col] *= 2; + MAP[0][col] = 0; + } + else; + } + return score; +} + +bool Downable(int(&MAP)[MapSize][MapSize]) +{ + int is{ 0 }; + int MAP2[MapSize][MapSize]; + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + MAP2[row][col] = MAP[row][col]; + } + } + Downdo(MAP); + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + if (MAP2[row][col] != MAP[row][col]) + is += 1; + } + } + return is > 0 ? true : false; +} + +int Leftdo(int(&MAP)[MapSize][MapSize])//相当于交换row col +{ + int row{ 0 }; + int col{ 0 }; + int a[MapSize][MapSize]; + for (int row = 0; row <= 3; ++row) + { + for (int col = 0; col <= 3; ++col) + { + a[col][row] = MAP[row][col]; + } + } + Updo(a); + for (int row = 0; row <= 3; ++row) + { + for (int col = 0; col <= 3; ++col) + { + MAP[col][row] = a[row][col]; + } + } + return score; +} + +bool Leftable(int(&MAP)[MapSize][MapSize]) +{ + int is{ 0 }; + int MAP2[MapSize][MapSize]; + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + MAP2[row][col] = MAP[row][col]; + } + } + Leftdo(MAP); + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + if (MAP2[row][col] != MAP[row][col]) + is += 1; + } + } + return is > 0 ? true : false; +} + +int Rightdo(int(&MAP)[MapSize][MapSize])//相当于交换row col +{ + int row{ 0 }; + int col{ 0 }; + int a[MapSize][MapSize]; + for (int row = 0; row <= 3; ++row) + { + for (int col = 0; col <= 3; ++col) + { + a[col][row] = MAP[row][col]; + } + } + Downdo(a); + for (int row = 0; row <= 3; ++row) + { + for (int col = 0; col <= 3; ++col) + { + MAP[col][row] = a[row][col]; + } + } + return score; +} + +bool Rightable(int(&MAP)[MapSize][MapSize]) +{ + int is{ 0 }; + int MAP2[MapSize][MapSize]; + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + MAP2[row][col] = MAP[row][col]; + } + } + Rightdo(MAP); + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + if (MAP2[row][col] != MAP[row][col]) + is += 1; + } + } + return is > 0 ? true : false; +} + +int mymax(int(&MAP)[MapSize][MapSize]) +{ + int a{ 0 }; + for (int row{ 0 }; row <= 3; ++row) + { + for (int col{ 0 }; col <= 3; ++col) + { + a = a >= MAP[row][col] ? a : MAP[row][col]; + } + } + return a; +} \ No newline at end of file