关键代码
#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);
}