📄 diamond.c
字号:
#define DIAMOND_FLASHTIME 15000
#define DIAMOND_COUNT 7
#define DIAMOND_CHOOSENINCTIME 8000
bmp_picture diamond[7][4];
int dia[16][8];
struct{
int x1, y1, x2, y2;
int chd;
}clk;
struct{
int x, y;
int cur, time;
}flash;
int diamond_x, diamond_y;
int diamond_choosencolor = 4, diamond_choosentime = 0;
void diamond_init(){
BMP_Load("red_0.bmp", &diamond[0][0]);
BMP_Load("yellow_0.bmp", &diamond[1][0]);
BMP_Load("blue_0.bmp", &diamond[2][0]);
BMP_Load("green_0.bmp", &diamond[3][0]);
BMP_Load("brown_0.bmp", &diamond[4][0]);
BMP_Load("pink_0.bmp", &diamond[5][0]);
BMP_Load("white_0.bmp", &diamond[6][0]);
BMP_Load("red_1.bmp", &diamond[0][1]);
BMP_Load("yellow_1.bmp", &diamond[1][1]);
BMP_Load("blue_1.bmp", &diamond[2][1]);
BMP_Load("green_1.bmp", &diamond[3][1]);
BMP_Load("brown_1.bmp", &diamond[4][1]);
BMP_Load("pink_1.bmp", &diamond[5][1]);
BMP_Load("white_1.bmp", &diamond[6][1]);
BMP_Load("red_2.bmp", &diamond[0][2]);
BMP_Load("yellow_2.bmp", &diamond[1][2]);
BMP_Load("blue_2.bmp", &diamond[2][2]);
BMP_Load("green_2.bmp", &diamond[3][2]);
BMP_Load("brown_2.bmp", &diamond[4][2]);
BMP_Load("pink_2.bmp", &diamond[5][2]);
BMP_Load("white_2.bmp", &diamond[6][2]);
BMP_Load("red_1.bmp", &diamond[0][3]);
BMP_Load("yellow_1.bmp", &diamond[1][3]);
BMP_Load("blue_1.bmp", &diamond[2][3]);
BMP_Load("green_1.bmp", &diamond[3][3]);
BMP_Load("brown_1.bmp", &diamond[4][3]);
BMP_Load("pink_1.bmp", &diamond[5][3]);
BMP_Load("white_1.bmp", &diamond[6][3]);
}
void diamond_fresh(){
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
dia[i][j] = random(DIAMOND_COUNT);
flash.x = -1;
flash.y = -1;
flash.cur = 0;
flash.time = 0;
}
void diamond_showall(){
int i, j;
mouse_get();
mouse_putback();
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if (dia[i][j] != -1)
BMP_Put(diamond[dia[i][j]][0], 124 + j * 24, 172 - i * 24);
else
clean_black(124 + j * 24, 172 - i * 24, 24, 24);
mouse_getback();
mouse_showcur();
}
long diamond_check(long times){
int i, j, k, t;
long rtn = 0l;
int s[8][8][2];
memset(s, 0, 256);
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++){
if (!s[i][j][0]){
for (t = 1; (i + t < 8) && (dia[i + t][j] == dia[i][j]); t++);
if (t >= 3)
for (k = 0; k < t; k++)
s[i + k][j][0] = 1;
}
if (!s[i][j][1]){
for (t = 1; (j + t < 8) && (dia[i][j + t] == dia[i][j]); t++);
if (t >= 3)
for (k = 0; k < t; k++)
s[i][j + k][1] = 1;
}
}
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if (s[i][j][0] | s[i][j][1]){
dia[i][j] = -1;
rtn += 10l;
}
return rtn * times;
}
void diamond_fill(){
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if (dia[i][j] == -1)
dia[i][j] = random(DIAMOND_COUNT);
}
void diamond_choose(){
if (!clk.chd) return;
if (++diamond_choosentime == DIAMOND_CHOOSENINCTIME){
diamond_choosentime = 0;
diamond_choosencolor = (diamond_choosencolor + 8) % 256;
}
else return;
mouse_get();
mouse_putback();
HLine(124 + clk.x1 * 24, 147 + clk.x1 * 24, 4 + clk.y1 * 24, diamond_choosencolor);
HLine(124 + clk.x1 * 24, 147 + clk.x1 * 24, 27 + clk.y1 * 24, diamond_choosencolor);
VLine(4 + clk.y1 * 24, 27 + clk.y1 * 24, 124 + clk.x1 * 24, diamond_choosencolor);
VLine(4 + clk.y1 * 24, 27 + clk.y1 * 24, 147 + clk.x1 * 24, diamond_choosencolor);
mouse_getback();
mouse_showcur();
}
void diamond_unchoose(){
mouse_get();
mouse_putback();
HLine(124 + clk.x1 * 24, 147 + clk.x1 * 24, 4 + clk.y1 * 24, 0);
HLine(124 + clk.x1 * 24, 147 + clk.x1 * 24, 27 + clk.y1 * 24, 0);
VLine(4 + clk.y1 * 24, 27 + clk.y1 * 24, 124 + clk.x1 * 24, 0);
VLine(4 + clk.y1 * 24, 27 + clk.y1 * 24, 147 + clk.x1 * 24, 0);
mouse_getback();
mouse_showcur();
}
int diamond_click(){
if (!clk.chd){
clk.x1 = diamond_x;
clk.y1 = diamond_y;
clk.chd = 1;
return 0;
}
else{
if (((abs(diamond_x - clk.x1) == 1) && (diamond_y == clk.y1)) || ((abs(diamond_y - clk.y1) == 1) && (diamond_x == clk.x1))){
clk.x2 = diamond_x;
clk.y2 = diamond_y;
clk.chd = 2;
return 1;
}
else if ((diamond_x == clk.x1) && (diamond_y == clk.y1)){
clk.chd = 0;
diamond_unchoose();
return 0;
}
else{
diamond_unchoose();
clk.chd = 0;
return 0;
}
}
}
void diamond_soundonmove(){
long i, j;
for (i = 0; i < 8000l; i++){
sound_gdserver();
for (j = 0; j < 1000l; j++);
}
}
void diamond_Hmove(int x1, int x2, int y){
int t, i;
if (x1 > x2){
x1 ^= x2;
x2 ^= x1;
x1 ^= x2;
}
for (t = 1; t <= 2; t++/*, delay(100)*/){
mouse_get();
mouse_putback();
clean_black(124 + x1 * 24, 172 - y * 24, 6 * t, 24);
clean_black(148 + x2 * 24 - 6 * t, 172 - y * 24, 6 * t, 24);
BMP_Put(diamond[dia[y][x1]][0], 124 + x1 * 24 + t * 6, 172 - y * 24);
for (i = 0; i < 24; i++)
_fmemcpy(&video_buffer[(172 - y * 24 + i) * SCREEN_WIDTH + 124 + x2 * 24 + 6 * t], &diamond[dia[y][x2]][0].buffer[(23 - i) * 24 + 12 * t], 24 - 12 * t);
mouse_getback();
mouse_showcur();
diamond_soundonmove();
}
for (t = 1; t >= 0; t--/*, delay(100)*/){
mouse_get();
mouse_putback();
clean_black(124 + x1 * 24, 172 - y * 24, 6 * t, 24);
clean_black(148 + x2 * 24 - 6 * t, 172 - y * 24, 6 * t, 24);
BMP_Put(diamond[dia[y][x1]][0], 124 + x2 * 24 - t * 6, 172 - y * 24);
for (i = 0; i < 24; i++)
_fmemcpy(&video_buffer[(172 - y * 24 + i) * SCREEN_WIDTH + 124 + x1 * 24 + 6 * t], &diamond[dia[y][x2]][0].buffer[(23 - i) * 24], 24 - 12 * t);
mouse_getback();
mouse_showcur();
diamond_soundonmove();
}
}
void diamond_Vmove(int y1, int y2, int x){
int t, i;
if (y1 < y2){
y1 ^= y2;
y2 ^= y1;
y1 ^= y2;
}
for (t = 1; t <= 2; t++/*, delay(100)*/){
mouse_get();
mouse_putback();
clean_black(124 + x * 24, 172 - y1 * 24, 24, 6 * t);
clean_black(124 + x * 24, 196 - y2 * 24 - 6 * t, 24, 6 * t);
BMP_Put(diamond[dia[y1][x]][0], 124 + x * 24, 172 - y1 * 24 + 6 * t);
for (i = 0; i < 24 - t * 12; i++)
_fmemcpy(&video_buffer[(172 - y2 * 24 + i + 6 * t) * SCREEN_WIDTH + 124 + x * 24], &diamond[dia[y2][x]][0].buffer[(24 - t * 12 + i) * 24], 24);
mouse_getback();
mouse_showcur();
diamond_soundonmove();
}
for (t = 1; t >= 0; t--/*, delay(100)*/){
mouse_get();
mouse_putback();
clean_black(124 + x * 24, 172 - y1 * 24, 24, 6 * t);
clean_black(124 + x * 24, 196 - y2 * 24 - 6 * t, 24, 6 * t);
BMP_Put(diamond[dia[y1][x]][0], 124 + x * 24, 172 - y2 * 24 - t * 6);
for (i = 0; i < 24 - t * 12; i++)
_fmemcpy(&video_buffer[(172 - y1 * 24 + i + 6 * t) * SCREEN_WIDTH + 124 + x * 24], &diamond[dia[y2][x]][0].buffer[(23 - i) * 24], 24);
mouse_getback();
mouse_showcur();
diamond_soundonmove();
}
}
void diamond_change(){
int i1, j1, i2, j2, t;
clk.chd = 0;
i1 = 7 - clk.y1;
j1 = clk.x1;
i2 = 7 - clk.y2;
j2 = clk.x2;
if (i1 == i2) diamond_Hmove(j1, j2, i1);
else if (j1 == j2) diamond_Vmove(i1, i2, j1);
dia[i1][j1] ^= dia[i2][j2];
dia[i2][j2] ^= dia[i1][j1];
dia[i1][j1] ^= dia[i2][j2];
}
int diamond_space(){
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if (dia[i][j] == -1)
return 1;
return 0;
}
void diamond_fall(){
int i, j, k, t;
int list[8];
for (i = 8; i < 16; i++)
for (j = 0; j < 8; j++)
dia[i][j] = -1;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if (dia[i][j] == -1){
for (k = 8; dia[k][j] != -1; k++);
dia[k][j] = random(DIAMOND_COUNT);
}
while (diamond_space()){
for (i = 0; i < 8; i++)
list[i] = -1;
for (j = 0; j < 8; j++){
for (i = 0; (i < 8) && (dia[i][j] != -1); i++);
if (i < 8)
list[j] = i + 1;
else
list[j] = -1;
}
for (t = 1; t <= 3; t++/*, delay(100)*/){
mouse_get();
mouse_putback();
for (j = 0; j < 8; j++)
if (list[j] != -1)
for (i = list[j]; i <= 8; i++)
if (dia[i][j] != -1)
BMP_Put(diamond[dia[i][j]][0], 124 + j * 24, 172 - i * 24 + t * 8);
else clean_black(124 + j * 24, 172 - i * 24 + t * 8, 24, 24);
mouse_getback();
mouse_showcur();
diamond_soundonmove();
}
mouse_get();
mouse_putback();
for (j = 0; j < 8; j++)
if (list[j] != -1){
for (i = list[j]; !((i >= 8) && (dia[i][j] == -1)); i++)
dia[i - 1][j] = dia[i][j];
dia[i-1][j] = -1;
if (i == 9) clean_black(124 + j * 24, 0, 24, 4);
}
mouse_getback();
mouse_showcur();
}
}
int diamond_nomove(){
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
if ((i < 5) && (dia[i][j] == dia[i + 2][j]) && (dia[i][j] == dia[i + 3][j])) return 0; else
if ((j < 5) && (dia[i][j] == dia[i][j + 2]) && (dia[i][j] == dia[i][j + 3])) return 0; else
if ((i > 2) && (dia[i][j] == dia[i - 2][j]) && (dia[i][j] == dia[i - 3][j])) return 0; else
if ((j > 2) && (dia[i][j] == dia[i][j - 2]) && (dia[i][j] == dia[i][j - 3])) return 0; else
if ((i < 7) && (j > 0) && (j < 7) && (dia[i][j] == dia[i + 1][j - 1]) && (dia[i][j] == dia[i + 1][j + 1])) return 0; else
if ((i > 0) && (j > 0) && (j < 7) && (dia[i][j] == dia[i - 1][j - 1]) && (dia[i][j] == dia[i - 1][j + 1])) return 0; else
if ((j < 7) && (i > 0) && (i < 7) && (dia[i][j] == dia[i - 1][j + 1]) && (dia[i][j] == dia[i + 1][j + 1])) return 0; else
if ((j > 0) && (i > 0) && (i < 7) && (dia[i][j] == dia[i - 1][j - 1]) && (dia[i][j] == dia[i + 1][j - 1])) return 0; else
if ((i > 1) && (j > 0) && (dia[i][j] == dia[i - 1][j - 1]) && (dia[i][j] == dia[i - 2][j - 1])) return 0; else
if ((i > 1) && (j < 7) && (dia[i][j] == dia[i - 1][j + 1]) && (dia[i][j] == dia[i - 2][j + 1])) return 0; else
if ((i < 6) && (j > 0) && (dia[i][j] == dia[i + 1][j - 1]) && (dia[i][j] == dia[i + 2][j - 1])) return 0; else
if ((i < 6) && (j < 7) && (dia[i][j] == dia[i + 1][j + 1]) && (dia[i][j] == dia[i + 2][j + 1])) return 0; else
if ((j > 1) && (i > 0) && (dia[i][j] == dia[i - 1][j - 1]) && (dia[i][j] == dia[i - 1][j - 2])) return 0; else
if ((j > 1) && (i < 7) && (dia[i][j] == dia[i + 1][j - 1]) && (dia[i][j] == dia[i + 1][j - 2])) return 0; else
if ((j < 6) && (i > 0) && (dia[i][j] == dia[i - 1][j + 1]) && (dia[i][j] == dia[i - 1][j + 2])) return 0; else
if ((j < 6) && (i < 7) && (dia[i][j] == dia[i + 1][j + 1]) && (dia[i][j] == dia[i + 1][j + 2])) return 0;
return 1;
}
void diamond_flash(){
int i, j;
if (++flash.time < DIAMOND_FLASHTIME) return;
flash.time = 0;
mouse_putback();
flash.cur = (flash.cur + 1) % 4;
for (i = 22, j = 1; i > 0; i--, j++)
_fmemcpy(&video_buffer[(4 + flash.y * 24 + i) * SCREEN_WIDTH + 124 + flash.x * 24 + 1], &diamond[dia[7 - flash.y][flash.x]][flash.cur].buffer[j * 24 + 1], 22);
// BMP_Put(diamond[dia[7 - flash.y][flash.x]][flash.cur], 124 + flash.x * 24, 4 + flash.y * 24);
mouse_get();
mouse_getback();
mouse_showcur();
}
void diamond_unflash(){
int i, j;
mouse_putback();
for (i = 22, j = 1; i > 0; i--, j++)
_fmemcpy(&video_buffer[(4 + flash.y * 24 + i) * SCREEN_WIDTH + 124 + flash.x * 24 + 1], &diamond[dia[7 - flash.y][flash.x]][0].buffer[j * 24 + 1], 22);
// BMP_Put(diamond[dia[7 - flash.y][flash.x]][0], 124 + flash.x * 24, 4 + flash.y * 24);
mouse_get();
mouse_getback();
mouse_showcur();
}
void diamond_cur(){
diamond_x = (mouse_x - 124) / 24;
diamond_y = (mouse_y - 4) / 24;
}
void diamond_flashserver(){
if (on_diamonds()){
diamond_cur();
if ((flash.x == diamond_x) && (flash.y == diamond_y))
diamond_flash();
else
if ((flash.x == -1) && (flash.y == -1)){
flash.x = diamond_x;
flash.y = diamond_y;
flash.cur = 0;
flash.time = 0;
diamond_flash();
}
else{
diamond_unflash();
flash.x = diamond_x;
flash.y = diamond_y;
flash.cur = 0;
flash.time = 0;
diamond_flash();
}
}
else
if ((flash.x != -1) && (flash.y != -1)){
diamond_unflash();
flash.x = -1;
flash.y = -1;
flash.cur = 0;
flash.time = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -