테트리스입니다.

허접한테트리스입니다.
#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);
}
}
질문과 답변란입니다. 성격이 안맞는 글인듯 하네요.
ㅡㅡ^
댓글 달기