带爆炸效果的扫雷(源码1)

Pygame小游戏:玩扫雷就在瞎点的,不止你一个人。 前言 《扫雷》是一款大众类的益智小游戏,于1992年发行。 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个 雷即全盘皆输。 它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏,是不是 每次见到戴上墨镜的小人很有成就感?在那些还没有网(被切断网)的岁月,扫雷曾陪伴无数人度 过了他们的童年。你的最佳纪录是多少?小编在工作间隙随手刷了一局30秒(囧????)。 那么?怎么才能通关呢?这,有生之年靠自己猜可能做不到了,BUT我 阅读详情

 这个程序是以前写的,编码水平一般,规范性、命名还可以,待改进的地方有很多,大家拷下来自己玩吧。第一次把我写的代码贴出来。ok,开始,先来个截图:

当鼠标单击的时候,有一个爆炸效果将格子炸开。程序简单说明:

包含了计时,等级设置(含自定义),帮助对话框,排行榜。

技术上没有用MFC,纯SDK做的。使用了两个定时器,一个表示成绩,一个播放动画。

算法:如果单击的是空白格子,那么周围所有相连的空白格子都会打开。需要一个队列来辅助搜索,像是数据结构里的图遍历。

键盘响应:用windows的消息处理,灵敏度可以满足需要。对“同时单击左键和右键”的处理方法是,在右键的处理程序中,判断左键是否按下。

对话框:控件的编程。当对话框打开时,计时器要停表;对话框结束后,恢复计时。

排行榜:三个字符串,跟三个数字,存到文件中。文件路径源码中有。

图片:自己画的,水平还行。源码:

主程序:mine.cpp

 

// mine.cpp : Defines the entry point for the application.
//

#include 
"stdafx.h"
#include 
"resource.h"

#include 
"stdlib.h"
#include 
"stdio.h"

#include 
"map.h"
#include 
"mytimer.h"
#include 
"mytool.h"

#define MAX_LOADSTRING 100

#define BOTTOM_H 35 //这个高度用在设置窗口大小的时候,包含标题栏的高度

// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                                // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                // The title bar text

GameMap gamemap;
MYTIMER mytimer;
MYTOOL mytool;

int screenwidth=0;
int screenheight=0;

int iradio=0;

// Foward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, 
int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    DlgSet(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK DlgScore(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgLevel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK DlgInput(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

void GameWin(HWND hWnd);

// game
void InitGame(void);


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int       nCmdShow)
{
     
// TODO: Place code here.
    MSG msg;
    HACCEL hAccelTable;

    
// Initialize global strings
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_MINE, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    
// Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow)) 
    
{
        
return FALSE;
    }


    hAccelTable 
= LoadAccelerators(hInstance, (LPCTSTR)IDC_MINE);

    
// Main message loop:
    while (GetMessage(&msg, NULL, 0, 0)) 
    
{
        
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
        
{
            TranslateMessage(
&msg);
            DispatchMessage(
&msg);
        }

    }


    
return msg.wParam;
}




//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize 
= sizeof(WNDCLASSEX); 

    wcex.style            
= CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    
= (WNDPROC)WndProc;
    wcex.cbClsExtra        
= 0;
    wcex.cbWndExtra        
= 0;
    wcex.hInstance        
= hInstance;
    wcex.hIcon            
= LoadIcon(hInstance, (LPCTSTR)IDI_MINE);
    wcex.hCursor        
= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    
= (HBRUSH)(RGB(0,255,0));
    
//wcex.lpszMenuName    = (LPCSTR)IDC_MINE;
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    
= szWindowClass;
    wcex.hIconSm        
= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

    
return RegisterClassEx(&wcex);
}


//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;
    
    hInst 
= hInstance; // Store instance handle in our global variable
    
    hWnd 
= CreateWindow(szWindowClass, szTitle, 
        WS_OVERLAPPED 
| WS_SYSMENU |WS_MINIMIZEBOX   ,
        CW_USEDEFAULT, 
0, 400, 325, NULL, NULL, hInstance, NULL);
    
    
if (!hWnd)
    
{
        
return FALSE;
    }

    
    
    screenwidth 
= GetSystemMetrics(SM_CXFULLSCREEN);
    screenheight
= GetSystemMetrics(SM_CYFULLSCREEN);
    
///////////// game begin

    gamemap.LoadScore();

    gamemap.SetHINSTANCE(hInstance);
    gamemap.SetHWND(hWnd);
    gamemap.LoadPic();
    gamemap.SetLevel(
0);
    MoveWindow(hWnd,(screenwidth 
-(32*9+150))/2,
                    (screenheight 
-(32*9+70))/2,
                    
32*9+150,32*9+BOTTOM_H,true);
    
    mytimer.SetHWND(hWnd);
    mytimer.SetHINSTANCE(hInstance);
    mytimer.LoadPic();
    mytimer.Clear();
    mytimer.SetPos(
32*gamemap.GetWidth()+40,80);

    mytool.SetHWND(hWnd);
    mytool.SetHINSTANCE(hInstance);
    mytool.LoadPic();
    mytool.SetPos(
32*gamemap.GetWidth()+30, 32*gamemap.GetHeight()-32);

    SetTimer(hWnd,
2,150,NULL);
    InitGame();
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    
    
return TRUE;
}


//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND    - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY    - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
int x,y;
    
int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    
switch (message) 
    
{
        
case WM_COMMAND:
            wmId    
= LOWORD(wParam); 
            wmEvent 
= HIWORD(wParam); 
            
// Parse the menu selections:
            switch (wmId)
            
{
                
case IDM_ABOUT:
                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                   
break;
                
case IDM_EXIT:
                   DestroyWindow(hWnd);
                   
break;
                
default:
                   
return DefWindowProc(hWnd, message, wParam, lParam);
            }

            
break;
        
case WM_PAINT:
            hdc 
= BeginPaint(hWnd, &ps);
            
// TODO: Add any drawing code here...

            gamemap.SetDC(hdc);
            gamemap.Draw();
            gamemap.DrawAnimation();
            gamemap.DrawButton();
            
            mytimer.SetHDC(hdc);
            mytimer.Draw();

            mytool.SetHDC(hdc);
            mytool.Draw();

            EndPaint(hWnd, 
&ps);
            
break;

        
case WM_LBUTTONDOWN:
            x
=LOWORD(lParam);
            y
=HIWORD(lParam);
            
//按钮
            if(gamemap.button_pos.x<=x && x<=gamemap.button_pos.x+32
                
&& gamemap.button_pos.y<=y && y<=gamemap.button_pos.y+32)
            
{
                gamemap.iFaceState
=1;//press down
            }


            mytool.SetPressDown(x,y);

            
//雷的格子
            x/=32;
            y
/=32;
            
//当游戏没有结束的时候,允许单击格子
            if(gamemap.iState!=G_END)
            
{
                
if(x>=0 && x<=gamemap.GetWidth()-1 
                    
&& y>=0 && y<=gamemap.GetHeight()-1)
                
{
                        mytimer.StartTimer();
                        
if(gamemap.OpenGrid(x,y))
                        
{
                            
//fail
                            mytimer.StopTimer();
                        }

                }

            
                
if(gamemap.CheckWin())
                
{
                    GameWin(hWnd);
                }

            }

            InvalidateRect(hWnd,NULL,
false);
            
break;

        
case WM_LBUTTONUP:
            x
=LOWORD(lParam);
            y
=HIWORD(lParam);
            
//按钮
            if(gamemap.button_pos.x<=x && x<=gamemap.button_pos.x+32
                
&& gamemap.button_pos.y<=y && y<=gamemap.button_pos.y+32)
            
{
                gamemap.iFaceState
=0;//NORMAL
                
//RESET MAP
                InitGame();
                mytimer.Clear();
                mytimer.StopTimer();
            }

            InvalidateRect(hWnd,NULL,
false);

            
switch(mytool.GetButtonPress(x,y))
            
{
            
case E_LEVEL:
                mytimer.PauseTimer();
                DialogBox(hInst, (LPCTSTR)IDD_DIALOG_LEVEL, hWnd, (DLGPROC)DlgLevel);

                MoveWindow(hWnd,
                            (screenwidth 
-(32*gamemap.GetWidth()+150))/2,
                            (screenheight 
-(32*gamemap.GetHeight()+70))/2,
                            
32*gamemap.GetWidth()+150,
                            
32*gamemap.GetHeight()+BOTTOM_H,true);

                mytimer.GoOnTimer();
                   InvalidateRect(hWnd,NULL,
true);
                
break;

            
case E_HELP:
                mytimer.PauseTimer();
                DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
                mytimer.GoOnTimer();
                
break;

            
case E_SCORE:
                mytimer.PauseTimer();
                DialogBox(hInst, (LPCTSTR)IDD_DIALOG_SCORE, hWnd, (DLGPROC)DlgScore);
                mytimer.GoOnTimer();
                
break;
            
default:
                
break;
            }

            
break;

        
case WM_RBUTTONUP:
            x
=LOWORD(lParam);
            y
=HIWORD(lParam);            

            x
/=32;
            y
/=32;
            
//当游戏没有结束的时候,允许右击格子
            if(gamemap.iState!=G_END)
            
{
                
if(x>=0 && x<=gamemap.GetWidth()-1 
                    
&& y>=0 && y<=gamemap.GetHeight()-1)
                
{
                    gamemap.SetFlag(x,y);

                    
if(gamemap.CheckWin())
                    
{
                        GameWin(hWnd);
                    }

                }

            }

            InvalidateRect(hWnd,NULL,
false);
            
break;

        
case WM_RBUTTONDOWN:
            x
=LOWORD(lParam);
            y
=HIWORD(lParam);            

            x
/=32;
            y
/=32;
            
//当游戏没有结束的时候,允许右击格子
            if(gamemap.iState!=G_END)
            
{
                
if(wParam & MK_LBUTTON)
                
{
                    gamemap.Open8around(x,y);
                    
if(gamemap.CheckWin())
                    
{
                        GameWin(hWnd);
                    }

                }

            }

            InvalidateRect(hWnd,NULL,
false);
            
break;
            
        
case WM_TIMER:
            
switch(wParam)
            
{
            
case 1:                
                mytimer.TimerInc();
                
break;
            
case 2:                
                
break;
            }
            
            InvalidateRect(hWnd,NULL,
false);
            
break;
        
case WM_DESTROY:
            KillTimer(hWnd,
2);
            PostQuitMessage(
0);
            
break;
        
default:
            
return DefWindowProc(hWnd, message, wParam, lParam);
   }

   
return 0;
}


// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    
switch (message)
    
{
        
case WM_INITDIALOG:
                
return TRUE;

        
case WM_COMMAND:
            
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            
{
                EndDialog(hDlg, LOWORD(wParam));
                
return TRUE;
            }

            
break;
    }

    
return FALSE;
}


void InitGame(void)
{
    gamemap.CreateMap();
    gamemap.iState
=G_NULL;
    gamemap.iFaceState
=0;
}


LRESULT CALLBACK DlgSet(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    
int minnum=0;
    
int w;
    
int h;
    
int num;
    
char temp[50]={0};

    
switch (message)
    
{
        
case WM_INITDIALOG:
            SetDlgItemInt(hDlg,IDC_EDIT_WIDTH, gamemap.GetWidth(),FALSE);
            SetDlgItemInt(hDlg,IDC_EDIT_HEIGHT, gamemap.GetHeight() ,FALSE);
            SetDlgItemInt(hDlg,IDC_EDIT_NUM, gamemap.GetNum(), FALSE);

                
return TRUE;

        
case WM_COMMAND:
            
if (LOWORD(wParam) == IDOK)
            
{
                w
=GetDlgItemInt(hDlg,IDC_EDIT_WIDTH,NULL,FALSE);
                h
=GetDlgItemInt(hDlg,IDC_EDIT_HEIGHT,NULL,FALSE);
                num
=GetDlgItemInt(hDlg,IDC_EDIT_NUM,NULL,FALSE);

                
//用户自定义的界面大小
                w= (w<9)?9:w;
                w
= (w>20)?20:w;

                h
= (h<9)?9:h;
                h
= (h>20)?20:h;

                
//横向w个格子,纵向h个格子:
                
//限制雷的个数,最少:w和h中较小的值减一;最多,(w-1)*(h-1)
                minnum=(w>h)?h:w;
                num 
= (num< minnum-1)? minnum-1:num;
                num 
= (num>(w-1)*(h-1))? (w-1)*(h-1):num;

                gamemap.SetMap(w,h,num);
                InitGame();
                mytimer.Clear();

                mytimer.SetPos(
32*gamemap.GetWidth()+40,80);
                   mytool.SetPos(
32*gamemap.GetWidth()+30, 32*gamemap.GetHeight()-32);                
                
//MessageBox(hDlg,temp,"set",MB_OK);

                EndDialog(hDlg, LOWORD(wParam));                
                
return TRUE;
            }

            
else if(LOWORD(wParam) == IDCANCEL)
            
{
                EndDialog(hDlg, LOWORD(wParam));
                mytimer.GoOnTimer();
                
return TRUE;            
            }

            
break;
    }

    
return FALSE;
}



LRESULT CALLBACK DlgScore(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    
char temp[30]={0};
    
int i;
    
switch (message)
    
{
        
case WM_INITDIALOG:
                
for(i=0;i<=2;i++)
                
{
                    memset(temp,
0,sizeof(temp));
                    gamemap.GetName(i, temp);
                    
if(! strlen(temp))
                    
{
                        strcpy(temp,
"匿名");
                    }

                    SetDlgItemText(hDlg, IDC_STATIC_NAME1
+i, temp);

                    SetDlgItemInt(hDlg, IDC_STATIC_SCORE1
+i, 
                                    gamemap.GetTimeValue(i) ,
false);
                }

                
return TRUE;

        
case WM_COMMAND:
            
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            
{
                EndDialog(hDlg, LOWORD(wParam));
                
return TRUE;
            }

            
switch(LOWORD(wParam))
            
{
            
case IDC_BUTTON_RESET1:
            
case IDC_BUTTON_RESET2:
            
case IDC_BUTTON_RESET3:
                i
=LOWORD(wParam)-IDC_BUTTON_RESET1;
                gamemap.ResetScore(i);
                SetDlgItemText(hDlg, IDC_STATIC_NAME1
+i, "匿名");
                SetDlgItemInt(hDlg, IDC_STATIC_SCORE1
+i, 999 ,false);
                
break;
            }

            
break;
            
return TRUE;
    }

    
return FALSE;
}



LRESULT CALLBACK DlgLevel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    
switch (message)
    
{
        
case WM_INITDIALOG:
            iradio
= gamemap.GetLevel();
            CheckRadioButton(hDlg, 
                            IDC_RADIO_LEVEL1,
                            IDC_RADIO_LEVEL1
+2 , 
                            IDC_RADIO_LEVEL1
+iradio);
            
return TRUE;

        
case WM_COMMAND:
            
switch (LOWORD(wParam) )
            
{
            
case IDOK:
                
//MessageBox(hDlg,"set level ok","set dlg",MB_OK);
                gamemap.SetLevel(iradio);
                InitGame();
                mytimer.Clear();
                
                mytimer.SetPos(
32*gamemap.GetWidth()+40,80);
                   mytool.SetPos(
32*gamemap.GetWidth()+30, 32*gamemap.GetHeight()-32);

                EndDialog(hDlg, LOWORD(wParam));
                
return TRUE;
            
case IDCANCEL:
                EndDialog(hDlg, LOWORD(wParam));
                
return TRUE;
                
            
case IDC_RADIO_LEVEL1:
                iradio
=0;
                
return TRUE;
            
case IDC_RADIO_LEVEL2:
                iradio
=1;
                
return TRUE;
            
case IDC_RADIO_LEVEL3:
                iradio
=2;
                
return TRUE;

            
case IDC_BUTTON_SET:
                EndDialog(hDlg, LOWORD(wParam));
                DialogBox(hInst, (LPCTSTR)IDD_DIALOG_SET, hDlg, (DLGPROC)DlgSet);
                
return TRUE;
            
default:
                
return TRUE;
            }

            
            
break;
    }

    
return FALSE;
}




LRESULT CALLBACK DlgInput(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    
char temp[30]={0};

    
switch (message)
    
{
        
case WM_INITDIALOG:
            gamemap.GetName(gamemap.GetLevel(), temp);
            
if(! strlen(temp))
            
{
                strcpy(temp,
"匿名");
            }

            
            SetDlgItemText(hDlg, IDC_EDIT_INPUT ,temp);
            
return TRUE;

        
case WM_COMMAND:
            
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            
{
                memset(temp,
sizeof(temp),0);
                
//处理输入的字符串,12个CHAR
                GetDlgItemText(hDlg,IDC_EDIT_INPUT,temp,13);

                gamemap.WriteScore(gamemap.GetLevel(), temp, mytimer.GetTimeLong());
                EndDialog(hDlg, LOWORD(wParam));
                
return TRUE;
            }

            
break;
    }

    
return FALSE;

}


void GameWin(HWND hWnd)
{
    gamemap.iFaceState
=2;//win
    gamemap.iState=G_END;
    mytimer.StopTimer();

    
//已破纪录,输入姓名    
    if( gamemap.IsNewScore(gamemap.GetLevel(),
        mytimer.GetTimeLong()) )
    
{
        InvalidateRect(hWnd,NULL,
false);
        DialogBox(hInst, (LPCTSTR)IDD_DIALOG_INPUT, hWnd, (DLGPROC)DlgInput);
    }
                        
    
}


AI扫雷有多牛?他国纷纷来求师学艺(附完整教程) 前文 大家好!我是梨子同学! 希望大家多多支持我!哈哈 为了感谢每一个关注我的小可爱:????每篇文章的项目源码都是无偿分享滴????见文末! 很多csdn的功能还在研究中,还有小编的文笔不好勿怪,会慢慢进步跟大家一起学习的 小编也一直在学习编程,如果代码小程序出现错误欢迎大家评论区留言哈! 最后——如果文章有帮助到你,记得“关注”、“点赞”、“评论”三连哦~ 前言 《扫雷》是一款大众类的益智小游戏,于1992年发行。 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同 阅读详情

相关推荐

第一个用java-swing写的 图形界面程序-扫雷

不要吐槽界面丑。。谢谢      (代码附在文末,有兴趣可以看看) 扫雷爆炸的效果还没来得及加上, 大概思路 以被点开的雷为中心,计算周围的雷到它的距离,并放入按距离排序的队列,然后依次取出,用多线程显示爆炸效果(3,4张图片连在一起或gif) 联网功能还不是很完善,肯能会有bug,只是双人对战 。。。以后有时间再改进   实现功能点: 主题皮肤更换,     OK 三种游戏模式,

缺氧 5251

带爆炸效果的扫雷(源码3)

队列:当点击一个空白格子的时候,算法如下:将当前格子入队;循环:一个格子出队。将没有打开的空白格子进队(要没有打开过,且是空白)。将周围的格子置为“已打开”。不断重复,直至队列为空。为了方便,将一个格子周围8个格子的坐标差值放到数组中,循环使用。void GameMap::SearchBlank(int x,int y){ int tempindex[16]={-1, -1,  0,

programking的快乐生活 945

HTML在线扫雷游戏网页源码

HTML在线扫雷游戏网页源码是一款基于HTML+CSS+JavaScript开发的在线扫雷小游戏单页源码,为用户提供了一个无需安装即可在浏览器中直接玩的扫雷游戏。该游戏的源码不仅包含了完整的游戏逻辑,还具备丰富的界面设计和用户交互功能,可以作为前端毕业设计项目参考。

专注于与编程相关的知识内容分享 980

带爆炸效果的扫雷(源码2)

游戏中处理地图生成,绘制,单击处理等主要逻辑的类 map.h,所有格子放在20*20=400的一个数组中,即最大支持长宽各20个格子。每个格子用一个字节表示,低四位0表示空格,1~8表示数字,9表示雷。高四位bit7~bit4: bit7表示该格子是否打开,bit6表示是否已经标记,bit5表示是否要打叉(点错或标记错的时候)。说明:除了动画以外,所有的图形元素都是32*32像素。简单的动画:

programking的快乐生活 1086

Java写的经典扫雷游戏,带音效和成绩记录,双击就能玩

用Java开发的完整扫雷游戏,源码清晰、结构规范,直接双击1.bat即可运行,无需额外配置。界面采用GIF图标(start.gif、lei.GIF、qi.GIF)实现按钮与雷区可视化,内置三种音频资源:点击音效(ding.wav)、爆炸音效(bob.wav)和背景音乐(music.mid),增强操作反馈和游戏氛围。成绩自动保存到record.txt文件,历史记录存放在O纪录文件夹,支持本地持久化。项目包含全部源文件(saolei.java)和编译后字节码(saolei.class),.gitignore和.

bean的博客 268

Anomalib实战:从零开始构建自定义数据集的异常检测模型

本文详细介绍了如何使用Anomalib 2.1.0从零开始构建自定义数据集的异常检测模型。通过实战演示,指导读者准备符合规范的数据集结构,快速上手训练Patchcore等先进算法,并完成模型推理与调优,为工业质检、医疗影像等场景提供高效的视觉异常检测解决方案。

weixin_29165465的博客 109

制作爆炸效果

制作爆炸效果制作爆炸效果  爆炸效果是各种游戏中不可或缺的。产生这种效果的方法多种多样,本文介绍一种较为简单的算法,以期抛砖引玉:)这里仅给出必要代码,请理解后自己编程。如果你有更好的算法,也请E给云风一份:)~    注:为了提高速度,题头演示画面为40x40x32帧。而      下面算法将产生80x80x64帧的图象。  

蝈蝈俊.net 2637

从零到一:如何用GraphRAG Visualizer打造你的第一个3D知识图谱

本文详细介绍了如何使用GraphRAG Visualizer从零开始构建3D知识图谱,涵盖环境准备、Parquet数据处理、可视化操作及高级分析功能。通过简洁的步骤和实用技巧,帮助用户快速掌握这一强大的知识图谱可视化工具,提升数据分析和关系挖掘效率。

rock5的博客 218

你从未见过的C++扫雷辅助,最强脑力大比拼!

现如今pc、手机以及平板的游戏五花八门,广大的玩家用户都可以找到自己所喜欢的类型来玩耍。在包罗万象的游戏中,“扫雷”游戏可以说是其中最经典的一款了,追本溯源,扫雷这款游戏可以追溯到windows非常早的阶段。如果我们来往前收集的话,看到扫雷游戏整个发展过程,相信是一件有意思的事情。 C++扫雷游戏外挂,可以自动识别初级、中级、高级、自定义扫雷模式,增加了延时功能,自动移动鼠标指针,扫雷过程中...

777

1.30 Cubemx_STM32H743 SD_Card纳入文件管理系统

Cubemx_STM32H743 SD_Card纳入文件管理系统1、简介2、CubeMX配置 1、简介 和前面文章原理其实一样的。 1.29 Cubemx_STM32F429\H743 nandflash、spifalsh纳入文件管理系统 现在一并将SD卡、NandFlash、SPIFlash一并作为文件管理。 下面直接介绍SDcard,其他参考前面文章。 2、CubeMX配置 ...

oDuanYanGuHong的博客 1079

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1179

带爆炸效果的扫雷(后记)

对话框资源,和图片素材就不贴了。想做一个横版过关的游戏,或者一个简单的45度样例,终究要写一个3D的,《星际2》,《暗黑》,还有《魔兽世界》,真是电影级的水准。《魔兽争霸》的过场动画已经是电影级的了,人家这技术才称的上“探索”二字。我这个程序,只是让各路大侠看看,以后还有别的游戏。

programking的快乐生活 920

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2175

带爆炸效果的扫雷(源码5)

自己画了一个小工具栏,增加了鼠标单击/释放的处理程序。 附: mytool.cpp mytool.hmytool.h  #ifndef __MYTOOL_H#define __MYTOOL_Henum e_button...{    E_LEVEL,    E_HELP,    E_SCORE};class MYTOOL...{public:    MYTOOL();    ~MYTO

programking的快乐生活 1115

基于改进YOLO11的天际线检测算法:复杂光照与恶劣天气适配实战

针对特定任务的YOLO改进,不应追求通用SOTA,而应深入理解任务的物理退化机理。Retinex对应光照模型、FAD对应散射模型、Wise-IoU对应边界不确定性——每个改进都有明确的物理解释,而非盲目的模块堆叠。时序一致性:引入轻量级RNN/Transformer模块利用视频帧间信息补偿单帧退化;多模态融合:结合红外/NIR波段穿透雾霾,与可见光特征在FAD-Neck中交叉注意力融合;自监督预训练:在海量无标注天际线视频上用MAE预训练Backbone,缓解恶劣天气标注稀缺问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 95

锂电池充放电管理-单片机通用模版

- **①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;** - **②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);** - **③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);** - **④充放电过程注意在电量划分等级临界值来回抖动现象;**

a6662580的博客 1488

扫雷游戏(整体游戏架构分析+源码分析)

1.此游戏完成了我童年的梦2.锻炼了我在函数和数组这方面的知识复习3.而外掌握“缓冲区”,随机函数,时间戳等知识。

2402_84849509的博客 1033

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

winsdk仿win7扫雷

winsdk仿win7扫雷,基本实现win7扫雷效果,开源无版权,谨此纪念娄芳老师

明故为知的博客 1162

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

扫雷游戏开发教程:从零打造精美像素扫雷

通过本教程,你已经学会了如何开发一个功能完整的扫雷游戏。记住,游戏开发就像扫雷一样——需要耐心、策略和一点冒险精神!当你遇到"地雷"(bug)时,不要灰心,标记它、分析它,然后优雅地解决它。

代数的博客 1395

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

带爆炸效果的扫雷(源码4)

 计时器:由于需要暂停/恢复计时、绘图,所以专门作了一个类。 其中用了三个状态#define T_CLOSE 0#define T_START 1#define T_PAUSE 2应该可以优化。附 mytimer.h  mytimer.cpp//定时器#ifndef __MYTIMER_H#define __MYTIMER_H#define T_CLOSE 0#define T_S

programking的快乐生活 921

两分钟教你用C++修改"扫雷"游戏的设置,有源码哦!

C++ 6.0 修改"扫雷"游戏的设置,可以对扫雷游戏的界面进行设置,设置 黑白界面和彩色界面,可修改扫雷游戏英雄榜级别、英雄名称和所用时间,可设置是否添加对扫雷游戏中引爆地雷发出爆炸声。 源码结构截图: 主要源码展示: 这个小程序可以实现自动扫雷,只是娱乐和学习之用,没别的用途,大家勿骂。 我没有改变计时器,想必大家都知道系统自带一个方便扫雷的功能就是“XY...

1284

java页面布局扫雷界面_第一个用java-swing写的 图形界面程序-扫雷

不要吐槽界面丑。。谢谢 (代码附在文末,有兴趣可以看看)扫雷爆炸的效果还没来得及加上,大概思路 以被点开的雷为中心,计算周围的雷到它的距离,并放入按距离排序的队列,然后依次取出,用多线程显示爆炸效果(3,4张图片连在一起或gif)联网功能还不是很完善,肯能会有bug,只是双人对战。。。以后有时间再改进实现功能点:主题皮肤更换, OK三种游戏模式, OK计时, OK扫雷英雄榜,...

weixin_29094979的博客 638

经典扫雷游戏开发全解析:HTML+CSS+JavaScript实现

本教程将完整呈现如何用原生前端三剑客(HTML+CSS+JavaScript)实现经典扫雷游戏。该实现包含以下核心功能: 2. 视觉设计(CSS) 亮点特性: 3. 游戏逻辑(JavaScript) 核心算法流程图:左键点击右键点击是否初始化游戏生成雷区计算相邻雷数渲染棋盘玩家操作揭示格子标记旗帜是否触雷?游戏失败检查胜利条件 三、功能亮点详解 1. 雷区生成算法 2. 递归展开算法 四、游戏操作指南 左键点击:揭示格子 右键点击:标记/取消标记地雷 新游戏按钮:重置游戏 胜利条件:正确标记所有地雷并

TengMMVP的博客 2156

无聊的周末用Java写个扫雷小游戏

周末无聊,用Java写了一个扫雷程序,说起来,这个应该是在学校的时候,写会比较好玩,毕竟自己实现一个小游戏,还是比较好玩的。说实话,扫雷程序里面核心的东西,只有点击的时候,去触发更新数据这一步。 Swing 是过时了,但是好玩不会过时,不喜勿喷 源码的地址:https://github.com/Damaer/Game/tree/main/SweepMine 下面讲讲里面的设计: 数据结构设计 视图和数据尽可能分开 点击时候使用BFS扫描 判断成功失败 数据结构设计 在这个程序里面,为了方便,使用了全局

秦怀杂货店 598

C语言实现扫雷游戏(含展开、含标记)---完整源码与分析!!!

本次我们利用C语言实现了扫雷游戏,包含标记功能,0位展开功能,对于各个模块进行了细致的分析与分模块代码的讲解,最后再文章附有完整的源码,欢迎大家学习。

m0_56399733的博客 384
上一篇: 第一次面试动画
下一篇: 带爆炸效果的扫雷(源码2)
programking
博客等级 码龄23年 450粉丝 140原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值