📄 fivec.c
字号:
display_rect.h=1; SDL_FillRect(screen, &display_rect, color_line); display_rect.x=x1;//下横线 display_rect.y=y2; display_rect.w=QIZI_SIZE; display_rect.h=1; SDL_FillRect(screen, &display_rect, color_line); display_rect.x=x1;//左竖线 display_rect.y=y1; display_rect.w=1; display_rect.h=QIZI_SIZE; SDL_FillRect(screen, &display_rect, color_line); display_rect.x=x2;//右竖线 display_rect.y=y1; display_rect.w=1; display_rect.h=QIZI_SIZE + 1; SDL_FillRect(screen, &display_rect, color_line); //更新显示区域 SDL_UpdateRect(screen, 0, 0, 0, 0);}///////////////////////////////////////////////////协议处理函数///////////////////////////////////////////////////提示用户已满p_2001(char * receive){ bzero(title, TITLE_LEN); strcat(title, "user overflow ! ! !"); SDL_WM_SetCaption(title,""); sleep(3); exit(0);}//提示用户游戏开始p_2002(char * receive){ char *temp1, *temp2; int i; //获取2002协议数据 protocol_num=(int *)receive; protocol_num=protocol_num+1; whoami=*protocol_num; protocol_num=protocol_num+1; currentuser=*protocol_num; protocol_num=protocol_num+1; if(whoami==USER1){ bcopy((char *)protocol_num, user_name[USER2], USER_NAME_LEN); temp2=user_name[USER1]; }else{ bcopy((char *)protocol_num, user_name[USER1], USER_NAME_LEN); temp2=user_name[USER2]; } //复制自己的用户名,不足规定长度的后边补空格 temp1=argv_name; i=0; while((i<USER_NAME_LEN) && !((*temp1)=='\0')){ *temp2=*temp1; temp1++; temp2++; i++; } while(i<USER_NAME_LEN) { *temp2=' '; temp2++; i++; } //标题显示游戏开始 user1name vs user2name bzero(title, TITLE_LEN); strcat(title, "game start ! "); strncat(title, user_name[USER1], USER_NAME_LEN); strcat(title, " vs "); strncat(title, user_name[USER2], USER_NAME_LEN); strcat(title, " - "); strncat(title, user_name[currentuser], USER_NAME_LEN); strcat(title, " first play !"); SDL_WM_SetCaption(title,""); memset(qipan, QIPAN_NULL, sizeof(int)*ROWCOL*ROWCOL);//初始化棋盘}//通知用户连接成功,等待另一个用户连接p_2003(char * receive){ //标题显示用户连接成功,等待另一个用户连接 bzero(title, TITLE_LEN); strcat(title, "you has link ok ! wait for another..."); SDL_WM_SetCaption(title,"");}//一个用户退出游戏,重设游戏变量,通知另一个用户等待新用户p_2004(char * receive){ //标题显示另一用户退出游戏,等待其他用户再次连接! bzero(title, TITLE_LEN); strcat(title, "rival exit game, please wait for another..."); SDL_WM_SetCaption(title,""); memset(qipan, QIPAN_NULL, sizeof(int)*ROWCOL*ROWCOL);//初始化棋盘}//通知用户本回合棋盘落子情况和获胜情况,若游戏结束,等待用户确认重新开始p_2005(char * receive){ int result, user_set; //获取2005协议数据 protocol_num=(int *)receive;//协议编号 protocol_num=protocol_num+1; user_set=*protocol_num;//当前落子用户 protocol_num=protocol_num+1; cursor_row=*protocol_num;//落子行号 protocol_num=protocol_num+1; cursor_col=*protocol_num;//落子列号 qipan[cursor_row][cursor_col]=user_set;//修改棋盘棋子 protocol_num=protocol_num+1; currentuser=*protocol_num;//本回合落子用户 protocol_num=protocol_num+1; result=*protocol_num;//获得游戏结果 //标题显示现在该谁落子了 bzero(title, TITLE_LEN); strncat(title, user_name[currentuser], USER_NAME_LEN); strcat(title, " please play !"); SDL_WM_SetCaption(title,""); if (result==USER1 || result==USER2 || result==2){ if(result==USER1 || result==USER2){ bzero(title, TITLE_LEN); strncat(title, user_name[result], USER_NAME_LEN); strcat(title, " win ! 'c':continue game, 'q': exit game"); SDL_WM_SetCaption(title,""); }else{ bzero(title, TITLE_LEN); strcat(title, "draw ! 'c':continue game, 'q': exit game"); SDL_WM_SetCaption(title,""); } }}//收到来自服务器的通知:用户游戏可以开始了p_2006(char * receive){ sleep(1); s_1004();//通知服务器游戏可以开始了}///////////////////////////////////////////服务器处理函数/////////////////////////////////////////////////////////注册用户姓名s_1001(){//本函数发送实际有用数据长度是:sizeof(int)+USER_NAME_LEN=9 char * temp1, * temp2; int i; protocol_num=(int *)c_buf_send; *protocol_num=REGIST_USER_NAME;//协议号码 sizeof(int) protocol_num=protocol_num+1; //复制用户名 temp2=(char *)protocol_num;//协议内容 USER_NAME_LEN temp1=argv_name; i=0; while((i<USER_NAME_LEN) && !((*temp1)=='\0')){ *temp2=*temp1; temp1++; temp2++; i++; } while(i<USER_NAME_LEN) { *temp2=' '; temp2++; i++; } //发送数据到服务器 write(c_sock, c_buf_send, PROTOCOLLEN); fsync(c_sock); bzero(title, TITLE_LEN); strcat(title, "you name is: "); strncat(title, (char *)protocol_num, USER_NAME_LEN); SDL_WM_SetCaption(title,"");}//设置棋子位置s_1002(int row, int col){//本函数发送实际有用数据长度是:sizeof(int)+sizeof(int)+sizeof(int)=12 protocol_num=(int *)c_buf_send; *protocol_num=SET_QIZI_POSITION;//协议号码sizeof(int) protocol_num=protocol_num+1; *protocol_num=row;//行号sizeof(int) protocol_num=protocol_num+1; *protocol_num=col;//列号sizeof(int) //发送数据到服务器 write(c_sock, c_buf_send, PROTOCOLLEN); fsync(c_sock);}//继续新一轮游戏s_1003(){//本函数发送实际有用数据长度是:sizeof(int)=4 protocol_num=(int *)c_buf_send; *protocol_num=GAME_CONTINUE;//协议号码sizeof(int) //发送数据到服务器 write(c_sock, c_buf_send, PROTOCOLLEN); fsync(c_sock);}//通知服务器游戏可以开始了s_1004(){//本函数发送实际有用数据长度是:sizeof(int)=4 protocol_num=(int *)c_buf_send; *protocol_num=NOTE_SERVER_START;//协议号码sizeof(int) //发送数据到服务器 write(c_sock, c_buf_send, PROTOCOLLEN); fsync(c_sock);}///////////////////////////////////////////////////////////////////////////////////////////////////////////////int main(int argc, char* argv[]){ //命令格式:五子棋客户端程序 服务器地址 用户名[最长是10个字符] if(argc!=3){ printf("error: command fromat is : clientcommand serverhost username[10]\n"); exit(1); } argv_name=argv[2];//保存用户名数组指针 c_init();//游戏变量初始化 c_update_screen();//屏幕显示棋盘 //创建socket并且连接到服务器 if((c_sock=socket(AF_INET,SOCK_STREAM,0))==-1){ printf("error: create socket !\n"); exit(1); } bzero(&c_addr_s, sizeof(c_addr_s)); c_addr_s.sin_family=AF_INET; c_addr_s.sin_port=htons(PORT); inet_pton(AF_INET,argv[1],&c_addr_s.sin_addr); if((connect(c_sock, (struct sockaddr*)&c_addr_s, sizeof(c_addr_s)))<0){ printf("error: connect\n"); exit(1); } s_1001();//注册用户名 fcntl(c_sock, F_SETFL, O_NONBLOCK);//非阻塞 while(1){ //接收来自服务器的数据包,解析后处理相应的协议函数 FD_ZERO(&c_set_in); FD_SET(c_sock, &c_set_in); timeout.tv_sec=0; timeout.tv_usec=100000;//select函数持续十分之一秒 if((select(c_sock+1, &c_set_in, NULL, NULL, &timeout))<0) printf("error: select !\n"); if(FD_ISSET(c_sock, &c_set_in)){ c_len=read(c_sock, c_buf_receive, MAXLEN) ; if(c_len<0){ printf("error: read from server !\n"); exit(1); } //客户端代理程序,解析数据包后处理相应的协议函数 temp=c_buf_receive; while(c_len>0){ c_delegate(temp); c_len=c_len - PROTOCOLLEN; temp=temp + PROTOCOLLEN; } c_update_screen();//更新屏幕显示 } //接收用户的键盘输入命令:移动落子,开始退出游戏 while(SDL_PollEvent(&c_event)){ switch(c_event.type){ case SDL_KEYDOWN: { flag_flash=0; if(c_event.key.keysym.sym==SDLK_UP) { if(cursor_row>0) cursor_row--; flag_flash=1; }//上 if(c_event.key.keysym.sym==SDLK_DOWN) { if(cursor_row<ROWCOL-1) cursor_row++; flag_flash=1; }//下 if(c_event.key.keysym.sym==SDLK_LEFT) { if(cursor_col>0) cursor_col--; flag_flash=1; }//左 if(c_event.key.keysym.sym==SDLK_RIGHT) { if(cursor_col<ROWCOL-1) cursor_col++; flag_flash=1; }//右 if(c_event.key.keysym.sym==SDLK_SPACE) { s_1002(cursor_row, cursor_col); flag_flash=1; }//落子 if(c_event.key.keysym.sym==SDLK_c) { s_1003(); flag_flash=1; }//继续游戏 if(c_event.key.keysym.sym==SDLK_q) exit(0);//退出 if(flag_flash==1) c_update_screen(); break; } } } } exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -