upd:2024/7/8 优化了一些代码。。。修了一些bug。。。
这是我发布的第一篇文章,求赞!
废话不多说,直接开始。
(懒得加注释,免得大家删来删去的。。。)
一、开头
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#define Max 10 //地图大小
using namespace std;
int starNum = 1;
int score = 0; //段位分
string version = "v1.1.3", season = "S1赛季";
string tmpName; //临时名称,用于读导存档
二、初始化
void initMap(char map[Max][Max],int boomNum){ //初始化地图
int i,j,z,x,y;
int a[8] = {-1,-1,-1,0,1,1,1,0};
int b[8] = {-1,0,1,1,1,0,-1,-1};
srand((unsigned)time(NULL));
for(i=0; i<Max; i++)
for(j=0; j<Max; j++)
map[i][j] = '?';
for(z=0; z<boomNum; z++){
i = rand() % Max;
j = rand() % Max;
if(map[i][j] == '*') boomNum++;
else map[i][j] = '*';
}
for(i=0; i<Max; i++){
for(j=0; j<Max; j++){
if(map[i][j] == '*') continue;
map[i][j] = '0';
for(z=0; z<8; z++){
x = i + a[z];
y = j + b[z];
if(x>=0 && x<Max && y>=0 && y<Max && map[x][y]=='*')
map[i][j]++;
}
}
}
}
void initPlayerViewMap(char playerViewMap[Max][Max]){ //初始化玩家地图
int i, j;
for(i=0; i<Max; i++)
for(j=0; j<Max; j++)
playerViewMap[i][j] = '?';
}
三、读档和存档
void fileOut(string name){ //存档
cout << "正在存档\n";
tmpName = name;
name += ".txt";
FILE* fp = fopen(name.c_str(),"w");
fprintf(fp,"%d\n",num);
fclose(fp);
Sleep(2000);
cout << "存档完成\n";
name = tmpName; //还原名字
return;
}
void fileIn(string name){ //读档
cout << "正在读档\n";
tmpName = name
name += ".txt";
FILE* fp = fopen(name.c_str(),"r");
if(fp != NULL){
num = fscanf(fp,"%d",&num);
winNum = fscanf(fp,"%d",&winNum);
loseNum = fscanf(fp,"%d",&loseNum);
starNum = fscanf(fp,"%d",&starNum);
fclose(fp);
Sleep(2000);
cout << "读取成功\n";
name = tmpName;
} else {
Sleep(2000);
cout << "未找到存档,已自动创建存档\n";
system("cls");
name = tmpName;
fileOut(name);
}
return;
}
四、判定等级(可自己修改)
void dw(int score){ // 判定段位等级
if(score <= 500){
setColor(0,14);
if(score <= 100) cout << "青铜I\n";
else if(score <= 200) cout << "青铜II\n";
else if(score <= 300) cout << "青铜III\n";
else if(score <= 400) cout << "青铜IV\n";
else if(score <= 500) cout << "青铜V\n";
} else if(score <= 1500){
setColor(0,7);
if(score <= 700) cout << "白银I\n";
else if(score <= 900) cout << "白银II\n";
else if(score <= 1100) cout << "白银III\n";
else if(score <= 1300) cout << "白银IV\n";
else if(score <= 1500) cout << "白银V\n";
} else if(score <= 3000){
setColor(0,6);
if(score <= 3000) cout << "黄金I\n";
else if(score <= 2100) cout << "黄金II\n";
else if(score <= 2400) cout << "黄金III\n";
else if(score <= 2700) cout << "黄金IV\n";
else if(score <= 3000) cout << "黄金V\n";
} else if(score <= 5000){
setColor(0,1);
if(score <= 3400) cout << "铂金I\n";
else if(score <= 3800) cout << "铂金II\n";
else if(score <= 4200) cout << "铂金III\n";
else if(score <= 4600) cout << "铂金IV\n";
else if(score <= 5000) cout << "铂金V\n";
} else if(score <= 7500){
setColor(0,9);
if(score <= 5500) cout << "钻石I\n";
else if(score <= 6000) cout << "钻石II\n";
else if(score <= 6500) cout << "钻石III\n";
else if(score <= 7000) cout << "钻石IV\n";
else if(score <= 7500) cout << "钻石V\n";
} else if(score <= 10500){
setColor(0,5);
if(score <= 8100) cout << "星耀I\n";
else if(score <= 8700) cout << "星耀II\n";
else if(score <= 9300) cout << "星耀III\n";
else if(score <= 9900) cout << "星耀IV\n";
else if(score <= 10500) cout << "星耀V\n";
} else if(score > 10500){
setColor(0,12);
cout << "王者 " << starNum << "※" << "\n";
}
}
五、打印地图
void printViewMap(char playerViewMap[Max][Max],char map[Max][Max]){ //显示玩家地图
int i, j;
cout << " ";
for(i=0; i<Max; i++){
setColor(7,0);
cout << i%10 << " ";
}
cout << endl;
for(i=0; i<Max; i++){
setColor(7,0);
cout << " " << i%10 << " ";
for(j=0; j<Max; j++){
if(playerViewMap[i][j] == '?'){
setColor(0,7);
cout << "? ";
}else{
setColor(7,0);
cout << map[i][j] << " ";
}
}
cout << endl;
}
}
void printMap(char map[Max][Max]){ //打印地图
int i,j;
cout << " ";
for(i=0; i<Max; i++){
setColor(7,0);
cout << i%10 << " ";
}
cout << endl;
for(i=0;i<Max;i++){
setColor(7,0);
cout << " " << i%10 << " ";
for(j=0; j<Max; j++){
cout << map[i][j] << " ";
}
setColor(7,0);
cout << endl;
}
}
六、判定胜利/失败
bool operate(int i,int j,char playerViewMap[Max][Max],char map[Max][Max]){
// 判定格子
if(map[i][j] == '*') return true;
else if(map[i][j]!= '0' && map[i][j]!='*')
playerViewMap[i][j] = map[i][j];
else if(map[i][j] == '0')
dfs(i,j,playerViewMap,map);
return false;
}
bool isWin(char playerViewMap[Max][Max],char map[Max][Max]){
// 判断是否胜利
int i,j;
for(i=0; i<Max; i++){
for(j=0; j<Max; j++){
if(map[i][j]!='*'&&playerViewMap[i][j]=='?')
return false;
}
}
return true;
}
七、启动游戏
void game(int boomNum){ //启动游戏
char map[Max][Max];
char playerViewMap[Max][Max];
int i,j;
initMap(map,boomNum);
initPlayerViewMap(playerViewMap);
system("cls");
while(true){
printViewMap(playerViewMap,map);
setColor(7,0);
cout << "剩余雷数:" << boomNum << endl;
cout << "请输入点位坐标:";
cin >> i >> j;
if(operate(i,j,playerViewMap,map)) break;
else if(isWin(playerViewMap,map)) break;
system("cls");
}
system("cls");
printMap(map);
if(isWin(playerViewMap,map)){
cout << "YOU WIN!你赢了!\n";
if(boomNum == 5) score += 20;
else if(boomNum == 15) score += 50;
else if(boomNum == 25) score += 80;
else if(boomNum == 50) score += 100;
else score += boomNum * 2;
winNum++;
} else{
cout << "Boom!!!\n你踩雷了!:P\n";
if(boomNum == 5 && score >= 20) score -= 20;
else if(boomNum == 15 && score >= 15) score -= 15;
else if(boomNum == 25 && score >= 10) score -= 10;
else if(boomNum == 50 && score >= 10) score -= 10;
else if(score >= boomNum * 2) score -= boomNum * 2;
loseNum++;
}
Sleep(1000);
cout << "正在返回主页面...";
Sleep(2000);
return;
}
八、主函数(main):
int main(){
int input;
InitGame:;
system("cls");
cout << "------------------------------\n";
cout << "| |\n";
cout << "| 扫 雷 游 戏 |\n";
cout << "| |\n";
cout << "| "<<version<<" |\n";
cout << "------------------------------\n\n";
cout << "1.登录 2.注册\n:";
cin >> input;
if(input == 1) fileIn();
else if(input == 2){
cout << "请输入你的名字:";
cin >> name;
fileOut();
goto InitGame;
} else{
cout << "无效输入!!";
Sleep(1000);
system("cls");
goto InitGame;
}
Sleep(3000);
while(1){
Game:;
system("cls");
cout << "主页面\n";
cout << "------------------------------\n";
cout << "Hi,"; Sleep(500); cout << "玩家'" << name << "',";
Sleep(500); cout << "你好!\n"; Sleep(500);
cout << "当前段位分:" << score << " ";
Sleep(500); dw(score); Sleep(500);
setColor(7,0);
cout << "胜利数:" << winNum; Sleep(500);
cout << " 失败数:" << loseNum << endl; Sleep(500);
cout << "------------------------------\n";
Sleep(500); cout << "想干点什么?\n";
Sleep(500);
cout << "1.排位赛("<<season<<") 2.休闲(暂未开放) 3.导出存档 4.查看版本 5.退出游戏\n";
cin >> input;
if(input == 1){
cout << "请选择难度\n"; Sleep(500);
cout << "1.简单 2.普通 3.困难 4.大师 5.自定义\n:";
cin >> input;
system("cls");
cout << "3秒钟后将开始游戏\n";
cout << "3,"; Sleep(1000);
cout << "2,"; Sleep(1000);
cout << "1!"; Sleep(1000);
if(input == 1) game(10);
else if(input == 2) game(25);
else if(input == 3) game(40);
else if(input == 4) game(50);
if(input == 5){
cout << "\n请输入雷数:";
cin >> input;
game(input);
}
} else if(input == 2){
cout << "暂未开放!!!";
Sleep(3000);
system("cls");
goto Game;
} else if(input == 3){
fileOut();
system("cls");
goto Game;
} else if(input == 4){
system("cls");
cout << "游戏名称:扫雷游戏\n"; Sleep(200);
cout << "游戏版本:" << version << endl; Sleep(200);
cout << "更新日志:\n"; Sleep(200);
cout << " v1.0.0 创建游戏\n"; Sleep(200);
cout << " v1.0.3 修复地图越界bug,添加dfs自动翻开0\n"; Sleep(200);
cout << " v1.0.5 设置颜色,防止看错符号\n"; Sleep(200);
cout << " v1.1.0 添加主页面,登录系统,防止存档丢失\n"; Sleep(200);
cout << " v1.1.3 添加段位及排位系统,增加游戏的趣味性\n"; Sleep(200);
cout << "游戏logo(禁止盗用):\n"; Sleep(500);
cout << " 0 1 2 3 4\n";
cout << " 0 * ? 1 2 ?\n";
cout << " 1 ? * * 1 ?\n";
cout << " 2 1 * 1 ? 0\n";
cout << " 3 4 1 3 * ?\n";
cout << " 4 * * * ? 1\n";
cout << " 扫雷游戏 \n";
Sleep(3000);
} else if(input == 5){
cout << "确定要退出游戏吗?(请确保游戏已保存) 1.Y 2.N\n:";
cin >> input;
if(input == 1){
cout << "\n";
system("pause");
exit(1);
} else if(input == 2){
cout << "已取消\n";
Sleep(3000);
system("cls");
goto Game;
}
} else {
cout << "输入无效!!!";
system("cls");
goto Game;
}
}
}
(发现漏了颜色更改,就加上吧):
void setColor(int color,int bgColor){ //设置颜色
WORD wColor = ((bgColor&0x0F)<<4)+(color&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
完整代码:
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
#define Max 10 //地图大小
using namespace std;
int starNum = 1,score;
string version = "v1.1.3", season = "S1赛季";
string tmpName; //名字
void initMap(char map[Max][Max],int boomNum){ //初始化地图
int i,j,z,x,y;
int a[8] = {-1,-1,-1,0,1,1,1,0};
int b[8] = {-1,0,1,1,1,0,-1,-1};
srand((unsigned)time(NULL));
for(i=0; i<Max; i++)
for(j=0; j<Max; j++)
map[i][j] = '?';
for(z=0; z<boomNum; z++){
i = rand() % Max;
j = rand() % Max;
if(map[i][j] == '*') boomNum++;
else map[i][j] = '*';
}
for(i=0; i<Max; i++){
for(j=0; j<Max; j++){
if(map[i][j] == '*') continue;
map[i][j] = '0';
for(z=0; z<8; z++){
x = i + a[z];
y = j + b[z];
if(x>=0 && x<Max && y>=0 && y<Max && map[x][y]=='*')
map[i][j]++;
}
}
}
}
void fileOut(string name){ //存档
cout << "正在存档\n";
tmpName = name;
name += ".txt";
FILE* fp = fopen(name.c_str(),"w");
fprintf(fp,"%d",score);
fclose(fp);
Sleep(2000);
cout << "存档完成\n";
name = tmpName;
Sleep(2000);
return;
}
void fileIn(string name){ //读档
cout << "正在读档\n";
tmpName = name;
name += ".txt";
FILE* fp = fopen(name.c_str(),"r");
if(fp != NULL){
score = fscanf(fp,"%d",&score);
fclose(fp);
Sleep(2000);
cout << "读取成功\n";
name = tmpName;
} else {
Sleep(2000);
cout << "未找到存档,已自动创建存档\n";
system("cls");
Sleep(2000);
name = tmpName;
fileOut(name);
}
return;
}
void initPlayerViewMap(char playerViewMap[Max][Max]){ //初始化玩家地图
int i, j;
for(i=0; i<Max; i++)
for(j=0; j<Max; j++)
playerViewMap[i][j] = '?';
}
void setColor(int color,int bgColor){ //设置颜色
WORD wColor = ((bgColor&0x0F)<<4)+(color&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
void dw(int score){ // 判定段位等级
if(score <= 500){
setColor(0,14);
if(score <= 100) cout << "青铜I\n";
else if(score <= 200) cout << "青铜II\n";
else if(score <= 300) cout << "青铜III\n";
else if(score <= 400) cout << "青铜IV\n";
else if(score <= 500) cout << "青铜V\n";
} else if(score <= 1500){
setColor(0,7);
if(score <= 700) cout << "白银I\n";
else if(score <= 900) cout << "白银II\n";
else if(score <= 1100) cout << "白银III\n";
else if(score <= 1300) cout << "白银IV\n";
else if(score <= 1500) cout << "白银V\n";
} else if(score <= 3000){
setColor(0,6);
if(score <= 3000) cout << "黄金I\n";
else if(score <= 2100) cout << "黄金II\n";
else if(score <= 2400) cout << "黄金III\n";
else if(score <= 2700) cout << "黄金IV\n";
else if(score <= 3000) cout << "黄金V\n";
} else if(score <= 5000){
setColor(0,1);
if(score <= 3400) cout << "铂金I\n";
else if(score <= 3800) cout << "铂金II\n";
else if(score <= 4200) cout << "铂金III\n";
else if(score <= 4600) cout << "铂金IV\n";
else if(score <= 5000) cout << "铂金V\n";
} else if(score <= 7500){
setColor(0,9);
if(score <= 5500) cout << "钻石I\n";
else if(score <= 6000) cout << "钻石II\n";
else if(score <= 6500) cout << "钻石III\n";
else if(score <= 7000) cout << "钻石IV\n";
else if(score <= 7500) cout << "钻石V\n";
} else if(score <= 10500){
setColor(0,5);
if(score <= 8100) cout << "星耀I\n";
else if(score <= 8700) cout << "星耀II\n";
else if(score <= 9300) cout << "星耀III\n";
else if(score <= 9900) cout << "星耀IV\n";
else if(score <= 10500) cout << "星耀V\n";
} else if(score > 10500){
setColor(0,12);
cout << "王者\n";
}
}
void printViewMap(char playerViewMap[Max][Max],char map[Max][Max]){ //显示玩家地图
int i, j;
cout << " ";
for(i=0; i<Max; i++){
setColor(7,0);
cout << i%10 << " ";
}
cout << endl;
for(i=0; i<Max; i++){
setColor(7,0);
cout << " " << i%10 << " ";
for(j=0; j<Max; j++){
if(playerViewMap[i][j] == '?'){
setColor(0,7);
cout << "? ";
}else{
setColor(7,0);
cout << map[i][j] << " ";
}
}
cout << endl;
}
}
void dfs(int i,int j,char playerViewMap[Max][Max],char map[Max][Max]){
//翻开为0时自动搜索附近格子(深度优先搜索)
if(i<0 || i>=Max || j<0 || j>=Max || playerViewMap[i][j]=='0') return;
playerViewMap[i][j] = map[i][j];
if(map[i][j] != '0') return;
if(i >= 0) dfs(i-1,j,playerViewMap,map);
if(i < Max) dfs(i+1,j,playerViewMap,map);
if(j >= 0) dfs(i,j-1,playerViewMap,map);
if(j < Max) dfs(i,j+1,playerViewMap,map);
}
bool operate(int i,int j,char playerViewMap[Max][Max],char map[Max][Max]){
// 判定格子
if(map[i][j] == '*') return true;
else if(map[i][j]!= '0' && map[i][j]!='*')
playerViewMap[i][j] = map[i][j];
else if(map[i][j] == '0')
dfs(i,j,playerViewMap,map);
return false;
}
bool isWin(char playerViewMap[Max][Max],char map[Max][Max]){
// 判断是否胜利
int i,j;
for(i=0; i<Max; i++){
for(j=0; j<Max; j++){
if(map[i][j]!='*'&&playerViewMap[i][j]=='?')
return false;
}
}
return true;
}
void printMap(char map[Max][Max]){ //打印地图
int i,j;
cout << " ";
for(i=0; i<Max; i++){
setColor(7,0);
cout << i%10 << " ";
}
cout << endl;
for(i=0;i<Max;i++){
setColor(7,0);
cout << " " << i%10 << " ";
for(j=0; j<Max; j++){
cout << map[i][j] << " ";
}
setColor(7,0);
cout << endl;
}
}
void game(int boomNum){ //启动游戏
char map[Max][Max];
char playerViewMap[Max][Max];
int i,j;
initMap(map,boomNum);
initPlayerViewMap(playerViewMap);
system("cls");
while(true){
printViewMap(playerViewMap,map);
setColor(7,0);
cout << "雷数:" << boomNum << endl;
cout << "请输入点位坐标:";
cin >> i >> j;
if(operate(i,j,playerViewMap,map)) break;
else if(isWin(playerViewMap,map)) break;
system("cls");
}
system("cls");
printMap(map);
if(isWin(playerViewMap,map)){
cout << "YOU WIN!你赢了!\n";
if(boomNum == 5) score += 20;
else if(boomNum == 15) score += 50;
else if(boomNum == 25) score += 80;
else if(boomNum == 50) score += 100;
else score += boomNum * 2;
} else{
cout << "Boom!!!\n你踩雷了!:P\n";
if(boomNum == 5 && score >= 20) score -= 20;
else if(boomNum == 15 && score >= 15) score -= 15;
else if(boomNum == 25 && score >= 10) score -= 10;
else if(boomNum == 50 && score >= 10) score -= 10;
else if(score >= boomNum * 2) score -= boomNum * 2;
}
Sleep(1000);
cout << "正在返回主页面...";
Sleep(2000);
return;
}
int main(){
string name;
char input;
int boomNum = 0;
InitGame:;
system("cls");
cout << "------------------------------\n";
cout << "| |\n";
cout << "| 扫 雷 游 戏 |\n";
cout << "| |\n";
cout << "| "<<version<<" |\n";
cout << "------------------------------\n\n";
cout << "1.登录 2.注册\n";
input = getch();
if(input == '1'){
cout << "请输入名称:";
cin >> name;
fileIn(name);
} else if(input == '2'){
cout << "请输入你的名字:";
cin >> name;
fileOut(name);
goto InitGame;
} else{
cout << "无效输入!!";
Sleep(1000);
system("cls");
goto InitGame;
}
Sleep(3000);
while(1){
Game:;
system("cls");
cout << "主页面\n";
cout << "------------------------------\n";
cout << "Hi,"; Sleep(200); cout << "玩家'" << name << "',";
Sleep(200); cout << "你好!\n"; Sleep(200);
cout << "当前段位分:" << score << " ";
Sleep(200); dw(score); Sleep(200);
setColor(7,0);
cout << "------------------------------\n";
Sleep(200); cout << "想干点什么?\n";
Sleep(200);
cout << "1.排位赛("<<season<<") 2.休闲(暂未开放) 3.导出存档 4.查看版本 5.退出游戏\n";
input = getch();
if(input == '1'){
cout << "请选择难度\n"; Sleep(500);
cout << "1.简单 2.普通 3.困难 4.大师 5.自定义\n:";
cin >> input;
system("cls");
cout << "3秒钟后将开始游戏\n";
cout << "3,"; Sleep(1000);
cout << "2,"; Sleep(1000);
cout << "1!"; Sleep(1000);
if(input == '1') game(5);
else if(input == '2') game(15);
else if(input == '3') game(25);
else if(input == '4') game(50);
if(input == 5){
cout << "\n请输入雷数:";
cin >> boomNum;
game(boomNum);
}
} else if(input == '2'){
cout << "暂未开放!!!";
Sleep(2000);
system("cls");
goto Game;
} else if(input == '3'){
fileOut(name);
system("cls");
goto Game;
} else if(input == '4'){
system("cls");
cout << "游戏名称:扫雷游戏\n"; Sleep(200);
cout << "游戏版本:" << version << endl; Sleep(200);
cout << "更新日志:\n"; Sleep(200);
cout << " v1.0.0 创建游戏\n"; Sleep(200);
cout << " v1.0.3 修复地图越界bug,添加dfs自动翻开0\n"; Sleep(200);
cout << " v1.0.5 设置颜色,防止看错符号\n"; Sleep(200);
cout << " v1.1.0 添加主页面,登录系统,防止存档丢失\n"; Sleep(200);
cout << " v1.1.3 添加段位及排位系统,增加游戏的趣味性\n"; Sleep(200);
cout << "游戏logo(禁止盗用):\n"; Sleep(500);
cout << " 0 1 2 3 4\n";
cout << " 0 * ? 1 2 ?\n";
cout << " 1 ? * * 1 ?\n";
cout << " 2 1 * 1 ? 0\n";
cout << " 3 4 1 3 * ?\n";
cout << " 4 * * * ? 1\n";
cout << " 扫雷游戏 \n";
Sleep(3000);
} else if(input == '5'){
cout << "确定要退出游戏吗?(请确保游戏已保存) 1.Y 2.N\n";
input = getch();
if(input == '1'){
fileOut(name);
system("pause");
exit(1);
} else if(input == '2'){
cout << "已取消\n";
Sleep(3000);
system("cls");
goto Game;
} else {
cout << "输入无效!!!";
system("cls");
goto Game;
}
} else {
cout << "输入无效!!!";
system("cls");
goto Game;
}
}
}
(能不能别盗用logo,求求了!!!)
水完了。。。
啊呸!!!
完结撒花!!!!!!!!!!
如果未登录复制不了
别抄袭!!!
问个问题,请大佬教一教:
fscanf(fp,"%d",score)时发现积分读错了,可能是本人学艺不精用错了,请大佬评论改一下fileIn()和fileOut()谢谢!!!