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

📄 fivec.c

📁 internet高级编程项目作业之网络五子棋_完整项目发布(文档+程序)20070102
💻 C
📖 第 1 页 / 共 2 页
字号:
//gcc fivec.c -l SDL -o fivec#include <fcntl.h>#include <netinet/in.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/select.h>#include <sys/types.h>#include <SDL/SDL.h>/////////////////////////////////////#define MAXLEN 1024#define PROTOCOLLEN 24            //协议数据包固定常度(待所有协议确定长度后选定一个最长的,目前最长数据包是24)#define BACKLOG 3#define PORT 55555                //五子棋游戏服务器程序端口#define ROWCOL 20                 //棋盘行列数量,每个棋子所占空格空间,屏幕宽度,屏幕高度-这四个常量定义有关系                                 //棋子放在横竖线的焦点上#define USER1 0                   //用户1编号#define USER2 1                   //用户2编号#define USER_NAME_LEN 5          //用户名字符串长度#define QIPAN_NULL 'N'             //棋盘空位#define QIZI_SIZE 20              //每个棋子所占空格空间#define COLOR_BG  255,255,128      //棋盘背景颜色-黄色#define COLOR_LINE  0,0,0          //棋盘划线颜色-黑色#define COLOR_USER1 255,0,0        //用户1棋子颜色-红色#define COLOR_USER2 0,0,255        //用户2棋子颜色-蓝色#define SCREEN_W 420             //屏幕宽度#define SCREEN_H 420             //屏幕高度#define OFFSET_X QIZI_SIZE        //棋盘划线偏移量x#define OFFSET_Y QIZI_SIZE        //棋盘划线偏移量y#define TITLE_LEN 128             //标题缓冲区长度//服务器端协议编号处理函数定义#define REGIST_USER_NAME 1001     //注册用户姓名p_1001#define SET_QIZI_POSITION 1002     //设置棋子位置p_1002#define GAME_CONTINUE 1003        //继续新一轮游戏p_1003#define NOTE_SERVER_START 1004   //通知服务器游戏可以开始了p_1004//客户端协议编号处理函数定义#define NOTE_USER_OVERFLOW 2001       //提示用户已满u_2001#define NOTE_USER_GAMESTART 2002      //提示用户游戏开始u_2002#define NOTE_USER_WAITFOROTHER 2003   //通知用户连接成功,等待另一个用户连接u_2003#define NOTE_USER_ANOTHEREXIT 2004    //一个用户退出游戏,重设游戏变量,通知另一个用户等待新用户u_2004#define NOTE_USER_RESULT 2005         //通知两个用户本回合棋盘落子情况和获胜情况                                     //若游戏结束,等待用户确认重新开始u_2005#define NOTE_USER_START 2006          //通知用户游戏可以开始了u_2006//游戏状态定义#define GAME_READY 0#define GAME_RUN 1#define GAME_OVER 2/////////////////////////////////////int whoami;                           //我是谁(哪个用户号)int qipan[ROWCOL][ROWCOL], currentuser;   //棋盘,本回合落子用户char user_name[2][USER_NAME_LEN];       //用户名字int *protocol_num;                     //协议编号指针char *protocol_context;                 //协议内容指针int c_sock, c_len;struct sockaddr_in c_addr_s;fd_set c_set_in;char c_buf_receive[MAXLEN], c_buf_send[MAXLEN], * temp;int cursor_row=1, cursor_col=1;           //当前光标位置SDL_Event c_event;                     //SDL事件对象SDL_Surface *screen;                    //SDL屏幕指针Uint32 color_bg, color_line, color_user1, color_user2; //背景、划线、用户1棋子、用户2棋子颜色char title[TITLE_LEN];               //窗口标题char* argv_name;                    //保存命令行用户名数组指针struct timeval timeout;               //select函数持续时间int flag_flash;                     //按键刷新标志/////////////////////////////////////////////////系统函数////////////////////////////////////////////////////////处理不同命令请求的代理程序//客户端每增加新的处理请求都需要在双方程序开始增加一个1000开始的协议编号的定义,并在此增加该协议的处理函数void c_delegate(char * receive){  protocol_num=(int *)receive;  switch (*protocol_num)  {    case NOTE_USER_OVERFLOW :     {//提示用户已满                                    p_2001(receive);                                    break;                                 }    case NOTE_USER_GAMESTART :    {//提示用户游戏开始                                    p_2002(receive);                                    break;                                 }    case NOTE_USER_WAITFOROTHER : {//通知用户连接成功,等待另一个用户连接                                    p_2003(receive);                                    break;                                 }    case NOTE_USER_ANOTHEREXIT :  {//一个用户退出游戏,重设游戏变量,通知另一个用户等待新用户                                   p_2004(receive);                                   break;                                 }    case NOTE_USER_RESULT :       {//通知两个用户本回合棋盘落子情况和获胜情况,若游戏结束,等待用户确认重新开始                                    p_2005(receive);                                    break;                                 }    case NOTE_USER_START :        {//通知用户游戏可以开始了                                    p_2006(receive);                                    break;                                 }  }}//初始化游戏变量c_init(){  memset(qipan, QIPAN_NULL, sizeof(int)*ROWCOL*ROWCOL);//初始化棋盘  memset(title, 0, TITLE_LEN);//初始化窗口标题  //初始化SDL图形界面  if(SDL_Init(SDL_INIT_VIDEO) <0){    printf("error: can not init SDL: %s\n",SDL_GetError());    exit(1);  }  screen=SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE);//设置屏幕模式:宽,高,色彩  if(screen==NULL){    printf("error: can set %dx%dx16 model : %s\n",SCREEN_W, SCREEN_H, SDL_GetError());    exit(1);  }  atexit(SDL_Quit);//系统退出时执行SDL销毁程序  //初始化颜色变量  color_bg=SDL_MapRGB(screen->format, COLOR_BG );  color_line=SDL_MapRGB(screen->format, COLOR_LINE );  color_user1=SDL_MapRGB(screen->format, COLOR_USER1 );  color_user2=SDL_MapRGB(screen->format, COLOR_USER2 );}//划棋子void draw_qizi(){  int i, j, x, y;  SDL_Rect display_rect;//画图区域  Uint32 color_qizi;//棋子颜色  //循环棋盘的每一行和每一列画出棋子  for(i=0; i<ROWCOL; i++){    for(j=0; j<ROWCOL; j++){      if(qipan[i][j]==USER1 || qipan[i][j]==USER2){//当前结点有棋子        if(qipan[i][j]==USER1) color_qizi=color_user1;//确认棋子颜色        if(qipan[i][j]==USER2) color_qizi=color_user2;//确认棋子颜色        x=OFFSET_X+j*QIZI_SIZE;//定位棋子的中间一点横坐标        y=OFFSET_Y+i*QIZI_SIZE;//定位棋子的中间一点纵坐标        //棋子由15条长短不一的横线组成        //(x-2),(y-7),(5),(1)        display_rect.x=x-2;        display_rect.y=y-7;        display_rect.w=5;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-4),(y-6),(9),(1)        display_rect.x=x-4;        display_rect.y=y-6;        display_rect.w=9;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-5),(y-5),(11),(1)        display_rect.x=x-5;        display_rect.y=y-5;        display_rect.w=11;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-6),(y-4),(13),(1)        display_rect.x=x-6;        display_rect.y=y-4;        display_rect.w=13;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-6),(y-3),(13),(1)        display_rect.x=x-6;        display_rect.y=y-3;        display_rect.w=13;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-7),(y-2),(15),(1)        display_rect.x=x-7;        display_rect.y=y-2;        display_rect.w=15;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-7),(y-1),(15),(1)        display_rect.x=x-7;        display_rect.y=y-1;        display_rect.w=15;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-7),(y),(15),(1)        display_rect.x=x-7;        display_rect.y=y;        display_rect.w=15;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-7),(y+1),(15),(1)        display_rect.x=x-7;        display_rect.y=y+1;        display_rect.w=15;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-7),(y+2),(15),(1)        display_rect.x=x-7;        display_rect.y=y+2;        display_rect.w=15;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-6),(y+3),(13),(1)        display_rect.x=x-6;        display_rect.y=y+3;        display_rect.w=13;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-6),(y+4),(13),(1)        display_rect.x=x-6;        display_rect.y=y+4;        display_rect.w=13;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-5),(y+5),(11),(1)        display_rect.x=x-5;        display_rect.y=y+5;        display_rect.w=11;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-4),(y+6),(9),(1)        display_rect.x=x-4;        display_rect.y=y+6;        display_rect.w=9;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);        //(x-2),(y+7),(5),(1)        display_rect.x=x-2;        display_rect.y=y+7;        display_rect.w=5;        display_rect.h=1;        SDL_FillRect(screen, &display_rect, color_qizi);      }    }  }}//更新屏幕显示void c_update_screen(){  int i;  int x1, x2, y1, y2;  SDL_Rect display_rect;//画图区域  //划棋盘背景  display_rect.x=1;  display_rect.y=1;  display_rect.w=SCREEN_W;  display_rect.h=SCREEN_H;  SDL_FillRect(screen, &display_rect, color_bg);  //划棋盘横线  display_rect.w=QIZI_SIZE*(ROWCOL-1);  display_rect.h=1;  display_rect.x=OFFSET_X;  for(i=0; i<ROWCOL ;i++){    display_rect.y=OFFSET_Y+QIZI_SIZE*i;    SDL_FillRect(screen, &display_rect, color_line);  }  //划棋盘竖线  display_rect.w=1;  display_rect.h=QIZI_SIZE*(ROWCOL-1) + 1;  display_rect.y=OFFSET_Y;  for(i=0; i<ROWCOL ;i++){    display_rect.x=OFFSET_X+QIZI_SIZE*i;    SDL_FillRect(screen, &display_rect, color_line);  }  //划棋子  draw_qizi();  //划当前光标  x1=(OFFSET_X+cursor_col*QIZI_SIZE)-(QIZI_SIZE/2);  x2=(OFFSET_X+cursor_col*QIZI_SIZE)+(QIZI_SIZE/2);  y1=(OFFSET_Y+cursor_row*QIZI_SIZE)-(QIZI_SIZE/2);  y2=(OFFSET_Y+cursor_row*QIZI_SIZE)+(QIZI_SIZE/2);  display_rect.x=x1;//上横线  display_rect.y=y1;  display_rect.w=QIZI_SIZE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -