📄 qkmj.c
字号:
open_deal(){ char msg_buf[255]; int i,j,sit; char card; turn=info.dealer; i=generate_random(4); pool[i%4+1].door_wind=1; pool[(i+1)%4+1].door_wind=2; pool[(i+2)%4+1].door_wind=3; pool[(i+3)%4+1].door_wind=4; sprintf(msg_buf,"518%c%c%c%c",pool[1].door_wind,pool[2].door_wind, pool[3].door_wind,pool[4].door_wind); broadcast_msg(1,msg_buf); wmvaddstr(stdscr,2,64,sit_name[pool[my_sit].door_wind]); if(!table[turn]) turn=next_turn(turn); card_owner=turn; sprintf(msg_buf,"310%c",turn); broadcast_msg(1,msg_buf); sprintf(msg_buf,"305%c",card_owner); broadcast_msg(1,msg_buf); display_point(turn); card_point=0; card_index=143; strcpy(msg_buf,"302"); generate_card(); /* send 16 cards to 4 people */ for(j=1;j<=4;j++) { if(table[j]) { pool[j].first_round=1; for(i=0;i<16;i++) { card=mj[card_point++]; pool[j].card[i]=card; msg_buf[3+i]=card; } sort_pool(j); msg_buf[3+16]='\0'; if(table[j]!=1) /* not server */ { write_msg(player[table[j]].sockfd,msg_buf); } else { sort_card(0); } } } /* send an additional card to dealer */ card=mj[card_point++]; current_card=card; sprintf(msg_buf,"304%c",card); if(table[turn]!=1) { show_newcard(turn,2); return_cursor(); write_msg(player[table[turn]].sockfd,msg_buf); pool[turn].card[pool[turn].num]=card; } if(table[turn]==1) /* turn==server */ { pool[1].card[pool[1].num]=card; show_card(pool[1].card[pool[my_sit].num],INDEX_X+16*2+1,pos_y+1,1); wrefresh(stdscr); return_cursor(); play_mode=THROW_CARD; } sprintf(msg_buf,"314%c%c",turn,2); broadcast_msg(table[turn],msg_buf); in_play=1; /* check for flowers for 4 players */ sit=turn; /* check dealer first */ do { } while(check_begin_flower(sit,pool[sit].card[16],16)); for(i=0;i<4;i++) { for(j=0;j<16;j++) { if(table[sit]) do { } while(check_begin_flower(sit,pool[sit].card[j],j)); } sort_pool(sit); sit=next_turn(sit); } current_card=pool[turn].card[16]; show_num(2,70,144-card_point-16,2); return_cursor(); sprintf(msg_buf,"306%c",card_point); broadcast_msg(1,msg_buf); clear_check_flag(turn); check_flag[turn][3]=check_kang(turn,current_card); check_flag[turn][4]=check_make(turn,current_card); in_check[turn]=0; for(i=1;i<check_number;i++) { if(check_flag[turn][i]) { getting_card=1; in_check[turn]=1; check_on=1; if(in_serv) { init_check_mode(); } else { sprintf(msg_buf,"501%c%c%c%c",'0','0',check_flag[turn][3]+'0', check_flag[turn][4]+'0'); write_msg(player[table[turn]].sockfd,msg_buf); } } }/* sprintf(msg_buf,"304%c",card); if(table[turn]!=1) { show_newcard(turn,2); return_cursor(); write_msg(player[table[turn]].sockfd,msg_buf); pool[turn].card[pool[turn].num]=card; }*/ broadcast_msg(table[turn],"3080"); if(turn!=my_sit) write_msg(player[table[turn]].sockfd,"3081"); if(turn==my_sit) sort_card(1); else sort_card(0); gettimeofday(&before, (struct timezone *) 0);}err(errmsg)char *errmsg;{ display_comment(errmsg);}init_variable(){ int i,j; my_name[0]=0; my_pass[0]=0; pass_login=0; set_beep=1; in_play=0; in_serv=0; in_join=0; in_kang=0; new_client=0; player_num=0; check_x=org_check_x; check_y=org_check_y; check_number=5; input_mode=ASK_MODE; info.wind=1; info.dealer=1; info.cont_dealer=0; info.base_value=DEFAULT_BASE; info.tai_value=DEFAULT_TAI; for(i=0;i<5;i++) { table[i]=0; } player[0].money=0; on_seat=0; check_on=0; send_card_on=0; send_card_request=0; next_player_on=0; global_win=newwin(1,63,org_talk_y,11); playing_win=newwin(1,43,org_talk_y,11); ask.question=1; h_head=0; h_tail=h_point=1; keypad(stdscr,TRUE); meta(stdscr,TRUE);}clear_variable(){ int i; for(i=2;i<MAX_PLAYER;i++) { if(player[i].in_table) player[i].in_table=0; } for(i=1;i<=4;i++) table[i]=0; player_in_table=0;}gps(){ int status; int i; int key; int msg_id; char msg_buf[255]; char buf[128]; char ans_buf[255]; init_global_screen(); input_mode=0; sprintf(msg_buf,"连往 QKMJ Server %s %d",GPS_IP,GPS_PORT); display_comment(msg_buf); status=init_socket(GPS_IP,GPS_PORT,&gps_sockfd); if(status<0) { err("无法连往 QKMJ Server"); endwin(); exit(0); } send_gps_line("连线顺利!"); sprintf(msg_buf,"QKMJ 休闲麻将 Ver %c.%2s Beta",QKMJ_VERSION[0],QKMJ_VERSION+1); display_comment(msg_buf); display_comment("可以用^C退出, 退格是del键"); get_my_info(); sprintf(msg_buf,"100%s",QKMJ_VERSION); write_msg(gps_sockfd,msg_buf); sprintf(msg_buf,"099%s",my_username); write_msg(gps_sockfd,msg_buf); pass_count=0; if(my_name[0]!=0 && my_pass[0]!=0) strcpy(ans_buf,my_name); else { strcpy(ans_buf,my_name); do { ask_question("请输入你的名字:",ans_buf,10,1); } while(ans_buf[0]==0); ans_buf[10]=0; } sprintf(msg_buf,"101%s",ans_buf); write_msg(gps_sockfd,msg_buf); strcpy(my_name,ans_buf); nfds=getdtablesize(); FD_ZERO(&afds); FD_SET(gps_sockfd,&afds); FD_SET(0,&afds); for(;;) { bcopy((char *) &afds,(char *) &rfds,sizeof(rfds)); if(select(nfds,&rfds,(fd_set *)0, (fd_set *)0, 0)<0) { if(errno!=EINTR) display_comment("Select Error!"); continue; } if(FD_ISSET(0,&rfds)) { if(input_mode) process_key(); } /* Check for data from GPS */ if(FD_ISSET(gps_sockfd,&rfds)) { if(!read_msg_id(gps_sockfd,buf)) { display_comment("Closed by QKMJ Server."); shutdown(gps_sockfd,2); if(in_join) close_join(); if(in_serv) close_serv(); endwin(); exit(0); } else { process_msg(0,buf,FROM_GPS); buf[0]='\0'; } } if(in_serv) { /* Check for new connections */ if(FD_ISSET(serv_sockfd,&rfds)) { if(new_client) { accept_new_client(); }/* else display_comment("Error from new client!");*/ } /* Check for data from client */ for(i=2;i<MAX_PLAYER;i++) { if(player[i].in_table) { if(FD_ISSET(player[i].sockfd,&rfds)) { if(read_msg_id(player[i].sockfd,buf)==0) close_client(i); else process_msg(i,buf,FROM_CLIENT); } } } /* Waiting for signals from each sit */ if(waiting) { for(i=1;i<=4;i++) { if(table[i] && !wait_hit[i]) goto continue_waiting; } waiting=0; broadcast_msg(1,"290"); opening(); open_deal(); } continue_waiting:; /* Process the cards */ if(check_on) { /* find if there are still player in check */ for(i=1;i<=4;i++) { if(table[i] && in_check[i]) goto still_in_check; } check_on=0; next_player_on=1; send_card_on=1; compare_check(); still_in_check:; } if(next_player_request && next_player_on) { if(144-card_point<=16) { for(i=1;i<=4;i++) { if(table[i] && i!=my_sit) { show_allcard(i); show_kang(i); } } info.cont_dealer++; send_pool_card(); broadcast_msg(1,"330"); clear_screen_area(THROW_Y,THROW_X,8,34); wmvaddstr(stdscr,THROW_Y+3,THROW_X+12,"海 底 流 局"); return_cursor(); wait_a_key(PRESS_ANY_KEY_TO_CONTINUE); broadcast_msg(1,"290"); opening(); open_deal(); } else { next_player(); next_player_request=0; } } if(send_card_request && send_card_on) { send_one_card(table[turn]); send_card_request=0; } } if(in_join) { if(FD_ISSET(table_sockfd,&rfds)) { if(!read_msg_id(table_sockfd,buf)) { close(table_sockfd); FD_CLR(table_sockfd,&afds); in_join=0; input_mode=TALK_MODE; init_global_screen(); } else process_msg(1,buf,FROM_SERV); } } }}read_qkmjrc(){ FILE *qkmjrc_fp; char msg_buf[256]; char msg_buf1[256]; char event[80]; char *str1; char rc_name[255]; sprintf(rc_name,"%s/%s",getenv("HOME"),QKMJRC); if((qkmjrc_fp=fopen(rc_name,"r"))!=NULL) { while(fgets(msg_buf,80,qkmjrc_fp)!=NULL) { Tokenize(msg_buf); strupr(event,cmd_argv[1]); if(strcmp(event,"LOGIN")==0) { if(narg>1) { cmd_argv[2][10]=0; strcpy(my_name,cmd_argv[2]); } } else if(strcmp(event,"PASSWORD")==0) { if(narg>1) { cmd_argv[2][8]=0; strcpy(my_pass,cmd_argv[2]); } } else if(strcmp(event,"SERVER")==0) { if(narg>1) { strcpy(GPS_IP,cmd_argv[2]); } if(narg>2) { GPS_PORT=atoi(cmd_argv[3]); } } else if(strcmp(event,"NOTE")==0) { if(narg>1) { str1=strtok(msg_buf," \n\t\r"); str1=strtok('\0',"\n\t\r"); strcpy(my_note,str1); } } else if(strcmp(event,"BEEP")==0) { if(narg>1) { if(strcmp(strupr(msg_buf1,cmd_argv[2]),"OFF")==0) { set_beep=0; } } } } fclose(qkmjrc_fp); }}main(argc, argv)int argc;char *argv[];{ setenv("TERM", "vt100", 1); initscr(); cbreak(); noecho(); nonl(); /* attrset(A_NORMAL); */ clear(); signal(SIGINT,leave); signal(SIGIOT,leave); signal(SIGPIPE,leave); init_variable(); strcpy(GPS_IP,DEFAULT_GPS_IP); GPS_PORT=DEFAULT_GPS_PORT; read_qkmjrc(); /*if(argc>=3) { strcpy(GPS_IP,argv[1]); GPS_PORT=atoi(argv[2]); } else if(argc==2) { strcpy(GPS_IP,argv[1]); GPS_PORT=DEFAULT_GPS_PORT; }*/ gps(); exit(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -