可以
佩服,佩服,
能否提供源文件以供参考学习呢?
不好意思的确是没有,看来我上传错了
#include <neo.h>
#define COUNT 160 /* 雷的数量 */
#define ESC 15131 /* 退出 */
#define REST 4722 /* 重新开始 */
typedef struct
{
char sit_x; /* 扫雷位置 */
char sit_y;
char type; /* 是否已经扫除 */
char mark; /* 是否已经记录 */
char num; /* 0 - 9, 0 表示没有,9表示雷,1-8表示雷个数 */
} MINE;
MINE Mine[24][32]; /* 开辟雷区,768个方快 */
int count_ok; /* 记录扫出的雷 */
int count_will_ok; /* 记录标记的雷 */
int sound_key; /* 标记可以发声 */
char count_mine; /* 用于记录某个方快周围有几个雷 */
SAMPLE *sample;
void init_mine(void); /* 雷区初始化 */
void add_mine(int x, int y); /* 累计某个方快周围有几个雷 */
int play_mine(void); /* 开始扫雷 */
int open_mine(int x, int y); /* 显示原有图片 */
int open_mine2(int x, int y);
void over_mine(char key); /* 结束画面 */
void open_null(int x, int y); /* 翻出连接块 */
void sound(int key); /* 音效果 */
void add_mine(int x, int y)
{
if ((x > - 1) && (x < 32) && (y > -1) && (y < 24))
{
if (Mine[y][x].num == 9)
{
count_mine++;
}
}
}
void init_mine(void)
{
int i, j;
char x, y;
count_ok = 0;
/* 对雷区归零 */
for (y = 0; y < 24; y++)
{
for (x = 0; x < 32; x++)
{
Mine[y][x].type = 0;
Mine[y][x].mark = 0;
Mine[y][x].num = 0;
}
}
/* 随机给出160个雷 */
for (i = 0; i < COUNT; i++)
{
x = random(31);
y = random(23);
if (Mine[y][x].num == 9)
{
i--;
}
else
{
Mine[y][x].num = 9;
}
}
/* 初始化各方快的数字 */
for (y = 0; y < 24; y++)
{
for (x = 0; x < 32; x++)
{
if (Mine[y][x].num != 9) /* 若不为雷块 */
{
count_mine = 0;
add_mine(x - 1, y - 1);
add_mine(x, y - 1);
add_mine(x + 1, y - 1);
add_mine(x - 1, y);
add_mine(x + 1, y);
add_mine(x - 1, y + 1);
add_mine(x, y + 1);
add_mine(x + 1, y + 1);
Mine[y][x].num = count_mine;
}
}
}
scare_mouse();
/* 显示图片 */
for (y = 0; y < 24; y++)
{
for (x = 0; x < 32; x++)
{
/*if (Mine[y][x].num < 9)
{
show_bmp("bai.bmp", x * 20, y * 20);
if (Mine[y][x].num != 0)
{
set_str_color(Mine[y][x].num * 8765);
neo_printf(x * 20 + 5, y * 20 + 5, "%d", Mine[y][x].num);
}
}
else
{
show_bmp("bian.bmp", x * 20, y * 20);
}*/
show_bmp("gai.bmp", x * 20, y * 20);
}
}
unscare_mouse();
}
void sound(int key)
{
char name[20];
switch(key)
{
case 0:
sample = load_wav("agsy.wav"); /*读入一个音频采样*/
break;
case 9:
sample = load_wav("cdb.wav");
break;
case 10:
sample = load_wav("1ts.wav");
break;
default:
sprintf(name, "%d.wav", key);
sample = load_wav(name);
}
play_sample(sample, 255, 128, 0, 0);
sound_key = 0;
}
int open_mine(int x, int y)
{
if ((x < 0) || (x > 31) || (y < 0) || (y > 23))
{
return 0;
}
if (Mine[y][x].type == 0) /* 还未扫除 */
{
scare_mouse();
if (Mine[y][x].num == 9) /* 踩雷 */
{
Mine[y][x].type = 1; /* 表示翻出 */
if (sound_key)
{
sound(9);
}
show_bmp("bian.bmp", x * 20, y * 20);
unscare_mouse();
return 1;
}
else /* 没踩雷 */
{
if (Mine[y][x].num == 0) /* 空数字 */
{
if (sound_key)
{
sound(0);
}
open_null(x, y); /* 翻出连空块 */
unscare_mouse();
}
else /* 有数字 */
{
Mine[y][x].type = 1; /* 表示翻出 */
if (sound_key)
{
sound(Mine[y][x].num);
}
show_bmp("bai.bmp", x * 20, y * 20);
set_str_color(Mine[y][x].num * 8765);
neo_printf(x * 20 + 5, y * 20 + 5, "%d", Mine[y][x].num);
unscare_mouse();
}
return 0;
}
}
}
/* 种子填充法 */
void open_null(int x, int y)
{
if (Mine[y][x].type) /* 若已经翻出即退出 */
{
return;
}
if ((x < 0) || (x > 31) || (y < 0) || (y > 23))
{
return;
}
Mine[y][x].type = 1; /* 表示翻出 */
if (Mine[y][x].num == 0)
{
show_bmp("bai.bmp", x * 20, y * 20);
open_null(x, y - 1);
open_null(x, y + 1);
open_null(x - 1, y);
open_null(x + 1, y);
}
else
{
show_bmp("bai.bmp", x * 20, y * 20);
set_str_color(Mine[y][x].num * 8765);
neo_printf(x * 20 + 5, y * 20 + 5, "%d", Mine[y][x].num);
}
}
int play_mine(void)
{
int x, y;
int i, j;
int open_key[8];
char key, key1;
if (key = get_click())
{
sound_key = 1;
x = get_mouse_x() / 20;
y = get_mouse_y() / 20;
switch(key)
{
case 1: /* 鼠标左键操作 */
if (open_mine(x, y))
{
scare_mouse();
show_bmp("bian2.bmp", x * 20, y * 20);
unscare_mouse();
over_mine(0);
return 1;
}
else
{
return 0;
}
break;
case 2: /* 鼠标右键操作 */
if (Mine[y][x].type == 0 && count_will_ok < COUNT) /* 没翻出 */
{
scare_mouse();
while(get_click());
if (Mine[y][x].mark == 0) /* 没记录 */
{
show_bmp("gai2.bmp", x * 20, y * 20);
Mine[y][x].mark = 1; /* 记录标记下 */
sound(10);
count_will_ok++; /* 记录已标记好的个数 */
if (Mine[y][x].num == 9)/* 若是一个雷 */
{
count_ok++;
if (count_ok == COUNT) /* 判断是否成功 */
{
over_mine(1);
unscare_mouse();
return 1;
}
else
{
unscare_mouse();
return 0;
}
}
unscare_mouse();
}
else /* 已记录 */
{
show_bmp("gai.bmp", x * 20, y * 20);
Mine[y][x].mark = 0; /* 记录没标记 */
count_will_ok--; /* 记录已标记好的个数 */
unscare_mouse();
return 0;
}
}
break;
case 3: /* 鼠标左右键操作 */
if (Mine[y][x].type && Mine[y][x].num > 0) /* 为翻出的 */
{
open_key[0] = open_mine2(x - 1, y -1);
open_key[1] = open_mine2(x, y - 1);
open_key[2] = open_mine2(x + 1, y - 1);
open_key[3] = open_mine2(x - 1, y);
open_key[4] = open_mine2(x + 1, y);
open_key[5] = open_mine2(x - 1, y + 1);
open_key[6] = open_mine2(x, y + 1);
open_key[7] = open_mine2(x + 1, y + 1);
for (i = 0; i < 8; i++)
{
if (open_key[i]) /* 踩地雷 */
{
over_mine(1);
while (get_click()) ;
return 1;
}
}
return 0;
}
break;
}
while (get_click()) ;
}
return 0;
}
int open_mine2(int x, int y)
{
if (Mine[y][x].mark == 0) /* 未标记 */
{
if (open_mine(x, y) && Mine[y][x].num == 9)
{
scare_mouse();
show_bmp("bian2.bmp", x * 20, y * 20);
unscare_mouse();
return 1;
}
return 0;
}
}
/* 全部翻出 */
void over_mine(char key)
{
int x, y;
for (y = 0; y < 24; y ++)
{
for (x = 0; x < 32; x++)
{
if ((Mine[y][x].type == 0 && Mine[y][x].num != 9)
|| (Mine[y][x].mark == 0 && Mine[y][x].num == 9) )
{
open_mine(x, y);
}
}
}
}
void main(void)
{
int x, y;
char key = 0;
SAMPLE *sample = NULL;
neo_init();
set_window_mode(0);
set_vbe_mode(VBE640X480X64K);
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
install_keyboard();
install_mouse();
show_mouse();
/* 初始化雷区 */
init_mine();
while(1)
{
if (keypressed())
{
switch(readkey())
{
case ESC:
return;
break;
case REST:
key = 0;
init_mine();
break;
}
}
if (key == 0)
{
if (play_mine())
{
key = 1;
}
}
}
destroy_sample(sample);
}
END_OF_MAIN();