初学Windows 编程,觉得挺有意思,突发奇想,尝试一下编写扫雷小游戏。因为对MFC和windows编程没有太多了解,因此采用很low的方法:利用鼠标在客户区域点击的不同位置响应事件。我还是小白,不喜勿批,若有不足,请指正

#include <windows.h>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<commctrl.h>
#define SIZE 10     //地图大小
#define bomb 20   //炸弹个数
HWND hwnd;
HDC hdc;
HPEN pen=CreatePen(PS_SOLID,1,RGB(0,0,0));
HBRUSH brushbomb=CreateSolidBrush(RGB(255,255,0));  //炸弹颜色
HBRUSH brushmap=CreateSolidBrush(RGB(255,255,255)); //地图背景色
char map1[SIZE][SIZE];     //存放每个格子周围炸弹的个数
char map2[SIZE][SIZE];     //用来判断是否遍历过一个点
bool map3[SIZE][SIZE];    //判断是否右键过
bool map4[SIZE][SIZE];    //判断是否左键过
POINT pt={0,0};           //存放鼠标位置
UINT IDC_BUTTON1=1;       //开始按按钮
UINT IDC_BUTTON2=2;       //退出按钮
char left[]="20";         //炸弹剩余个数 void initial()            //初始化
{ int i,j; hdc=GetDC(hwnd); memset(map1,'r',sizeof(map1));strcpy(left,"20");memset(map3,true,sizeof(map3));memset(map4,true,sizeof(map3));for(i=0;i<SIZE;i++)for(j=0;j<SIZE;j++){SelectObject(hdc,pen);Rectangle(hdc,i*20,j*20,i*20+20,j*20+20);}                                            //画地图 srand(time(NULL));for(i=0;i<bomb;i++){int a=rand()%SIZE;int b=rand()%SIZE;if(map1[a][b]!='#') map1[a][b]='#';else i--;}                                           //产生雷 memcpy(map2,map1,sizeof(map1));              //把map1复制到map2       SelectObject(hdc,brushmap);Rectangle(hdc,240,195,240+100*(SIZE/5.0),200+100*(SIZE/5.0));for(i=0;i<SIZE;i++)for(j=0;j<SIZE;j++){char ch[]={map1[i][j],'\0'};TextOut(hdc,250+i*20,200+j*20,ch,1); }                                            //绘制答案for( i=0;i<SIZE;i++)for( j=0;j<SIZE;j++){if(map1[i][j]!='#'){int sum=0;for(int dx=-1;dx<=1;dx++)for(int dy=-1;dy<=1;dy++)if(dx!=0||dy!=0){ int x=i+dx;int y=j+dy;if(x<0||x>=SIZE||y<0||y>=SIZE) ;else if(map1[x][y]=='#') sum++;}map1[i][j]=sum+'0';} }                                           //求每个格子周围雷的个数 Rectangle(hdc,SIZE*20+95,108,SIZE*20+120,128); TextOut(hdc,SIZE*20+30,110,"剩余雷数",8);TextOut(hdc,SIZE*20+100,110,left,2);                   //显示剩余雷数
}void win()
{int i,j,k=1;for(i=0;i<SIZE;i++)for(j=0;j<SIZE;j++) if(map2[i][j]=='r') k=0;if(k) MessageBox(hwnd,"你赢了","游戏结束",MB_OK);
}                                                      //判断输赢 void deepsearch(int row,int col)
{ if(map2[row][col]!='r'||!map3[row][col]) return; map2[row][col]=map1[row][col];//map3[row][col]=false;map4[row][col]=false; char ch[]={map1[row][col],'\0'};TextOut(hdc,row*20+4,col*20+2,ch,1);if(map1[row][col]!='0') return;else{for(int dx=-1;dx<=1;dx++)for(int dy=-1;dy<=1;dy++)if(dx!=0||dy!=0){int x=row+dx;int y=col+dy;if(x>=0&&x<SIZE&&y>=0&&y<SIZE) deepsearch(x,y);}}}                                                        //深搜,遍历'0'周围的格子 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {switch(Message) {case WM_DESTROY: {PostQuitMessage(0);break;}case WM_COMMAND:{switch(wParam){case 1:{initial();break;}case 2:{PostQuitMessage(0);break;}}break;} case WM_LBUTTONDOWN:{GetCursorPos(&pt);ScreenToClient(hwnd,&pt);SelectObject(hdc,brushmap);SelectObject(hdc,pen);if(pt.y<SIZE*20&&pt.x<SIZE*20)if(map4[pt.x/20][pt.y/20]&&map3[pt.x/20][pt.y/20]){Rectangle(hdc,pt.x/20*20,pt.y/20*20,pt.x/20*20+20,pt.y/20*20+20);if(map1[pt.x/20][pt.y/20]=='#'){MessageBox(hwnd,"你输了","游戏结束",MB_OK);for(int i=0;i<SIZE;i++)for(int j=0;j<SIZE;j++){ if(map1[i][j]=='#') {char ch[]={'#','\0'};TextOut(hdc,i*20+4,j*20+2,ch,1);}}}else deepsearch(pt.x/20,pt.y/20);}win(); break; }case WM_RBUTTONDOWN:{GetCursorPos(&pt);ScreenToClient(hwnd,&pt);if(pt.y<SIZE*20&&pt.x<SIZE*20&&map4[pt.x/20][pt.y/20]){if(map3[pt.x/20][pt.y/20]){SelectObject(hdc,brushbomb);Rectangle(hdc,pt.x/20*20+2,pt.y/20*20+2,pt.x/20*20+18,pt.y/20*20+18);if(left[1]!=' ') {if(left[1]=='0'){left[0]=left[0]-1;left[1]='9';}else left[1]=left[1]-1;}else left[0]=left[0]-1;SelectObject(hdc,brushmap);Rectangle(hdc,SIZE*20+95,108,SIZE*20+120,128);TextOut(hdc,SIZE*20+100,110,left,2);map3[pt.x/20][pt.y/20]=false;}else{SelectObject(hdc,brushmap);SelectObject(hdc,pen);Rectangle(hdc,pt.x/20*20+1,pt.y/20*20+1,pt.x/20*20+19,pt.y/20*20+19);if(left[1]!=' '){if(left[1]=='9') {left[1]='0';left[0]=left[0]+1;}else left[1]=left[1]+1;}else left[0]=left[0]+1;Rectangle(hdc,SIZE*20+95,108,SIZE*20+120,128);TextOut(hdc,SIZE*20+100,110,left,2);map3[pt.x/20][pt.y/20]=true;}}break;}  default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{WNDCLASSEX wc; MSG msg; memset(&wc,0,sizeof(wc));wc.cbSize      = sizeof(WNDCLASSEX);wc.lpfnWndProc    = WndProc; wc.hInstance    = hInstance;wc.hCursor         = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszClassName = "WindowClass";wc.hIcon       = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm      = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, /* x */CW_USEDEFAULT, /* y */640, /* width */480, /* height */NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}HWND hbuttonwnd1=CreateWindow(WC_BUTTON,"开始",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,SIZE*20+30,50,100,20,hwnd,(HMENU)IDC_BUTTON1,NULL,NULL);HWND hbuttonwnd2=CreateWindow(WC_BUTTON,"退出",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,SIZE*20+30,75,100,20,hwnd,(HMENU)IDC_BUTTON2,NULL,NULL);while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); }return msg.wParam;
}

win32 简易版扫雷相关推荐

  1. Win32简易版扫雷

    社团的一群小孩都默默的写好了扫雷,嘿嘿,我也打算凑个热闹 最近学windows编程,就写一个win32简易版扫雷吧 //不支持右键 感觉写的挺乱的╮(╯▽╰)╭啊,不要在意这些细节 点到雷会退出程序 ...

  2. 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】

    目录 一.扫雷游戏的运行逻辑 二.代码逻辑讲解+源码 1.打印一个简易的游戏开始菜单 2.创建数组储存数据并初始化数组 代码逻辑讲解 源码 3.布置雷 代码逻辑讲解 源码 4.排雷 代码逻辑 源码 三 ...

  3. c++简易版扫雷游戏

    c++简易版扫雷游戏,代码如下: #include<iostream> #include<cstdlib> #include<time.h> using names ...

  4. c语言小游戏 精简_C语言开发简易版扫雷小游戏

    C 语言开发简易版扫雷小游戏 本文给大家分享的是一个使用 C 语言开发的命令行下的简易版扫雷小游戏, 本身没有什么太 多的技术含量, 只不过是笔者的处女作, 所以还是推荐给大家, 希望对大家学习 C ...

  5. 利用java开发简易版扫雷游戏

    1.简介 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识. 2.编写过程 编写这个游戏,一共经历了三个阶段,编写了三个版本的游戏代码. 第一版:完成了扫雷游戏的基本雏形,实现 ...

  6. 【C语言】简易版扫雷游戏(play game)

    目录 扫雷游戏

  7. C语言小项目之扫雷游戏(简易版)

    今天给大家带来一个风靡一时的小游戏--扫雷. 一.背景引入 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷 ...

  8. C语言扫雷游戏(简易版)

    前言 经过学习数组.函数.循环语句.选择语句等C语言的一些基础知识后,我想借助编写扫雷小游戏来对所学知识进行一个巩固.游戏只会实现一些基本的功能,展开.标记雷.取消雷等不实现(还不会). 1.游戏编写 ...

  9. php mailer altbody,PHP_phpmailer 中文使用说明(简易版),phpmailer v5.1下载 A开头: $AltBody - phpStudy...

    phpmailer 中文使用说明(简易版) phpmailer v5.1下载 A开头: $AltBody--属性 出自:PHPMailer::$AltBody 文件:class.phpmailer.p ...

最新文章

  1. sql 服务器实例怎样显示,如何查看sql数据库的服务器名
  2. 感受亚马逊:“抠门”的巨无霸电商如何炼成
  3. java comparable排序_Java使用Comparable解决排序问题
  4. 如何让区块链连接外面的世界
  5. 从我开发过的Tensorflow、飞桨、无量框架看深度学习这几年
  6. scara机器人dh参数表_两分钟带你了解机器人标定的因素
  7. 字节跳动专家会_年薪30万60万!字节跳动招这个语系的语言专家!
  8. 2017杭州云栖大会FAQ(持续更新中)
  9. cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求
  10. Git 版本控制 在 WIN 下的一些使用方法
  11. elcipse 中利用maven创建web工程
  12. java入门必备基础知识(超超超详细讲解)
  13. 产品基础——认识竞品分析
  14. 微信支付宝小程序复制内容到剪贴板功能
  15. Tesseract OCR 语言包下载
  16. oracle 11客户端精简版,oracle_11g精简版客户端配置
  17. 逻辑函数(表示方法、形式转换、化简、最小项、最大项)
  18. Teams App自定义
  19. 优惠券有什么用,为什么不直接降价呢?
  20. 两个坐标系转换的变换矩阵

热门文章

  1. 阿里笔试题解答(一)
  2. 各大协作机器人厂商人机安全协作方式(HRC)简介
  3. dlib疲劳检测_传统方法眼角定位和dilb 进行疲劳检测(眨眼检测)
  4. C#根据IP地址和子网掩码计算广播地址
  5. 2017年工作目标与生活规划
  6. Vue.js下载及安装
  7. python刷今日头条阅读量_用python3.5逛看今日头条
  8. 待得秋来九月八,我花开时百花杀; 冲天香阵透长安,满城尽带黄金甲
  9. 【内推】阿里集团2018届毕业生招聘
  10. 【Mac 软件推荐】控制外接显示器的亮度和声音-MonitorControl