테트리스입니다.

익명 사용자의 이미지

허접한테트리스입니다.

#include
#include
#include
#define ATTACK_ONE 1
#define ATTACK_TWO 2

gint nx_one, ny_one, tx, ty, nowbl_one, nowrot_one, nowbcol_one;
gint nx_two, ny_two, nowbl_two, nowrot_two, nowbcol_two;
gint bk_gnd1[15][21];
gint bk_gnd2[15][21];
gint bk_att[13][4];
gint timer_one, timer_two;
gint score_one, score_two;
gint tetflag;
gint oneflag;
gint twoflag;
gint speed_one[8] = {800, 700, 600, 350, 150, 50, 10, 5};

/*- 블럭의 x 좌표(7종류 모양의 블럭이 각각 4가지 회전 형태를 가진다) -*/
gint block_x[28][7] = {{-10, 0, 10, 20},
{0, 0, 10, 10},
{0, 10, 20, 20},
{0, 0, 10, 20},
{0, 10, 10, 20},
{0, 10, 10, 20},
{0, 10, 10, 20},

{0, 0, 0, 0},
{0, 0, 10, 10},
{10, 20, 20, 20},
{0, 10, 10, 10},
{10, 20, 20, 20},
{10, 10, 20, 20},
{10, 10, 20, 20},

{-10, 0, 10, 20},
{0, 0, 10, 10},
{0, 0, 10, 20},
{0, 10, 20, 20},
{0, 10, 10, 20},
{0, 10, 10, 20},
{0, 10, 10, 20},

{0, 0, 0, 0},
{0, 0, 10, 10},
{10, 10, 10, 20},
{10, 10, 10, 20},
{10, 10, 10, 20},
{10, 10, 20, 20},
{10, 10, 20, 20}};

/*- 블럭의 y 좌표(7종류 모양의 블럭이 각각 4가지 회전 형태를 가진
다) -*/
gint block_y[28][7] = {{10, 10, 10, 10},
{0, 10, 0, 10},
{10, 10, 0, 10},
{0, 10, 10, 10},
{10, 0, 10, 10},
{0, 0, 10, 10},
{10, 0, 10, 0},

{-10, 0, 10, 20},
{0, 10, 0, 10},
{-10, -10, 0, 10},
{10, -10, 0, 10},
{0, -10, 0, 10},
{0, 10, -10, 0},
{-10, 0, 0, 10},

{10, 10, 10, 10},
{0, 10, 0, 10},
{0, 10, 0, 0},
{0, 0, 0, 10},
{0, 0, 10, 0},
{0, 0, 10, 10},
{10, 0, 10, 0},

{-10, 0, 10, 20},
{0, 10, 0, 10},
{-10, 0, 10, 10},
{-10, 10, 0, -10},
{-10, 0, 10, 0},
{0, 10, -10, 0},
{-10, 0, 0, 10}};

/* 0black, 1mentcream, 2orangered, 3navyblue
* 4lightgreen, 5yellow, 6lightpink */
GdkColormap *col_mp;
GdkPixmap *pix_m1, *pix_m2;
GdkColor color[7];
GtkWidget *wor_a1, *wor_a2;
GdkGC *tet_bl, *tet_br;

void program_quit(GtkButton *, gpointer);
void draw_bgleft(void);
void draw_bgright(void);
void cstetris(void);
void key_press(GtkWidget *, GdkEventKey *);
void key_press_two(GtkWidget *, GdkEventKey *);
void draw_block_one(gint);
gint down_move_one(void);
void game_loop(gint, gint);
void restore_bg(void); /*- 배경배열 초기화 -*/
void left_move_one(void);
void right_move_one(void);
void rotate_move_one(void);
void is_full_one(void);
void res_bg_one(void);
void res_bg_two(void);
void draw_block_two(gint, gint);
gint down_move_two(void);
void restore_bg_two(void); /*- 배경배열 초기화 -*/
void left_move_two(void);
void right_move_two(void);
void rotate_move_two(void);
void is_full_two(void);
void onetris(void);
void twotris(void);
void print_score(gint, gint);
void attack(gint,gint);
gint search_location_one();
gint search_location_two();

gint what_around_one(gint);
gint what_around_two(gint);

gboolean delete_handler(GtkWidget *, GdkEvent *, gpointer);
gboolean expose_handler(GtkWidget *, GdkEventExpose *, gpointer);

int main(int argc, char *argv[])
{
GtkWidget *top_wn, *ver_bx, *hor_bx, *mnu_br, *srt_bt,*frm_a1, *abt_lb;
GtkWidget *cnt_bt, *abu_bt, *ext_bt, *ent_wn, *frm_a2, *abt_dl, *abt_ok;

gtk_init(&argc, &argv);

col_mp = gdk_colormap_get_system();


/*-------------------------------------------------------*/
gdk_color_parse("Black", &color[0]);
gdk_color_parse("MintCream", &color[1]);
gdk_color_parse("OrangeRed", &color[2]);
gdk_color_parse("Violet", &color[3]);
gdk_color_parse("Green", &color[4]);
gdk_color_parse("Yellow", &color[5]);
gdk_color_parse("LightPink", &color[6]);

/*------------------------------------------------------*/

top_wn = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_policy(GTK_WINDOW(top_wn), FALSE, FALSE, TRUE);
gtk_window_set_title(GTK_WINDOW(top_wn), "Battle tetris");
gtk_signal_connect(GTK_OBJECT(top_wn), "delete-event",
GTK_SIGNAL_FUNC(delete_handler), NULL);

ver_bx = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(ver_bx), 5);
gtk_container_add(GTK_CONTAINER(top_wn), ver_bx);

mnu_br = gtk_menu_bar_new();
gtk_box_pack_start(GTK_BOX(ver_bx), mnu_br, FALSE, FALSE, 0);

hor_bx = gtk_hbox_new(FALSE, 5);
gtk_container_set_border_width(GTK_CONTAINER(hor_bx), 5);
gtk_container_add(GTK_CONTAINER(ver_bx), hor_bx);

srt_bt = gtk_menu_item_new_with_label("one_player");
gtk_menu_bar_append(GTK_MENU_BAR(mnu_br), srt_bt);
gtk_signal_connect(GTK_OBJECT(srt_bt), "activate", onetris, NULL);

cnt_bt = gtk_menu_item_new_with_label("two_player");
gtk_menu_bar_append(GTK_MENU_BAR(mnu_br), cnt_bt);
gtk_signal_connect(GTK_OBJECT(cnt_bt), "activate",twotris, NULL);

abu_bt = gtk_menu_item_new_with_label("About");
gtk_menu_bar_append(GTK_MENU_BAR(mnu_br), abu_bt);

ext_bt = gtk_menu_item_new_with_label(" Exit");
gtk_menu_bar_append(GTK_MENU_BAR(mnu_br), ext_bt);
gtk_menu_item_right_justify(GTK_MENU_ITEM(ext_bt));
gtk_signal_connect(GTK_OBJECT(ext_bt), "activate",program_quit, NULL);


frm_a1 = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frm_a1), GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(hor_bx), frm_a1, FALSE, FALSE, 1);

frm_a2 = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frm_a2), GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(hor_bx), frm_a2, FALSE, FALSE, 1);


wor_a1 = gtk_drawing_area_new();
gtk_drawing_area_size(GTK_DRAWING_AREA(wor_a1), 148, 220);
gtk_container_add(GTK_CONTAINER(frm_a1), wor_a1);

wor_a2 = gtk_drawing_area_new();
gtk_drawing_area_size(GTK_DRAWING_AREA(wor_a2), 148, 220);
gtk_container_add(GTK_CONTAINER(frm_a2), wor_a2);

abt_dl = gtk_dialog_new();
abt_lb = gtk_label_new("This is a battle Tetris.\n"
"\nOneplayer's key \n"
" S(s), Z(z), X(x), C(c)\n"
"\nTwoplayer's key \n"
" Up, Left, Right, Down\n"
" \n"
" BattleTetris ver 1.0 ");
abt_ok = gtk_button_new_with_label("OK");

gtk_box_pack_start(GTK_BOX(GTK_DIALOG(abt_dl)->vbox), abt_lb,
FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(abt_dl)->action_area), abt_ok,
FALSE, FALSE, 0);
gtk_widget_show(abt_lb);
gtk_widget_show(abt_ok);

gtk_signal_connect(GTK_OBJECT(wor_a1), "expose_event",
(GtkSignalFunc)expose_handler, NULL);
gtk_signal_connect(GTK_OBJECT(wor_a2), "expose_event",
(GtkSignalFunc)expose_handler, NULL);
gtk_signal_connect(GTK_OBJECT(top_wn), "key_press_event",
(GtkSignalFunc)key_press, NULL);
gtk_signal_connect_object(GTK_OBJECT(abu_bt), "activate",
(GtkSignalFunc)gtk_widget_show, GTK_OBJECT(abt_dl));
gtk_signal_connect_object(GTK_OBJECT(abt_ok), "clicked",
(GtkSignalFunc)gtk_widget_hide, GTK_OBJECT(abt_dl));

gtk_widget_show_all(top_wn);

gtk_main();
return 0;
}


void onetris(void)
{
tetflag = 0; score_one = 0;
if(timer_one) gtk_timeout_remove(timer_one);
if(timer_two) gtk_timeout_remove(timer_two);
cstetris();
}

void twotris(void)
{
tetflag = 1; score_one = 0; score_two = 0;
oneflag = 0; twoflag = 0;
if(timer_one) gtk_timeout_remove(timer_one);
if(timer_two) gtk_timeout_remove(timer_two);
cstetris();
}

void program_quit(GtkButton *clik, gpointer data)
{
g_free(pix_m1); g_free(pix_m2); g_free(wor_a1);
g_free(wor_a2); g_free(tet_bl);

gtk_main_quit();
}

gboolean delete_handler(GtkWidget *wigt, GdkEvent *evnt, gpointer data)
{
return FALSE;
}

gboolean expose_handler(GtkWidget *widget, GdkEventExpose *event, gpointer
data)
{
GdkGC *tmp_gc = gdk_gc_new(widget->window);
GdkPixmap *pix_tm = gtk_object_get_data(GTK_OBJECT(widget), "pixmap");

if(pix_tm)
gdk_draw_pixmap(widget->window, tmp_gc, pix_tm, event->area.x,
event->area.y,event->area.x, event->area.y,
event->area.width, event->area.height);
return TRUE;
}

void key_press(GtkWidget *widget, GdkEventKey *event)
{
switch(event->keyval)
{
case GDK_Z
case GDK_z
left_move_one();
break;

case GDK_C
case GDK_c
right_move_one();
break;

case GDK_S
case GDK_s
rotate_move_one();
break;

case GDK_X
case GDK_x
while(down_move_one());
break;

default
break;
}

if(tetflag == 1)
{
switch(event->keyval)
{
case GDK_Left
left_move_two();
break;

case GDK_Right
right_move_two();
break;

case GDK_Up
rotate_move_two();
break;

case GDK_Down
while(down_move_two());
break;

default
break;
}
}
}

void cstetris()
{
gint i = 0, j = 0;
ny_one = 0;
tx= 60, ty = 10;

restore_bg();

tet_bl = gdk_gc_new(wor_a1->window);
pix_m1 = gdk_pixmap_new(wor_a1->window, 150, 220, -1);
draw_bgleft();

if(tetflag == 1)
{
tet_br = gdk_gc_new(wor_a2->window);
pix_m2 = gdk_pixmap_new(wor_a2->window, 150, 220, -1);
draw_bgright();
gtk_object_set_data(GTK_OBJECT(wor_a2), "pixmap", pix_m2);
}

gtk_object_set_data(GTK_OBJECT(wor_a1), "pixmap", pix_m1);

game_loop(1, 1);


return;
}

void draw_bgleft()
{
gint k;


/*---------------------------------------------------------
-------*/
gdk_colormap_alloc_color(col_mp,
&wor_a1->style->bg[GTK_STATE_NORMAL], FALSE, TRUE);
gdk_gc_set_foreground(tet_bl ,
&wor_a1->style->bg[GTK_STATE_NORMAL]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, 0, 0, 148, 220);

/*---------------------------------------------------------
-------*/

/*색이 지정된 도형 벽(left)--------------------------------
-------*/
gdk_colormap_alloc_color(col_mp, &color[5], FALSE, TRUE);
gdk_gc_set_foreground(tet_bl, &color[5]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, 4, 4, 141, 201);

/*---------------------------------------------------------
-------*/

/*색이 지정된 도형 배경(left)------------------------------
-------*/
gdk_colormap_alloc_color(col_mp, &color[0], FALSE, TRUE);
gdk_gc_set_foreground(tet_bl, &color[0]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, 9, 9, 131,191 );

/*---------------------------------------------------------
-------*/
}

void draw_bgright()
{
tet_br = gdk_gc_new(wor_a2->window);


/*---------------------------------------------------------
-------*/
gdk_colormap_alloc_color(col_mp,
&wor_a2->style->bg[GTK_STATE_NORMAL], FALSE, TRUE);
gdk_gc_set_foreground(tet_br ,
&wor_a2->style->bg[GTK_STATE_NORMAL]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, 0, 0, 148, 220);

/*---------------------------------------------------------
-------*/

/*색이 지정된 도형 벽(left)--------------------------------
-------*/
gdk_colormap_alloc_color(col_mp, &color[6], FALSE, TRUE);
gdk_gc_set_foreground(tet_br, &color[6]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, 4, 4, 141, 201);

/*---------------------------------------------------------
-------*/

/*색이 지정된 도형 배경(left)------------------------------
-------*/
gdk_colormap_alloc_color(col_mp, &color[0], FALSE, TRUE);
gdk_gc_set_foreground(tet_br, &color[0]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, 9, 9, 131, 191);

/*---------------------------------------------------------
-------*/
}

void game_loop(gint kkk, gint mmm)
{
if(kkk == 1)
{
nx_one = ny_one = 0;
srandom(time(NULL));
nowbl_one = random()%7;
nowbcol_one = random()%4+1;
nowrot_one = 0;
draw_block_one(1);

if(what_around_one(4) != 0)
{
oneflag = 1;

if(oneflag == 1 && twoflag == 1 && score_one < score_two)
{
gdk_colormap_alloc_color(col_mp, &color[0], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br , &color[0]);
gdk_draw_string(pix_m2, wor_a2->style->font, tet_br, 100,
217, "WIN");
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0,
0, 0, 150, 220);
}

if(twoflag == 1 && oneflag == 1 && score_one > score_two)
{
gdk_colormap_alloc_color(col_mp, &color[0], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl , &color[0]);
gdk_draw_string(pix_m1, wor_a1->style->font, tet_bl, 100,
217, "WIN");
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0,
0, 0, 150, 220);
}

return;
}
timer_one = gtk_timeout_add(speed_one[score_one/100],
(GtkFunction)down_move_one, NULL);

}

if(tetflag == 1 && mmm == 1)
{
nx_two = ny_two = 0;
srandom(time(NULL));
nowbl_two = random()%7;
nowbcol_two = random()%4+1;
nowrot_two = 0;
draw_block_two(1, nowbcol_two);

if(what_around_two(4) != 0)
{
twoflag = 1;

if(oneflag == 1 && twoflag == 1 && score_one < score_two)
{
gdk_colormap_alloc_color(col_mp, &color[0], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br , &color[0]);
gdk_draw_string(pix_m2, wor_a2->style->font, tet_br, 100,
217, "WIN");
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0,
0, 0, 150, 220);
}

if(twoflag == 1 && oneflag == 1 && score_one > score_two)
{
gdk_colormap_alloc_color(col_mp, &color[0], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl , &color[0]);
gdk_draw_string(pix_m1, wor_a1->style->font, tet_bl, 100,
217, "WIN");
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0,
0, 0, 150, 220);
}

return;
}

timer_two = gtk_timeout_add(speed_one[score_two/100],
(GtkFunction)down_move_two, NULL);
}
}

void draw_block_one(gint flag)
{
gint tmp;
gint i;

if(flag == 0)
{
gdk_colormap_alloc_color(col_mp, color, FALSE, TRUE);
gdk_gc_set_foreground(tet_bl, color);
}

if(flag == 1)
{
gdk_colormap_alloc_color(col_mp, &color[nowbcol_one], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl, &color[nowbcol_one]);
}

for(i=0; i < 4; i++)
{
if(ty + ny_one + block_y[nowbl_one+nowrot_one][i] <= 0) tmp = 10;
else tmp = 0;
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, tx + nx_one +
block_x[nowbl_one+nowrot_one][i], ty
+ ny_one + tmp + block_y[nowbl_one+nowrot_one][i], 9, 9);
}

gtk_object_set_data(GTK_OBJECT(wor_a1), "pixmap", pix_m1);
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0, 0, 0, 150, 220);
}

void draw_block_two(gint flag, gint bcol)
{
gint tmp;
gint i;

if(flag == 0)
{
gdk_colormap_alloc_color(col_mp, color, FALSE, TRUE);
gdk_gc_set_foreground(tet_br, color);
}

if(flag == 1)
{
gdk_colormap_alloc_color(col_mp, &color[nowbcol_two], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br, &color[nowbcol_two]);
}

for(i=0; i < 4; i++)
{
if(ty + ny_two + block_y[nowbl_two+nowrot_two][i] <= 0) tmp = 10;
else tmp = 0;
gdk_draw_rectangle(pix_m2, tet_br, TRUE, tx + nx_two +
block_x[nowbl_two+nowrot_two][i], ty
+ ny_two + tmp + block_y[nowbl_two+nowrot_two][i], 9,
9);

}

gtk_object_set_data(GTK_OBJECT(wor_a2), "pixmap", pix_m2);
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0, 0, 0, 150, 220);
}

gint down_move_one()
{
gint i;

if(what_around_one(0) != 0)
{
is_full_one();
gtk_timeout_remove(timer_one);
game_loop(1, 0);
return 0;
}

else
{
draw_block_one(0);
ny_one += 10;
draw_block_one(1);
return 1;
}
}

gint down_move_two()
{
gint i;

if(what_around_two(0) != 0)
{
is_full_two();
gtk_timeout_remove(timer_two);
game_loop(0, 1);
return 0;
}

else
{
draw_block_two(0, nowbcol_two);
ny_two += 10;
draw_block_two(1, nowbcol_two);
return 1;
}
}

void left_move_one()
{
if(what_around_one(1) != 0) /*- 1 left 키 -*/
return; /*- 움직일 수 없으면 아무것도 실행하지 않음 -*/
draw_block_one(0); /*- 움직일 수 있으면 현재 블럭을 지우고나서 -*/
nx_one -= 10; /*- x 좌표에 10 감해준 후(한칸 왼쪽으로
이동) -*/
draw_block_one(1); /*- 블럭을 새로 그려준다 -*/
}

void left_move_two()
{
if(what_around_two(1) != 0) /*- 1 left 키 -*/
return; /*- 움직일 수 없으면 아무것도 실행하지 않음 -*/
draw_block_two(0, nowbcol_two); /*- 움직일 수 있으면 현재 블럭을
지우고나서 -*/
nx_two -= 10; /*- x 좌표에 10 감해준 후(한칸 왼쪽으로
이동) -*/
draw_block_two(1, nowbcol_two); /*- 블럭을 새로 그려준다 -*/
}

void right_move_one()
{
if(what_around_one(2) != 0) /*- 2 right 키 -*/
return; /*- 움직일 수 없으면 아무것도 실행하지 않음 -*/
draw_block_one(0); /*- 움직일 수 있으면 현재 블럭을 지우고나서 -*/
nx_one += 10; /*- x 좌표에 10 더해준 후(한칸 오른쪽으로
이동) -*/
draw_block_one(1); /*- 블럭을 새로 그려준다 -*/
}

void right_move_two()
{
if(what_around_two(2) != 0) /*- 2 right 키 -*/
return; /*- 움직일 수 없으면 아무것도 실행하지 않음 -*/
draw_block_two(0, nowbcol_two); /*- 움직일 수 있으면 현재 블럭을
지우고나서 -*/
nx_two += 10; /*- x 좌표에 10 더해준 후(한칸 오른쪽으로
이동) -*/
draw_block_two(1, nowbcol_two); /*- 블럭을 새로 그려준다 -*/
}

void rotate_move_one()
{
if(what_around_one(3) == 0) /*-3 left 키 */
{
draw_block_one(0);
/*- 움직일 수 있으면 현재 블럭을 지우고나서 -*/
nowrot_one = (nowrot_one + 7) % 28;
/*- 다음번의 블럭회전형태 저장 -*/
draw_block_one(1);
/*- 블럭을 새로 그려준다 -*/
}
return;
}

void rotate_move_two()
{
if(what_around_two(3) == 0) /*-3 left 키 */
{
draw_block_two(0, nowbcol_one);
/*- 움직일 수 있으면 현재 블럭을 지우고나서 -*/
nowrot_two = (nowrot_two + 7) % 28;
/*- 다음번의 블럭회전형태 저장 -*/
draw_block_two(1, nowbcol_two);
/*- 블럭을 새로 그려준다 -*/
}
return;
}

gint what_around_one(gint x) /*- 배경을 저장한 배열에서 블럭이 움직일 곳을 검사
-*/
{ /*- 검사값(리턴값)이 0(검정색)이면 움직일 수
있음 -*/
gint i, c, re = 0;

/*- block_x[nowbrick+nowrot_one][i]+nx_one 블럭의 현재위치 x 좌표 -*/
/*- block_y[nowbrick+nowrot_one][i]+ny_one 블럭의 현재위치 y 좌표 -*/
switch(x)
{
case 0
for(i = 0; i < 4; i++)
/*- down인 경우 한칸 아래 검사 -*/
if((c =
bk_gnd1[(block_x[nowbl_one+nowrot_one][i]+tx+nx_one)/10][(block_y[nowbl_one+nowrot_one][i]+ty+ny_one)/10
+ 1]) > 0) re = c;
break;

case 1
for(i = 0; i < 4; i++)
/*- left인 경우 한칸 왼쪽 검사 -*/
if((c =
bk_gnd1[(block_x[nowbl_one+nowrot_one][i]+tx+nx_one)/10 -
1][(block_y[nowbl_one+nowrot_one][i]+ty+ny_one)/10]) > 0) re = c;
break;

case 2
for(i = 0; i < 4; i++)
/*- right인 경우 한칸 오른쪽 검사 -*/
if((c =
bk_gnd1[(block_x[nowbl_one+nowrot_one][i]+tx+nx_one)/10 +
1][(block_y[nowbl_one+nowrot_one][i]+ty+ny_one)/10]) > 0) re = c;
break;

case 3
for(i = 0; i < 4; i++)
/*- rotate인 경우 회전 후 좌표 검사 -*/
if((c =
bk_gnd1[(block_x[nowbl_one+((nowrot_one+7)%28)][i]+tx+nx_one)/10][(block_y[nowbl_one+((nowrot_one+7)%28)][i]+ty+ny_one)/10])
> 0) re = c;
break;

case 4
for(i = 0; i < 4; i++)
/*- 현재 위치 검사(종료여부 판별) -*/
if((c =
bk_gnd1[(block_x[nowbl_one+nowrot_one][i]+tx+nx_one)/10][(block_y[nowbl_one+nowrot_one][i]+ty+ny_one)/10])
> 0) re = c;
break;
}
return re; /*- 리턴값이 0이면 움직임이 가능함을 뜻함 -*/
}

gint what_around_two(gint x) /*- 배경을 저장한 배열에서 블럭이 움직
일 곳을 검사 -*/
{ /*- 검사값(리턴값)이 0(검정색)이면 움직일 수
있음 -*/
gint i, c, re = 0;

/*- block_x[nowbrick+nowrot_one][i]+nx_one 블럭의 현재위치 x 좌표 -*/

/*- block_y[nowbrick+nowrot_one][i]+ny_one 블럭의 현재위치 y 좌표 -*/
switch(x)
{
case 0
for(i = 0; i < 4; i++)
/*- down인 경우 한칸 아래 검사 -*/
if((c =
bk_gnd2[(block_x[nowbl_two+nowrot_two][i]+tx+nx_two)/10][(block_y[nowbl_two+nowrot_two][i]+ty+ny_two)/10
+ 1]) > 0) re = c;
break;

case 1
for(i = 0; i < 4; i++)
/*- left인 경우 한칸 왼쪽 검사 -*/
if((c = bk_gnd2[(block_x[nowbl_two+nowrot_two][i]+tx+nx_two)/10
- 1][(block_y[nowbl_two+nowrot_two][i]+ty+ny_two)/10]) > 0) re = c;
break;

case 2
for(i = 0; i < 4; i++)
/*- right인 경우 한칸 오른쪽 검사 -*/
if((c = bk_gnd2[(block_x[nowbl_two+nowrot_two][i]+tx+nx_two)/10
+ 1][(block_y[nowbl_two+nowrot_two][i]+ty+ny_two)/10]) > 0) re = c;
break;

case 3
for(i = 0; i < 4; i++)
/*- rotate인 경우 회전 후 좌표 검사 -*/
if((c =
bk_gnd2[(block_x[nowbl_two+((nowrot_two+7)%28)][i]+tx+nx_two)/10][(block_y[nowbl_two+((nowrot_two+7)%28)][i]+ty+ny_two)/10])
> 0) re = c;
break;

case 4
for(i = 0; i < 4; i++)
/*- 현재 위치 검사(종료여부 판별) -*/
if((c =
bk_gnd2[(block_x[nowbl_two+nowrot_two][i]+tx+nx_two)/10][(block_y[nowbl_two+nowrot_two][i]+ty+ny_two)/10])
> 0) re = c;
break;
}
return re; /*- 리턴값이 0이면 움직임이 가능함을 뜻함 -*/
}

gint search_location_one(){

gint i,j;

for(i=0;i<=19;i++){
for(j=1;j<=13;j++) {

if(bk_gnd1[j][i]>=1 && bk_gnd1[j][i]<=4 ) {

return i;

}

}

}

}

gint search_location_two(){

gint i,j;

for(i=0;i<=19;i++){
for(j=1;j<=13;j++) {

if(bk_gnd2[j][i]>=1 && bk_gnd2[j][i]<=4 ) {

return i;

}

}

}

}

void is_full_one() /*- 가로줄의 완성 여부와 그에 따른 처리 -*/
{
gint check1, check2, i, j, k,a,b;

//res_bg_one();

i=search_location_one();

if(i==17) {

for(b=0;b<4;b++,i++)
for(a=0,j=1;a<13;a++,j++) {

bk_att[a][b]=bk_gnd1[j][i];
printf("[%d %d=%d]",a,b,bk_att[a][b]);
}

} else if(i<17) {

for(b=0;b<4;b++,i++)
for(a=0,j=1;a<13;a++,j++) {

bk_att[a][b]=bk_gnd1[j][i];
printf("[%d %d=%d]",a,b,bk_att[a][b]);

}

}

res_bg_one();

if(oneflag == 0)
{
score_one += 2;
print_score(score_one, 1);
}

check2 = 0;

for(i = 19 ; i >= 0; i--)
{
check1 = 0;

for(j = 1 ; j <= 13 ; j++)
{
if(bk_gnd1[j][i] == 0)
check1 = 1; /*- 가로줄상에 검정색이 있으면 -*/
}

if(check1 == 0) /*- 검정색이 없는경우(블럭으로 꽉 찬 경우) -*/
{
score_one += 10;

++check2;

for(k = i-1 ; k > 0 ; k--)
for(j = 1 ; j <= 13 ; j++)
{
bk_gnd1[j][k+1] = bk_gnd1[j][k];
}
i++;

if(check2>2) attack(check2,ATTACK_ONE);

}

}

print_score(score_one, 1);

if(check2 == 0) return;

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd1[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl, &color[bk_gnd1[j][i]]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, j*10, i*10, 9, 9);

//if(bk_gnd1[j][i]>=1 && bk_gnd1[j][i]<=4) {
//}
}

gtk_object_set_data(GTK_OBJECT(wor_a1), "pixmap", pix_m1);
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0, 0, 0, 150, 220);
}

void is_full_two() /*- 가로줄의 완성 여부와 그에 따른 처리 -*/
{
gint check1, check2, i, j, k,a,b;

i=search_location_two();

if(i==17) {

for(b=0;b<4;b++,i++)
for(a=0,j=1;a<13;a++,j++) {

bk_att[a][b]=bk_gnd2[j][i];
printf("[%d %d=%d]",a,b,bk_att[a][b]);
}

} else if(i<17) {

for(b=0;b<4;b++,i++)
for(a=0,j=1;a<13;a++,j++) {

bk_att[a][b]=bk_gnd2[j][i];
printf("[%d %d=%d]",a,b,bk_att[a][b]);

}

}

res_bg_two();

if(twoflag == 0)
{
score_two += 2;
print_score(score_two, 2);
}

check2 = 0;

for(i = 19 ; i >= 0; i--)
{
check1 = 0;

for(j = 1 ; j <= 13 ; j++)
{
if(bk_gnd2[j][i] == 0)
check1 = 1; /*- 가로줄상에 검정색이 있으면 -*/
}

if(check1 == 0) /*- 검정색이 없는경우(블럭으로 꽉 찬 경우) -*/
{
score_two += 10;

++check2;

for(k = i-1 ; k > 0 ; k--)
for(j = 1 ; j <= 13 ; j++)
{
bk_gnd2[j][k+1] = bk_gnd2[j][k];
}
i++;

if(check2>2) attack(check2,ATTACK_TWO);
}

}

print_score(score_two, 2);

if(check2 == 0) return;

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd2[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br, &color[bk_gnd2[j][i]]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, j*10, i*10, 9, 9);
}

gtk_object_set_data(GTK_OBJECT(wor_a2), "pixmap", pix_m2);
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0, 0, 0, 150, 220);
}

void attack(gint check2,gint att) {

gint i,j,a,b;

if(att==ATTACK_ONE) {

i=search_location_one();

if(check2==3) {

for(;i<=19;i++)
for(j=1;j<=13;j++)
bk_gnd2[j][i-3]=bk_gnd2[j][i];
for(i=17,a=0;i<=19;i++,a++)
for(j=1,b=0;j<=13;j++,b++)
bk_gnd2[j][i]=bk_att[a][b];

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd2[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br, &color[bk_gnd2[j][i]]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, j*10, i*10, 9, 9);
}

gtk_object_set_data(GTK_OBJECT(wor_a2), "pixmap", pix_m2);
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0, 0, 0, 150, 220);

} else if(check2==4) {

for(;i<=19;i++)
for(j=1;j<=13;j++)
bk_gnd2[j][i-4]=bk_gnd2[j][i];
for(i=17,a=0;i<=19;i++,a++)
for(j=1,b=0;j<=13;j++,b++)
bk_gnd2[j][i]=bk_att[a][b];

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd2[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_br, &color[bk_gnd2[j][i]]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, j*10, i*10, 9, 9);
}

gtk_object_set_data(GTK_OBJECT(wor_a2), "pixmap", pix_m2);
gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0, 0, 0, 150, 220);

}

} else if(att=ATTACK_TWO) {

i=search_location_two();

if(check2==3) {

for(;i<=19;i++)
for(j=1;j<=13;j++)
bk_gnd1[j][i-3]=bk_gnd1[j][i];
for(i=17,a=0;i<=19;i++,a++)
for(j=1,b=0;j<=13;j++,b++)
bk_gnd1[j][i]=bk_att[a][b];

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd1[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl, &color[bk_gnd1[j][i]]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, j*10, i*10, 9, 9);

//if(bk_gnd1[j][i]>=1 && bk_gnd1[j][i]<=4) {
//}
}

gtk_object_set_data(GTK_OBJECT(wor_a1), "pixmap", pix_m1);
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0, 0, 0, 150, 220);

} else if(check2==4) {

for(;i<=19;i++)
for(j=1;j<=13;j++)
bk_gnd1[j][i-4]=bk_gnd1[j][i];
for(i=17,a=0;i<=19;i++,a++)
for(j=1,b=0;j<=13;j++,b++)
bk_gnd1[j][i]=bk_att[a][b];

for(i = 1; i <= 19; i++)
for(j = 1; j <=13; j++)
{
gdk_colormap_alloc_color(col_mp, &color[bk_gnd1[j][i]], FALSE,
TRUE);
gdk_gc_set_foreground(tet_bl, &color[bk_gnd1[j][i]]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, j*10, i*10, 9, 9);

//if(bk_gnd1[j][i]>=1 && bk_gnd1[j][i]<=4) {
//}
}

gtk_object_set_data(GTK_OBJECT(wor_a1), "pixmap", pix_m1);
gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0, 0, 0, 150, 220);

}

}

}

//void score_left() /*- 점수 출력 -*/
//{
// gdk_draw_string(pix_m1, wor_a1->style->font, tet_bl, 10,215, );
//}

void restore_bg() /*- 배경배열 초기화 -*/
{
gint i, j;
for(i = 0; i < 15; i++)
for(j = 0; j < 21; j++)
{
if(i == 0 || i == 14 || j == 20)
bk_gnd1[i][j] = 5;
else
bk_gnd1[i][j] = 0;

}

if(tetflag == 1)
{
for(i = 0; i < 15; i++)
for(j = 0; j < 21; j++)
{
if(i == 0 || i == 14 || j == 20)
bk_gnd2[i][j] = 6;
else
bk_gnd2[i][j] = 0;
}
}
}

void res_bg_one() /*- 배경배열 갱신 -*/
{
gint i;
for(i = 0; i < 4; i++)
{
bk_gnd1[(block_x[nowbl_one+nowrot_one][i]+tx+nx_one)/10]
[(block_y[nowbl_one+nowrot_one][i]+ty+ny_one)/10] =
nowbcol_one;
}

}

void res_bg_two() /*- 배경배열 갱신 -*/
{
gint i;
for(i = 0; i < 4; i++)
{
bk_gnd2[(block_x[nowbl_two+nowrot_two][i]
+tx+nx_two)/10]
[(block_y[nowbl_two+nowrot_two][i]
+ty+ny_two)/10] = nowbcol_two;
}
}

void print_score(gint sco, gint who)
{
char tmpsco[10];
gint i = 0, c, j;

do{
tmpsco[i++] = sco % 10 + '0';
}while((sco /= 10) > 0);

tmpsco[i] = '\0';

for(i = 0, j = strlen(tmpsco) - 1; i < j; i++, j--)
{
c = tmpsco[i];
tmpsco[i] = tmpsco[j];
tmpsco[j] = c;
}

if(who == 1)
{
gdk_colormap_alloc_color(col_mp,
&wor_a1->style->bg[GTK_STATE_NORMAL], FALSE, TRUE);
gdk_gc_set_foreground(tet_bl ,
&wor_a1->style->bg[GTK_STATE_NORMAL]);
gdk_draw_rectangle(pix_m1, tet_bl, TRUE, 40, 208, 50, 12);

gdk_colormap_alloc_color(col_mp, &color[0], FALSE, TRUE);
gdk_gc_set_foreground(tet_bl, &color[0]);
gdk_draw_string(pix_m1, wor_a1->style->font, tet_bl, 50, 217, tmpsco);

gdk_draw_pixmap(wor_a1->window, tet_bl, pix_m1, 0, 0, 0, 0, 150,
220);
}

if(who == 2)
{
gdk_colormap_alloc_color(col_mp,
&wor_a1->style->bg[GTK_STATE_NORMAL], FALSE, TRUE);
gdk_gc_set_foreground(tet_br ,
&wor_a2->style->bg[GTK_STATE_NORMAL]);
gdk_draw_rectangle(pix_m2, tet_br, TRUE, 40, 208, 50, 12);

gdk_colormap_alloc_color(col_mp, &color[0], FALSE, TRUE);
gdk_gc_set_foreground(tet_br, &color[0]);
gdk_draw_string(pix_m2, wor_a2->style->font, tet_br, 50, 217, tmpsco);

gdk_draw_pixmap(wor_a2->window, tet_br, pix_m2, 0, 0, 0, 0, 150,
220);
}
}

익명 사용자의 이미지

ㅡㅡ^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.