注册 登录
编程论坛 C图形专区

[原创]扫雷英雄--搞笑版

jig 发布于 2006-07-31 21:52, 5331 次点击

界面

只有本站会员才能查看附件,请 登录

25 回复
#2
ChenMo2006-08-01 12:04
呵呵,有意思。
#3
asx45602006-08-05 11:17

可以

#4
weiwei1212112006-08-07 20:35

佩服,佩服,
能否提供源文件以供参考学习呢?

#5
jig2006-08-07 23:52
你点击下载,里面有源码的啊
#6
weiwei1212112006-08-08 13:11
不好意思,本人太菜了,真的没找到源文件。
#7
jyycom2006-08-08 13:35
没有源码啊
#8
jig2006-08-08 16:24

不好意思的确是没有,看来我上传错了

#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();

#9
横眉冷对2006-08-08 17:08
收了,好好学习学习。
谢谢楼主
#10
weiwei1212112006-08-08 19:41
谢了,以后要多多向楼主学习。
#11
weiwei1212112006-08-08 21:01

今天才知道了<neo.h> ,在此谢过那些为其作出贡献的人们,不过程序在Win-TC中存在以下错误:

=====================================================================================================================

SAMPLE *sample;// 24: 说明语法错误

void sound(int key); //33: 与'sound'声明中的类型不匹配

sample = load_wav("agsy.wav"); //错误 142: 未定义的符号'sample'在 sound 函数中

if (key = get_click()) //警告 260: 可能是不正确的赋值在 play_mine 函数中

break; //警告 284: 不能到达的代码在 play_mine 函数中

SAMPLE *sample = NULL; //错误 406: 未定义的符号'sample'在 main 函数中 错误 406: 需要逻辑0或非0在 main 函数中


install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL); //错误 411: 未定义的符号'DIGI_AUTODETECT'在 main 函数中 错误 411: 未定义的符号'MIDI_AUTODETECT'在 main 函数中


break; 警告 430: 不能到达的代码在 main 函数中


*** 编译出现 8 个错误 ***

=============================================================================================================================

#12
一笔苍穹2006-08-08 23:15

首先请确定你下的NEO是最新版本:http://free.ys168.com/?dongkai
由于TC版和DEV版中的音频处理部分开发进度不一样,所以你最好将以上源代码中的音频支持部分去掉不要,或者直接联系JIG让他帮忙移植一下,我最近没自己的机子所以帮不上你~~

#13
横眉冷对2006-08-09 17:52
请问neo.h在cfree中能使用吗?
#14
一笔苍穹2006-08-09 22:56
理论上是可行的,DEV和CFREE差别不大,不过需要做一些细节上的调整,我现在没时间去做,而且觉得移植的价值不大,所以一直没动手。
#15
weiwei1212112006-08-10 13:50
多谢 一笔苍穹 的指点!
#16
anlogo2007-07-24 13:35
哈哈,好好笑啊
崇拜LZ的技术
顶起
#17
eakcon2007-11-14 10:18

好强呀!


此主题相关图片如下:

#18
zh_hn2007-11-25 22:59
good
#19
yixiaowz2007-11-26 12:47
有个问题哦,不能正常关闭哦!
#20
StarWing832007-11-28 19:52
LZ,你的空位检测有问题,有的时候按到空位了以后揭开格子时一些有数字的格子揭不开
#21
燃燒2007-11-30 10:21
好多的大便....

留下吧 唉..
#22
luo1232007-12-05 15:51
谢谢了,收下
#23
阿牧2007-12-09 21:34
这个窗口程序是用C编写的吗?
源代码调试不行。

[[italic] 本帖最后由 阿牧 于 2007-12-9 21:47 编辑 [/italic]]
#24
kidd20052007-12-10 15:58
想不到这么一个小游戏的代码也这么长啊~~
#25
Love嵌入式2008-03-16 14:45
厉害厉害
#26
逍遥梦2012-12-04 15:08
回复 5楼 jig
我下载了,怎么没源文件呢?
1