C++ 小游戏-扫雷
功能实现
- 扫雷地图生成
- 支持鼠标点击事件
- 支持鼠标长按事件
- 支持彩色画面
- 计时器
- 进度条
- 保存进度
- 扫雷的基本操作
运行截图
注:部分功能暂未完善,敬请谅解
核心代码展示
while(1) {
if(in_front) {
print(its(a.get_pos_x())+","+its(a.get_pos_y())+" ",0,110,7,8);
if(key_down(VK_LBUTTON)) {
if(a.press(30,42,32,61)) {
if(Map_sum==max_Map) {
MessageBox(NULL,TEXT("游戏上限已达,不可新建\t\t\t\t"),TEXT("游戏通知"),MB_OK);
continue;
} else {
string str,str2;
Map_sum++;
true_mouse();
get_name:
a.rectangle2(30,42,32,61,4,7);
print(" 地图名称 ",31,86,15,9);
a.word_color(0,7);
cin>>str;
if(str.size()>18) {
MessageBox(NULL,TEXT("游戏名称最多18个字节\t\t\t\t\t"),TEXT("游戏通知"),MB_OK);
goto get_name;
}
get_side:
a.rectangle2(30,42,32,61,4,7);
print(" 地图边长[10,40] ",31,86,15,9);
a.word_color(0,7);
cin>>str2;
if(sti(str2)<10||sti(str2)>40) {
MessageBox(NULL,TEXT("游戏边长范围10-40\t\t\t\t\t"),TEXT("游戏通知"),MB_OK);
goto get_side;
}
p[Map_sum].name=str;
p[Map_sum].side=sti(str2);
p[Map_sum].Map_init(time(0),sti(str2));
a.rectangle(3,40,34,63,7,7);
a.rectangle(4,42,6,61,4,4);
print(" 游戏列表 ",5,83,15,4);
for(int i=1; i<=Map_sum; i++) {
print(p[i].name,i*2+7,83,0,7);
print(its(p[i].side)+"*"+its(p[i].side),i*2+7,105,9,7);
print("雷数"+its(p[i].ls)+"/"+its(p[i].sls),i*2+7,113,4,7);
print("—————————————————————",i*2+8,83,4,7);
}
a.rectangle(30,42,32,61,8,8);
print("新建游戏",31,99,15,8);
a.rectangle(5,43,5,47,8,8);
print("<<返回",5,88,15,8);
hide_mouse();
continue;
}
} else if(a.press(4,43,6,47)) {
a.rectangle(3,40,34,63,7,7);
ofstream fw;
fw.open("扫雷4.0标准.txt");
fw<<jy<<' '<<jb<<' '<<Map_sum<<endl;
for(int i=1; i<=Map_sum; i++)fw<<p[i].name<<' ';
fw<<endl;
for(int i=1; i<=10; i++)fw<<dj[i]<<' ';
fr.close();
goto game_main;
} else if(a.press(9,41,Map_sum*2+7,60)) {
for(int c=1; c<=Map_sum; c++)
if(a.press(c*2+7,41,c*2+7,60)) {
a.mode(p[c].side+3,p[c].side+10);
a.rectangle(0,0,p[c].side+2,p[c].side+9,8,8);
for(int i=1; i<=p[c].side; i++)
for(int j=1; j<=p[c].side; j++)
p[c].print_Map2(i+2,j-1,i,j);
a.rectangle(p[c].side+1,p[c].side+1,p[c].side+1,p[c].side+8,4,4);
print("退出游戏",p[c].side+1,p[c].side*2+6,15,4);
int t=clock(),k=p[c].time_s;
while(1) {
if(in_front) {
p[c].time_s=(clock()-t)/1000+k;
p[c].time_m=p[c].time_s/60%60;
p[c].time_h=p[c].time_s/3600;
print(its(p[c].time_h)+":",1,5,15,8);
if(p[c].time_m<10)output("0"+its(p[c].time_m),":",true,15,8);
else output(its(p[c].time_m),":",true,15,8);
if(p[c].time_s%60<10)output("0"+its(p[c].time_s%60)," ",true,15,8);
else output(its(p[c].time_s%60)," ",true,15,8);
print("雷数",3,p[c].side*2+2,15,4);
print(its(p[c].ls)+"/"+its(p[c].sls),3,p[c].side*2+6,15,8);
print("生命",4,p[c].side*2+2,15,4);
print(its(p[c].sm),4,p[c].side*2+6,15,8);
print("金币",5,p[c].side*2+2,15,4);
print(its(jb),5,p[c].side*2+6,15,8);
output("●","",true,14,8);
if(key_down(VK_LBUTTON)) {
if(a.press(p[c].side+1,p[c].side+1,p[c].side+1,p[c].side+8)) {
ofstream fw;
fw.open("扫雷4.0标准.txt");
fw<<jy<<' '<<jb<<' '<<Map_sum<<endl;
for(int i=1; i<=Map_sum; i++)fw<<p[i].name<<' ';
fw<<endl;
for(int i=1; i<=10; i++)fw<<dj[i]<<' ';
fr.close();
p[c].save_game();
cfi.cbSize = sizeof cfi;
cfi.nFont = 0;
cfi.dwFontSize.X = 8;
cfi.dwFontSize.Y = 16;
cfi.FontFamily = FF_DONTCARE;
cfi.FontWeight = FW_NORMAL;
wcscpy(cfi.FaceName, L"KaiTi");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
break;
} else if(a.press(3,0,p[c].side+2,p[c].side)) {
if(p[c].sm>0) {
if(p[c].in_map(a.get_pos_x()-2,a.get_pos_y()+1)) {
int wait_keyup=clock();
while(key_down(VK_LBUTTON)) {
Sleep(50);
if(clock()-wait_keyup>=300)break;
}
if(clock()-wait_keyup>=300)p[c].mark(a.get_pos_x()-2,a.get_pos_y()+1);
else p[c].open(a.get_pos_x()-2,a.get_pos_y()+1);
}
} else {
int mb=MessageBox(NULL,
TEXT("你die了\n按重试键可继续\t\t\t\t\t"),
TEXT("游戏通知"),MB_ICONINFORMATION|MB_RETRYCANCEL);
if(mb==4) {
a.clear(0,0,p[c].side+2,p[c].side+9);
print("面壁思过15秒",0,0,0,15);
print("即可获得5点生命",1,0,0,15);
Sleep(15000);
p[c].sm+=5;
a.rectangle(0,0,p[c].side+2,p[c].side+9,8,8);
for(int i=1; i<=p[c].side; i++)
for(int j=1; j<=p[c].side; j++)
p[c].print_Map2(i+2,j-1,i,j);
a.rectangle(p[c].side+1,p[c].side+1,p[c].side+1,p[c].side+8,4,4);
print("退出游戏",p[c].side+1,p[c].side*2+6,15,4);
continue;
} else {
cfi.cbSize = sizeof cfi;
cfi.nFont = 0;
cfi.dwFontSize.X = 8;
cfi.dwFontSize.Y = 16;
cfi.FontFamily = FF_DONTCARE;
cfi.FontWeight = FW_NORMAL;
wcscpy(cfi.FaceName, L"KaiTi");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
break;
}
}
}
}
}
if(p[c].check()) {
MessageBox(NULL,
TEXT("恭喜你赢了\t\t\t\t\t"),
TEXT("游戏通知"),MB_OK);
cfi.cbSize = sizeof cfi;
cfi.nFont = 0;
cfi.dwFontSize.X = 8;
cfi.dwFontSize.Y = 16;
cfi.FontFamily = FF_DONTCARE;
cfi.FontWeight = FW_NORMAL;
wcscpy(cfi.FaceName, L"KaiTi");
SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
p[c].del_save();
for(int i=c; i<=Map_sum; i++)p[i]=p[i+1];
Map_sum--;
ofstream fw;
fw.open("扫雷4.0标准.txt");
fw<<jy<<' '<<jb<<' '<<Map_sum<<endl;
for(int i=1; i<=Map_sum; i++)fw<<p[i].name<<' ';
fw<<endl;
for(int i=1; i<=10; i++)fw<<dj[i]<<' ';
fr.close();
break;
}
Sleep(50);
}
break;
}
a.mode(35,64);
a.title("扫雷");
a.rectangle(3,40,34,63,7,7);
a.rectangle(3,0,34,39,10,10);
for(int i=1; i<=30; i++)for(int j=1; j<=38; j++)p[0].print_Map(i+3,j,i,j);
a.rectangle(3,40,34,63,7,7);
a.rectangle(4,42,6,61,4,4);
print(" 游戏列表 ",5,83,15,4);
for(int i=1; i<=Map_sum; i++) {
print(p[i].name,i*2+7,83,0,7);
print(its(p[i].side)+"*"+its(p[i].side),i*2+7,105,9,7);
print("雷数"+its(p[i].ls)+"/"+its(p[i].sls),i*2+7,113,4,7);
print("—————————————————————",i*2+8,83,4,7);
}
a.rectangle(30,42,32,61,8,8);
print("新建游戏",31,99,15,8);
a.rectangle(5,43,5,47,8,8);
print("<<返回",5,88,15,8);
continue;
}
}
}
Sleep(50);
}
运行环境
dev-c++上运行通过