【C语言 扫雷】

Minesweeper in C

C语言扫雷

9*9

可以自动消除一大片

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 9 //9*9扫雷

int sum = 10; //雷数目
int mine[N][N] = {0}; //雷数组
int map[N][N]; //显示数组
int markDirection[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //8个方向

void printMap() //打印地图
{
    int i = 0,j = 0;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }
}

void setMine() //埋雷
{
    srand((int)time(0));
    int x=0,y=0;

    while(sum >= 0)
    {
        x = (rand()%(9-1+1))+1;
        y = (rand()%(9-1+1))+1;

        if(mine[x][y] != 1)
        {
            mine[x][y] = 1;
            sum -= 1;
        }
    }
}

int countMine(int x,int y) //数雷
{
    int count=0;
    int x1 = 0, y1 = 0;
    int i = 0;
    
    for(i=0;i<N;i++)
    {
        x1 = x + markDirection[i][0];
        y1 = y + markDirection[i][1];
        if(x1<0 || x1>=N || y1<0 || y1>=N) continue;
        if(mine[x1][y1] == 1) count += 1;
    }
    return count;
}

void autoClear(int x,int y) //自动消一大片
{
    int x1 = 0, y1 = 0;
    int i = 0;
    int count = 0;
    
    map[x][y] = 0;
    
    for(i=0;i<N;i++)
    {
        x1 = x + markDirection[i][0];
        y1 = y + markDirection[i][1];
        if(x1<0 || x1>=N || y1<0 || y1>=N) continue;
        count = countMine(x1,y1);
        if(count != 0) 
        {
            map[x1][y1] = count;
        }else if(map[x1][y1]==0){
            continue;
        }else{
            autoClear(x1,y1);
        }
    }
}

int winCheck() //赢了吗
{
    int count = 0;
    int i=0,j=0;
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            if(map[i][j] == 9) count += 1;
        }
    }
    if(count == sum)
    {
        return 1;
    }else{
        return 0;
    }
}

void Gameover() //炸了
{
    int i = 0,j = 0;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d ",mine[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    int X=0,Y=0;
    int i=0,j=0;
    int check=0;
    int result = 1;
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            map[i][j] = 9;
        }
    }
        

    
    printf("*********扫雷**********\n");
    printMap();
    setMine();
    
    while(result)
    {
        printf("输入 行,列\n");
        scanf("%d,%d",&X,&Y);
        
        X -= 1;
        Y -= 1;
        
        if(mine[X][Y] == 1)
        {
            printf("Game over!\n");
            Gameover();
            result = 0;
        }else{
            check = countMine(X,Y);
            if(check != 0)
            {
                map[X][Y] = check;
            }else{
                autoClear(X,Y);
            }
            printMap();
        }
        
        if(winCheck())
        {
            printf("You win!");
            break;
        }
        
    }
    return 0;
}

 

代码:https://github.com/chiuxingxiang/Minesweeper-C

【制作微信支付宝二合一收款码(使用自己的服务器)】

  • 由于这个东西涉及到钱的为题,感觉还是用自己的服务器弄一个比较安全。

  • 其实原理十分简单:
    
    客户端扫码 -> 服务端根据 User-Agent 判断客户端类型 -> 分别返回支付宝和微信的二维码内容
    

  • 话不多少,开干。

    1.解码微信和支付宝的付款码

    支付宝:

    
    HTTPS://QR.ALIPAY.COM/TSX06990VFZIYPD04PEG95 (https 协议,可直接唤醒支付宝 APP)
    

    微信:

    
    wxp://f2f09zP7EA1FQhdQvgrisHYoS4Jr9CHhX7q5 (微信自己的协议链接,不允许外部调用)
    

    2.查看一下微信和支付宝在扫码,发送请求所携带的 User Agent 头信息

    支付宝:

    
    UCBrowser/11.5.0.939 UCBS/2.10.1.6 Mobile Safari/537.36 AliApp(AP/10.0.15.051805) AlipayClient/10.0.15.051805 Language/zh-Hans
    

    微信:

    
    MQQBrowser/6.2 TBS 043220 Safari/537.36 MicroMessenger/6.5.8.1060 NetType/4G Language/zh_CN
    
  • 这样就很轻松区分是微信还是支付宝扫码了:
    
    User Agent 含有 MicroMessenger 为微信
    
    User Agent 含有 ApliPayClient 为支付宝
    

    3.判断客户端 User Agent

  • 如果是支付宝直接跳转支付宝链接,微信返回收款二维码,自行长按扫码。

    代码如下(请加上php头尾):

    
        
            header("Content-type: text/html; charset=utf-8");
            $ua = $_SERVER['HTTP_USER_AGENT'];
            if (preg_match("/.+MicroMessenger.+/", $ua)) {
                $url = 'https://qxx.hk/wx.jpeg';
                header("location: " . $url);
            } elseif (preg_match("/.+AlipayClient.+/", $ua)) { 
            $url = 'HTTPS://QR.ALIPAY.COM/TSX06990VFZIYPD04PEG95';
            header("location: " . $url);
            } else { 
               echo "请使用支付宝或微信客户端扫码付款";
            }
        
    
  • 【Windows 10 UEFI引导错误 蓝屏】

  • 坑爹EFI,修复如图错误

    UEFI引导基本原理

    1.ESP引导分区

    ESP磁盘分区是GPT格式硬盘放EFI引导文件的磁盘,在MBR格式硬盘中也可以由任一fat
    格式磁盘分区代替

    2.EFI文件结构

    
    efi\boot\bootx64.efi
    efi\microsoft\boot\bcd
    

    3.EFI启动过程

    UEFI Bios启动时,自动查找硬盘下ESP分区的bootx64.efi,然后由bootx64.efi引导
    EFI下的BCD文件,由BCD引导指定系统文件(一般为C:\windows\system32\winload.efi)

    使用 bcdboot 命令修复

    1.启动64bit WindowsPE,Bios/UEFI启动进入下都可以
    2.启动64位8PE,并用ESP分区挂载器或Diskgenuis挂载ESP分区
    3.打开cmd,输入以下命令并运行

    
    bcdboot c:\windows /s o: /f uefi /l zh-cn
    

    其中:

    
    c:\windows  硬盘系统目录,根据实际情况修改
    /s o:     指定esp分区所在磁盘,根据实际情况修改
    /f uefi   指定启动方式为uefi
    /l zh-cn  指定uefi启动界面语言为简体中文
    注:64位7PE不带/s参数,故7PE不支持bios启动下修复
    
  • 【迅雷9 屏蔽浏览器】

      • 非常简单的方法,完全避免网上下载补丁带来的病毒风险:

    1.打开X:\Program Files\Thunder Network\Thunder9\Program\TBC,X是你的安装目录
    2.找到ThunderBrowser.exe,并复制一个备份以防万一,删除ThunderBrowser.exe
    3.新建一个空白的txt文档,并把整个文件包括后缀名修改为ThunderBrowser.exe
    4.选中新生成的ThunderBrowser.exe,右键-属性-选中“只读”

    • 重新启动迅雷之后会发现右侧浏览器位置一片空白,但是不影响配置中心使用。