⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fivec.c

📁 internet高级编程项目作业之网络五子棋_完整项目发布(文档+程序)20070102
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -