基于ARM开发板的扫雷小游戏

 

 关键代码

#include "game.h"

点击0扩散代码

int saolei_borad(int sl[11][11],int s3[11][11], int x1, int y1) {
    // Check if the current cell has already been processed
    if (s3[x1][y1] == -1) {
        return 1;
    }

    // Calculate the number of adjacent mines
    int mmp = sl[x1-1][y1] + sl[x1+1][y1] + sl[x1][y1+1] + sl[x1][y1-1] + sl[x1-1][y1-1] + sl[x1+1][y1+1] + sl[x1-1][y1+1] + sl[x1+1][y1-1];

    // Display appropriate image based on the number of adjacent mines
    if (mmp == 0 && sl[x1][y1] == 0 && x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_00.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 8 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_8.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 7 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_7.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 6 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_6.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 5 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_5.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 4 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_4.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 3 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_3.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 2 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_2.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    } else if (mmp == 1 && sl[x1][y1] == 0&&x1 >=1 && x1<= 9&& y1>=1&&y1<=9) {
        all_bmp("saolei_1.bmp", x1 * 42 + 9, y1 * 42 + 9, 42, 42);
    }

    // Only recurse if there is no mine and it's not on the edge
    if (mmp == 0 && sl[x1][y1] == 0 && x1 >= 1 && x1 <= 9 && y1 >=1 && y1 <=9) {
        // Mark the cell as visited (e.g., set it to -1)
        s3[x1][y1] = -1;

        // Recurse to neighboring cells
        for (int i = x1 - 1; i <= x1 + 1; i++) {
            for (int j = y1 - 1; j <= y1 + 1; j++) {
                if (sl[i][j] == 0) {
                    saolei_borad(sl,s3, i, j);
                }
            }
        }
    }

    return 1; // Assuming you want to return 1 in all cases where recursion doesn't happen.
}

生成扫雷棋盘代码

void saolei_qipan()      //生成扫雷棋盘页面
{   //打开屏幕文件
     int fd = open("/dev/fb0",O_RDWR);
    int *plcd = mmap(NULL,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
   
    //生成棋盘
    for(int i = 0;i < 480;i++)//列
     {
        
          for(int j =0 ;j < 480;j++)//行
          {
            
            if (j >= 51&&j<=429&&i>=51&&i<=429)
            {
                if((i%42  == 9||j%42  == 9))
                
                *(plcd + i * 800 + j) = 0x00000000;//黑色
                else
                {
                    
                    *(plcd + i * 800 + j) = 0x00CDAA7D;//棕色
                
                }
            }
            else
            {
                *(plcd + i * 800 + j) = 0x00C0c0c0;//银色
            }
           }
    }
    close(fd);
    munmap(plcd,800*480*4);  
            
}

游戏进行中的代码

void geme_saolei()//游戏扫雷
{
    all_bmp("saolei_beijing.bmp",480,0,320,480);
    all_bmp("saolei_tuichu.bmp",580,400,120,50);
    
    all_bmp("saolei_chanzi.bmp",520,40,100,50);
    
    all_bmp("saolei_xinyouxi.bmp",580,130,120,50);
    all_bmp("saolei_xianshidilei.bmp",520,220,100,50);
    all_bmp("saolei_nandu.bmp",660,220,100,50);
    all_bmp("saolei_paihang.bmp",580,310,120,50);
    all_bmp("saolei_huiqi.bmp",660,40,100,50);
    int xy = 0;
    saolei_qipan();
    int hq1[10] ;
    int hq2[10] ;
    int px = 0,py = 0;
    int sl[11][11] = {0};//存储9*9方格的值,多余的避免出错
    int s2[11][11] = {0};
    int s3[11][11] = {0};
    int x = 0,y = 0;
    int x1 = 0,y1 = 0;
    int xx[19] = {0};//存储炸弹x坐标
    int yy[19] = {0};//存储炸弹y坐标
    int data_lei = 0;//存储地雷数量
        
        srand(time(NULL));
        for ( x = 1;x<=9;x++)//随机生成9个x坐标
        {
            xx[x] = (rand()% 9)+1;
            
        }
        for ( y = 1;y<=9;y++)//随机乘车9个y坐标
        {
            yy[y] = (rand()% 9)+1;
            
        }
        for (x = 1;x<=9;x++)
        {
            printf("%d-%d\n",xx[x],yy[x]);
            
        }
        for(int i = 1;i <= 9;i++)//随机生成几个炸弹,最多9个,可能重复就会减少
        sl[xx[i]][yy[i]] = 1;
        for (x = 1;x<=9;x++)
        {
            for (y = 1;y <= 9;y++)
            {
                if(sl[x][y] == 1)
                {
                    data_lei++;//这里统计具体地雷数
                    
                }
            }
        }
        for (int i=0;i<=10;i++)
        {
            sl[0][i] = 0;
            sl[i][0] = 0;
            sl[i][10]=0;
            sl[10][i] = 0;
            
        }
        printf("%d\n",data_lei);
        int qh = 0;//切换排雷/红旗事件
        int data = 0;//记录标记的地雷数量
        while(1)
        {
                touch_xy(&x,&y);
                x1 = (x -9) /42;
                y1 = (y - 9) / 42;
                if(sl[x1][y1] == 1 && qh == 0 &&x>=51&&x<=429&&y>=51&&y<=429)//点到炸弹,游戏结束
                {
                    for (int i = 1; i<=18;i++)
                    if(sl[xx[i]][yy[i]] == 1)
                    {
                    all_bmp("saolei_dilei.bmp",xx[i] *42+9,yy[i]*42+9,42,42);
                    all_bmp("saolei_fa.bmp",170,0,135,51);
                    }
                }
                else if(x>520&&x<620&&y>220&&y<270)//显示地雷
                {
                    for (int i = 1; i<=18;i++)
                    {
                        if (sl[xx[i]][yy[i]] == 1)
                    all_bmp("saolei_dilei.bmp",xx[i] *42+9,yy[i]*42+9,42,42);
                    }
                }
                else if(x>660&&x<760&&y>220&&y<270)//难度
                {
                    all_bmp("saolei_nandu6.bmp",0,0,480,480);
                    touch_xy(&x,&y);
                        if(x>28&&x<430&&y>10&&y<225)
                        {
                            xy = 0;
                            saolei_qipan();
                        }
                        
                        if(x>28&&x<430&&y>270&&y<480)
                        {
                            xy = 1;
                            saolei_qipan();
                            
                        }
                }
                else if(x >500&&y>400)//退出游戏
                {
                    break;
                }
                else if(x>520&&x<620&&y>40&&y<90 && qh == 0)//切换红旗事件
                {
                    qh = 1;
                    all_bmp("saolei_qizi.bmp",520,40,100,50);
                }
                else if (x>520&&x<620&&y>40&&y<90 && qh == 1)//切换排雷事件
                {
                            qh = 0;
                            all_bmp("saolei_chanzi.bmp",520,40,100,50);
                            
                }
                else if(x>580&&x<700&&y>130&&y<180)//重新开始
                {
                            all_bmp("saolei_beijing.bmp",480,0,320,480);
                            all_bmp("saolei_tuichu.bmp",580,400,120,50);
                            all_bmp("saolei_chanzi.bmp",520,40,100,50);
                            all_bmp("saolei_xinyouxi.bmp",580,130,120,50);
                            all_bmp("saolei_xianshidilei.bmp",520,220,100,50);
                            all_bmp("saolei_nandu.bmp",660,220,100,50);
                            all_bmp("saolei_paihang.bmp",580,310,120,50);
                            all_bmp("saolei_huiqi.bmp",660,40,100,50);
                            saolei_qipan();
                            
                            
                            memset(sl,0,sizeof(sl));
                            x = 0,y = 0;
                            x1 =0,y1 = 0;
                            
                            memset(xx,0,sizeof(xx));
                            memset(yy,0,sizeof(yy));
                            data_lei = 0;
                    
                            srand(time(NULL));
                            for ( x = 1;x<=9;x++)
                            {
                                xx[x] = (rand()% 9+1);
                                
                            }
                            for ( y = 1;y<=9;y++)
                            {
                                yy[y] = (rand()% 9)+1;
                                
                            }
                            for (x = 1;x<=9;x++)
                            {
                                printf("%d-%d\n",xx[x],yy[x]);
                            
                            }
                            for(int i = 1;i <= 9;i++)//随机生成几个炸弹
                            sl[xx[i]][yy[i]] = 1;
                            if (xy == 1)
                            {
                                
                                for ( x = 10;x<=18;x++)
                                {
                                    xx[x] = (rand()% 9+1);
                                    
                                }
                                
                                for ( y = 10;y<=18;y++)
                                {
                                    yy[y] = (rand()% 9)+1;
                                    
                                }
                                for (x = 10;x<=18;x++)
                                {
                                    printf("%d-%d\n",xx[x],yy[x]);
                                
                                }
                                for(int i = 10;i <=18 ;i++)//随机生成几个炸弹
                                sl[xx[i]][yy[i]] = 1;
                            }
                            for (x = 1;x<=9;x++)
                            {
                                for (y = 1;y <= 9;y++)
                                {
                                    if(sl[x][y] == 1)
                                    {
                                        data_lei++;//记住炸弹数量
                                        
                                    }
                                }
                            }
                            for (int i=0;i<=10;i++)//边角清零
                            {
                                sl[0][i] = 0;
                                sl[i][0] = 0;
                                sl[i][10]=0;
                                sl[10][i] = 0;
                                
                            }
                            printf("%d\n",data_lei);
                            qh = 0;//切换排雷/红旗事件
                            data = 0;
                            memcpy(s3,sl,sizeof(sl));
                            memset(s2,0,sizeof(s2));
                            memset(hq1,99,sizeof(hq1));
                            memset(hq1,99,sizeof(hq2));
                            
                            px = 0,py = 0;
                }
                else if (x>660&&x<760&&y>40&&y<90&&px>=1&&py>=1)//撤回一朵小红旗
                {
                        
                        px--;
                        py--;
                        if(px == -1)
                        {
                            px = 0;
                        }
                        if (py == -1)
                        {
                            py = 0;
                        }
                        s2[hq1[px]][hq2[py]] = 0;
                        if (hq1[px] != 99&&hq2[py] != 99)
                        {
                            
                            Display_qipan3( hq1[px]*42+9,hq2[py]*42+9 );
                            
                        }
                    
                        hq1[px] = 99;
                        hq2[px] = 99;
                }    

    
        
        

                else if(x>=51&&x<=429&&y>=51&&y<=429)//这里点击玩游戏
                {
                                
                                
                            
                            if(sl[x1][y1] == 0 &&x>=51&&x<=429&&s2[x1][y1] == 0&&qh == 0&&y>=51&&y<=429)
                            {
                                
                                saolei_borad(sl,s3,x1,y1);
                                    
                            }
                              else if(sl[x1][y1] == 0 && qh == 1&&x>=51&&x<=429&&y>=51&&y<=429 && s2[x1][y1] != 1)//插红旗
                            {
                                        all_bmp("saolei_xiaohongqi.bmp",x1 *42+9,y1*42+9,42,42);
                                        s2[x1][y1] = 1;//1表示已经擦上红旗
                                        hq1[px] = x1;
                                        hq2[py] = y1;
                                        px++;
                                        py++;
                                        
                            }
                            
                            else if(sl[x1][y1] == 1 && qh == 1&&x>=51&&x<=429 && y>=51&&y<=429 &&s2[x1][y1] != 1)
                            {
                                        all_bmp("saolei_xiaohongqi.bmp",x1 *42+9,y1*42+9,42,42);
                                        data++;
                                        if(data == data_lei&&data>=6)//判断胜利条件
                                        {
                                            printf("%d\n",data);
                                            all_bmp("saolei_guo.bmp",170,0,135,51);
                                            
                                        }
                                        s2[x1][y1] = 1;
                                        hq1[px] = x1;
                                        hq2[py] = y1;
                                        px++;
                                        py++;
                            }
                            
            }
    
    
    
    
        }

    
    
}

取消红旗的代码

void Display_qipan3(int x, int y)      //悔棋补空
{
  // 打开屏幕文件
  int fd = open("/dev/fb0", O_RDWR);
  int *plcd = mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

  // 保存原始像素值
  int originalPixel;

  // 生成棋盘
  for (int i = y; i <= y + 42; i++) // 列
  {
    for (int j = x ; j <= x + 42; j++) // 行
    {
      if (i >= 0 && i < 480 && j >= 0 && j < 800) // 确保 i 和 j 在有效范围内
      {
        // 保存原始像素值
        originalPixel = *(plcd + j * 480 + i);

        // 修改特定区域内的像素值
        if ((i % 42 ==9 || j % 42 == 9) && x <429 &&x>51)
        {
          *(plcd + j  + i*800) = 0x00000000; // 黑色
        }
        else
        {
          *(plcd + j + i*800) = 0x00CDAA7D; // 棕色
        }
      }
    }
  }

  // 关闭文件描述符并解除内存映射
  close(fd);
  munmap(plcd, 800 * 480 * 4);  
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值