- C++
用C++代码做了一个小游戏,大家看看,给一点建议。。。
- 2023-3-4 18:43:37 @
#include <bits/stdc++.h> #include <windows.h> using namespace std; const int MAXN = 35; int a[MAXN][MAXN], c[MAXN][MAXN], op, l, ls, x, y, cnt = 0, cnt1 = 0, hard[7] = {0, 10, 8, 6, 5, 4}; int dx[4] = {-1, 0, 0, 1}; int dy[4] = {0, -1, 1, 0}; bool b[MAXN][MAXN], d[MAXN][MAXN], boom = 1; int main(); void init(); int rand1(int); int r(int); void dfs(int, int); void print(); bool judge(int); void startGame(); void play(); int rand1(int num){ return 1LL * rand() % num + 1; }
int r(int num){ return 1LL * rand1(num) % num * rand1(num) % num + 1; }
void dfs(int xa, int ya){ if(xa < 1 || ya < 1 || xa > l || ya > l || b[xa][ya]){ return; } c[xa][ya] = 1; d[xa][ya] = 1; if(a[xa][ya]){ return; } for(int i = 0;i < 4;i++){ if(!d[xa + dx[i]][ya + dy[i]]){ dfs(xa + dx[i], ya + dy[i]); } } }
void print(){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for(int i = 1;i <= l;i++){ printf("%d ", i); if(i < 10){ printf(" "); } } printf("\n"); for(int i = 1;i <= l;i++){ printf("\n%d", i); if(i >= 10){ printf(" "); } else{ printf(" "); } for(int j = 1;j <= l;j++){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if(c[i][j] == 1){ if(a[i][j] < 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if(a[i][j] < 4){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if(a[i][j] < 5){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else if(c[i][j] == 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } else{ printf("? "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n---------------\n数字为周围 8 格中雷的数量,* 为标记为雷,? 为未知\n"); }
bool judge(int x){ if(x >= 1 && x <= l){ return false; } else{ return true; } }
void init(){ srand(time(0)); printf("扫雷 v1.5.3,若有新版本,我会立即更新。\n作者:路子峰1\n若有建议请提出,谢谢\n"); system("pause"); system("cls"); startGame(); } void startGame(){ printf("请输入方阵的长(5-30之间):"); scanf("%d", &op); while(op < 5 || op > 30){ printf("不在范围内,请重新输入:"); scanf("%d", &op); } l = op; printf("请设置难度(1-5):"); scanf("%d", &op); while(op < 1 || op > 5){ printf("不在范围内,请重新输入:"); scanf("%d", &op); } ls = l * l / hard[op]; printf("本局共 %d 个雷\n", ls); while(cnt < ls){ x = r(l); y = r(l); if(!b[x][y]){ b[x][y] = 1; cnt++; } } for(int i = 1;i <= l;i++){ for(int j = 1;j <= l;j++){ if(!b[i][j]){ a[i][j] = b[i - 1][j - 1] + b[i - 1][j] + b[i - 1][j + 1] + b[i][j - 1] + b[i][j + 1] + b[i + 1][j - 1] + b[i + 1][j] + b[i + 1][j + 1]; } } } cnt = 0; play(); } int main(){ init(); return 0; } void play(){ while(cnt < ls && cnt1 < l * l - ls){ system("pause"); system("cls"); print(); read: printf("\n---------\n翻开输入 1,标记输入 2,撤销标记输入 3:\n"); scanf("%d", &op); if(op == 1){ printf("请输入要翻开的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将翻开 x = %d, y = %d 的格子。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] == 1){ printf("已经被翻开过了\n"); continue; } else if(c[x][y] == 2){ printf("已被标记为雷,请撤销标记后重试\n"); continue; } c[x][y] = 1; cnt1++; if(b[x][y] == 1){ printf("BOON\n你踩到了雷,游戏结束\n"); boom = 0; break; } else{ c[x][y] = 1; if(a[x][y] == 0){ dfs(x, y); } } } else if(op == 2){ printf("请输入要标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将标记 x = %d, y = %d 的格子为雷。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] == 1){ printf("已经翻开过并且不是雷,请重新输入\n"); continue; } else if(c[x][y] == 2){ printf("已被标记为雷,请重新输入\n"); continue; } c[x][y] = 2; if(b[x][y] == 1){ cnt++; } } else if(op == 3){ printf("请输入要取消标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while(judge(x) || judge(y)){ printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将取消在 x = %d, y = %d 的格子上的雷标记。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if(op){ goto read; } if(c[x][y] != 2){ printf("未被标记,请重新输入\n"); continue; } c[x][y] = 0; if(b[x][y] == 1){ cnt--; } } } if(boom){ printf("恭喜你胜利!\n"); } system("pause"); system("cls"); printf("终局:\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for(int i = 1;i <= l;i++){ printf("%d ", i); if(i < 10){ printf(" "); } } printf("\n"); for(int i = 1;i <= l;i++){ printf("\n%d", i); if(i >= 10){ printf(" "); } else{ printf(" "); } for(int j = 1;j <= l;j++){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if(!b[i][j]){ if(a[i][j] < 2){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if(a[i][j] < 4){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if(a[i][j] < 5){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n----------------\n数字为周围 8 格中雷的数量,* 为雷\n"); Sleep(2000); system("pause"); system("cls"); printf("请问是否要重新开始游戏?是请输入 1,不是请输入 2:\n"); scanf("%d", &op); if(op == 1){ memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); memset(d, 0, sizeof(d)); cnt = 0; cnt1 = 0; boom = 1; startGame(); } else{ printf("游戏结束!\n"); } }
6 条评论
-
掉榜模式 (王靖翔) LV 7 @ 2023-3-6 20:21:21已修改
我是继承丁泓森帮你写代码块的
#include <bits/stdc++.h> #include <windows.h> using namespace std; const int MAXN = 35; int a[MAXN][MAXN], c[MAXN][MAXN], op, l, ls, x, y, cnt = 0, cnt1 = 0, hard[7] = {0, 10, 8, 6, 5, 4}; int dx[4] = {-1, 0, 0, 1}; int dy[4] = {0, -1, 1, 0}; bool b[MAXN][MAXN], d[MAXN][MAXN], boom = 1; int main(); void init(); int rand1(int); int r(int); void dfs(int, int); void print(); bool judge(int); void startGame(); void play(); int rand1(int num) { return 1LL * rand() % num + 1; } int r(int num) { return 1LL * rand1(num) % num * rand1(num) % num + 1; } void dfs(int xa, int ya) { if (xa < 1 || ya < 1 || xa > l || ya > l || b[xa][ya]) { return; } c[xa][ya] = 1; d[xa][ya] = 1; if (a[xa][ya]) { return; } for (int i = 0; i < 4; i++) { if (!d[xa + dx[i]][ya + dy[i]]) { dfs(xa + dx[i], ya + dy[i]); } } } void print() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for (int i = 1; i <= l; i++) { printf("%d ", i); if (i < 10) { printf(" "); } } printf("\n"); for (int i = 1; i <= l; i++) { printf("\n%d", i); if (i >= 10) { printf(" "); } else { printf(" "); } for (int j = 1; j <= l; j++) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if (c[i][j] == 1) { if (a[i][j] < 2) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if (a[i][j] < 4) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if (a[i][j] < 5) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else if (c[i][j] == 2) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } else { printf("? "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n---------------\n数字为周围 8 格中雷的数量,* 为标记为雷,? " "为未知\n"); } bool judge(int x) { if (x >= 1 && x <= l) { return false; } else { return true; } } void init() { srand(time(0)); printf( "扫雷 " "v1.5." "3,若有新版本,我会立即更新。\n作者:路子峰1\n若有建议请提出,谢谢\n"); system("pause"); system("cls"); startGame(); } void startGame() { printf("请输入方阵的长(5-30之间):"); scanf("%d", &op); while (op < 5 || op > 30) { printf("不在范围内,请重新输入:"); scanf("%d", &op); } l = op; printf("请设置难度(1-5):"); scanf("%d", &op); while (op < 1 || op > 5) { printf("不在范围内,请重新输入:"); scanf("%d", &op); } ls = l * l / hard[op]; printf("本局共 %d 个雷\n", ls); while (cnt < ls) { x = r(l); y = r(l); if (!b[x][y]) { b[x][y] = 1; cnt++; } } for (int i = 1; i <= l; i++) { for (int j = 1; j <= l; j++) { if (!b[i][j]) { a[i][j] = b[i - 1][j - 1] + b[i - 1][j] + b[i - 1][j + 1] + b[i][j - 1] + b[i][j + 1] + b[i + 1][j - 1] + b[i + 1][j] + b[i + 1][j + 1]; } } } cnt = 0; play(); } int main() { init(); return 0; } void play() { while (cnt < ls && cnt1 < l * l - ls) { system("pause"); system("cls"); print(); read: printf("\n---------\n翻开输入 1,标记输入 2,撤销标记输入 3:\n"); scanf("%d", &op); if (op == 1) { printf("请输入要翻开的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while (judge(x) || judge(y)) { printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将翻开 x = %d, y = %d 的格子。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if (op) { goto read; } if (c[x][y] == 1) { printf("已经被翻开过了\n"); continue; } else if (c[x][y] == 2) { printf("已被标记为雷,请撤销标记后重试\n"); continue; } c[x][y] = 1; cnt1++; if (b[x][y] == 1) { printf("BOON\n你踩到了雷,游戏结束\n"); boom = 0; break; } else { c[x][y] = 1; if (a[x][y] == 0) { dfs(x, y); } } } else if (op == 2) { printf("请输入要标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while (judge(x) || judge(y)) { printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf( "您将标记 x = %d, y = %d 的格子为雷。请输入数字 0 确认操作:", x, y); scanf("%d", &op); if (op) { goto read; } if (c[x][y] == 1) { printf("已经翻开过并且不是雷,请重新输入\n"); continue; } else if (c[x][y] == 2) { printf("已被标记为雷,请重新输入\n"); continue; } c[x][y] = 2; if (b[x][y] == 1) { cnt++; } } else if (op == 3) { printf("请输入要取消标记的 x, y 坐标(从1开始到%d为止):", l); scanf("%d%d", &x, &y); while (judge(x) || judge(y)) { printf("范围错误,请重新输入:\n"); scanf("%d%d", &x, &y); } printf("您将取消在 x = %d, y = %d 的格子上的雷标记。请输入数字 0 " "确认操作:", x, y); scanf("%d", &op); if (op) { goto read; } if (c[x][y] != 2) { printf("未被标记,请重新输入\n"); continue; } c[x][y] = 0; if (b[x][y] == 1) { cnt--; } } } if (boom) { printf("恭喜你胜利!\n"); } system("pause"); system("cls"); printf("终局:\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); printf("x\y "); for (int i = 1; i <= l; i++) { printf("%d ", i); if (i < 10) { printf(" "); } } printf("\n"); for (int i = 1; i <= l; i++) { printf("\n%d", i); if (i >= 10) { printf(" "); } else { printf(" "); } for (int j = 1; j <= l; j++) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); if (!b[i][j]) { if (a[i][j] < 2) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); } else if (a[i][j] < 4) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE); } else if (a[i][j] < 5) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE); } printf("%d ", a[i][j]); } else { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED); printf("* "); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); } printf("\n"); } printf("\n----------------\n数字为周围 8 格中雷的数量,* 为雷\n"); Sleep(2000); system("pause"); system("cls"); printf("请问是否要重新开始游戏?是请输入 1,不是请输入 2:\n"); scanf("%d", &op); if (op == 1) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); memset(d, 0, sizeof(d)); cnt = 0; cnt1 = 0; boom = 1; startGame(); } else { printf("游戏结束!\n"); } }
-
2023-3-5 20:01:06@
您确定您这是自己做的?
-
2023-3-5 12:03:35@
您好,这是 python 社区,请您在适当的社区里发言,谢谢合作~
-
2023-3-4 21:07:34@
代码块记得点一下,,,
-
2023-3-4 20:05:15@
这是什么
???
-
2023-3-4 20:04:41@
呃呃呃.....................................................................................
- 1