C++ 小游戏-扫雷

C++ 小游戏-扫雷

功能实现
  1. 扫雷地图生成
  2. 支持鼠标点击事件
  3. 支持鼠标长按事件
  4. 支持彩色画面
  5. 计时器
  6. 进度条
  7. 保存进度
  8. 扫雷的基本操作
运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:部分功能暂未完善,敬请谅解

核心代码展示
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++上运行通过

下载地址

[C++ 原创游戏实例]扫雷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值