📄 fivec.c
字号:
//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 + -