From bc4edc916c2b5b62fdef9a75b701e03ba189fa30 Mon Sep 17 00:00:00 2001 From: Littlefisher619 <619815617@qq.com> Date: Wed, 3 Apr 2019 19:27:42 +0800 Subject: [PATCH] Add files via upload --- gobang.h | 209 +++++++++++++++++++++++++++++++++++++ internet.h | 300 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 133 ++++++++++++++++++++++++ message.h | 51 +++++++++ ui.h | 112 ++++++++++++++++++++ 5 files changed, 805 insertions(+) create mode 100644 gobang.h create mode 100644 internet.h create mode 100644 main.c create mode 100644 message.h create mode 100644 ui.h diff --git a/gobang.h b/gobang.h new file mode 100644 index 0000000..115b710 --- /dev/null +++ b/gobang.h @@ -0,0 +1,209 @@ +#include +#include +#include +#include "message.h" +#define SIZE 20 + +int board[SIZE][SIZE];//0-* 1-O +int history[400][3]={0},num=0;//record whlch step who go while one +int isBlackMove=1;//if it is the time for black one to play, flag=0, or flag=1 +int isBlackTheWinner=0; +int isBlackIdentity=0; +extern void draw(); //�������� +extern int pending_win (int x ,int y); //judge whether someone can win +extern int pending_legal(int x,int y); //judging whether put the chess here is legal +extern void insert(int x,int y); //put the chess into the board +extern void output(int x,int y); +extern void back(int history [][3],int num);//���� +extern void record (int x,int y,int num); +extern void resetBoard(void); +extern int play(int x,int y); +extern int onLocalUndoClick(int y,int x); +extern int onLocalSurrenderClick(int x,int y); +extern int isLegalMove(int y,int x); +extern void setIsBlackMove(int x); +void flipIsBlackMove(); +void setIsBlackMove(int x); +void pos(int x,int y); +void setIsBlackMove(int x){ + isBlackMove=x; +} +void flipIsBlackMove(){ + isBlackMove=1-isBlackMove; +} +int isLegalMove(int y,int x){ + return (board[x][y]==-1); +} +int onLocalSurrenderClick(int x,int y){ + pos(25,2); + if(isBlackMove==1) puts(MESSAGE_WHITE_WIN); + else puts(MESSAGE_BLACK_WIN); + return 0; +} +void resetBoard(void) //����Ԥ���� +{ + int i,j; + for(i=0;i=2) + { + back(history,--num); + back(history,--num); + draw(); + } + else + { + pos(25,2); + puts(MESSAGE_UNDO_NOTHING); + } +} +int play(int y,int x) +{ + + y--; + x--; + if(board[x][y]!=-1){ + pos(25,2); + puts(MESSAGE_ILLEGAL_MOVE); + return CONTINUE_SIGNAL; + } + + record(x,y,num++);//record the step now + insert(x,y); //put the chess into the board + flipIsBlackMove(); + draw(); + if (pending_win(x,y)) + { + pos(25,2); + if(isBlackMove==1)isBlackTheWinner=0; + else isBlackTheWinner=1; + puts(isBlackTheWinner?MESSAGE_BLACK_WIN:MESSAGE_WHITE_WIN); + return GAMEOVER_SIGNAL; + } + return CONTINUE_SIGNAL; +} + +void record (int x,int y,int num) +{ + history[num][0]=x; + history[num][1]=y; +} +void draw() +{ + pos(0,0); + int i; + puts(" ABCDEFGHIJKLMNOPQRST");//���������б�� + for(i=0; i=1 && i=0&&board[x-1][y]==ch&&board[x-2][y]==ch&&board[x-3][y]==ch&&board[x-4][y]==ch) return 1; + if(x-3>=0&&board[x+1][y]==ch&&board[x-1][y]==ch&&board[x-2][y]==ch&&board[x-3][y]==ch&&x+1=0&&board[x+2][y]==ch&&board[x+1][y]==ch&&board[x-1][y]==ch&&board[x-2][y]==ch&&x+2=0&&board[x+3][y]==ch&&board[x+2][y]==ch&&board[x+1][y]==ch&&board[x-1][y]==ch&&x+3=0&&board[x][y-1]==ch&&board[x][y-2]==ch&&board[x][y-3]==ch&&board[x][y-4]==ch) return 1; + if(y-3>=0&&y+1=0&&y+2=0&&y+3=0&&y+4=0&&y+3=0&&board[x+1][y-1]==ch&&board[x-1][y+1]==ch&&board[x-2][y+2]==ch&&board[x-3][y+3]==ch) return 1; + if(x-2>=0&&y+2=0&&board[x+2][y-2]==ch&&board[x+1][y-1]==ch&&board[x-1][y+1]==ch&&board[x-2][y+2]==ch) return 1; + if(x-1>=0&&y+1=0&&board[x+3][y-3]==ch&&board[x+2][y-2]==ch&&board[x+1][y-1]==ch&&board[x-1][y+1]==ch) return 1; + if( x+4=0&&board[x+4][y-4]==ch&&board[x+3][y-3]==ch&&board[x+2][y-2]==ch&&board[x+1][y-1]==ch) return 1; + + if( x+4=0&&y-1>=0&&board[x-1][y-1]==ch&&board[x+1][y+1]==ch&&board[x+2][y+2]==ch&&board[x+3][y+3]==ch) return 1; + if(x+2=0&&y-2>=0&&board[x-2][y-2]==ch&&board[x-1][y-1]==ch&&board[x+1][y+1]==ch&&board[x+2][y+2]==ch) return 1; + if(x+1=0&&y-3>=0&&board[x-3][y-3]==ch&&board[x-2][y-2]==ch&&board[x-1][y-1]==ch&&board[x+1][y+1]==ch) return 1; + if( x-4>=0&&y-4>=0&&board[x-4][y-4]==ch&&board[x-3][y-3]==ch&&board[x-2][y-2]==ch&&board[x-1][y-1]==ch) return 1; + return 0; +} diff --git a/internet.h b/internet.h new file mode 100644 index 0000000..a11198a --- /dev/null +++ b/internet.h @@ -0,0 +1,300 @@ + +#include "ui.h" +#include "message.h" +#include "gobang.h" +#define random(x) (rand()%x) +#include +extern int internetUserOperationHandler(SOCKET s_client); +extern int internetGobangDataHandler(SOCKET s_client); +extern void internetClientMode(char* SERVER_IP); +extern void internetServerMode(); +extern void internetGameStart(SOCKET s_client); +void clear(); +void initListener(); +void renderBotton(); +void internetGameInit(); +int internetMode;//-1 LocalMode 0 ServerMode 1 ClientMode +void internetGameInit(){ + //������Ϸ + setIsBlackMove(1); + clear(); + //ע�ᰴť������ + initListener(); + resetBoard(); + + SetConsoleTitle(TITLE_GOBANG); + hideCursor(); + //��Ⱦ��ť + renderBotton(); + pos(25,0); + puts(BANNER_GOBANG); + pos(25,19); + //����Լ������� + puts(isBlackIdentity?MESSAGE_IDENTITY_BLACK:MESSAGE_IDENTITY_WHITE); +} +void internetClientMode(char* SERVER_IP){ + + WORD ws_version = MAKEWORD(2, 2); //ָ��Winsock version + WSADATA wsaData; //WSA �����IJ��� + + /*��ʼ��winsock*/ + WSAStartup(ws_version, &wsaData); + + int send_status, recv_status; + SOCKADDR_IN addr_server; + SOCKET s_client; + while(1){ + s_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + SOCKADDR_IN addr_server; + addr_server.sin_family = AF_INET; //Э�� + addr_server.sin_port = htons(5050); //�˿� + addr_server.sin_addr.s_addr = inet_addr(SERVER_IP); + int cnct_status = connect(s_client, (SOCKADDR*)&addr_server, sizeof(SOCKADDR)); + if(cnct_status == 0)//���ӳɹ� + { + break; + }else { + int result=MessageBox(NULL, TEXT(MESSAGE_FAILED_TO_CONNECT_SERVER), TEXT(TITLE_ERROR), MB_RETRYCANCEL | MB_ICONERROR); + if(result==IDCANCEL) return; + } + } + + char buf[100]; + + while(1) + { + + memset(buf,0,sizeof(buf)); + + + puts(MESSAGE_CONNECTION_ESTABLISHED); + + //��������������ӳɹ�������READY�ź� + send_status = send(s_client, CLIENT_READYSIGNAL, strlen(CLIENT_READYSIGNAL), 0); + if(send_status == SOCKET_ERROR)//����ʧ�� + { + puts(MESSAGE_CONNECTION_TIMEOUT); + } + else//���ͳɹ� + { + //�ȴ�����˴�����������Ϣ + recv_status = recv(s_client, buf, 100, 0); + buf[recv_status] = 0x00;//���ַ�����β���� ������ 0x00 == /0 �ο��ش� + + if(buf[0]=='S'){//��Ϣ��Ч + + //��ȡ������Ϣ + sscanf(buf,SERVER_START_DATA,&isBlackIdentity); + //������Ϸ + internetGameInit(); + break; + } + } + + } + internetGameStart(s_client); + closesocket(s_client); + WSACleanup(); +} +void internetServerMode(){ + WORD ws_version = MAKEWORD(2, 2); //ָ��Winsock version + WSADATA wsaData; //WSA �����IJ��� + + /*��ʼ��winsock*/ + WSAStartup(ws_version, &wsaData); + + /*socket*/ + SOCKET s_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + SOCKADDR_IN addr_server; + addr_server.sin_family = AF_INET; //Э�� + addr_server.sin_port = htons(5050); //�˿� + addr_server.sin_addr.s_addr = htonl(INADDR_ANY); //IP:����IP + + /*bind*/ + int bind_status; + bindport: + bind_status = bind(s_server, (SOCKADDR*)&addr_server, sizeof(SOCKADDR)); + if(bind_status == SOCKET_ERROR) + { + int result=MessageBox(NULL, TEXT(MESSAGE_CLOUD_NOT_BIND_TO_PORT), TEXT(TITLE_ERROR), MB_RETRYCANCEL | MB_ICONERROR); + if(result==IDCANCEL) return; + else goto bindport; + } + else + { + puts(MESSAGE_BIND_OK); + } + + /*listen*/ + listen(s_server, 1);//max=5 + + printf(MESSAGE_LISTENING); + + SOCKADDR_IN addr_client; //�洢client��ַ��Ϣ + int len = sizeof(SOCKADDR); + SOCKET s_client; //���ӵ�socket + + + int send_status, recv_status; + + + while(1){ + puts(MESSAGE_WAIT_CONNECTION); + /*accept*/ + s_client = accept(s_server, (SOCKADDR*)&addr_client, &len); + if(s_client == INVALID_SOCKET) + { + printf(MESSAGE_ESTABLISHED_CONNECTION_WITH_CLIENT_FAILED); + }else break; + } + + char buf[100]; + while(1) + { + memset(buf,0,sizeof(buf)); + //��ͻ��˽������ӳɹ������ܿͻ���READY�ź� + puts(MESSAGE_CONNECTION_ESTABLISHED); + recv_status = recv(s_client, buf, 100, 0); + if(recv_status > 0) + { + buf[recv_status] = 0x00;//���ַ�����β���� ������ 0x00 == /0 �ο��ش� + if(strcmp(buf,CLIENT_READYSIGNAL)==0){ + //�ź���Ч + + puts(MESSAGE_STARTING_GAME); + + //��������Լ�������(����/����) + srand(time(0)); + isBlackIdentity=random(1); + + //���ͻ��˵����ݷ��͹�ȥ + sprintf(buf,SERVER_START_DATA,1-isBlackIdentity); + send(s_client, buf, strlen(buf), 0); + + internetGameInit(); + break; + } + + } + + } + + internetGameStart(s_client); + closesocket(s_client); + closesocket(s_server); + WSACleanup(); + + return; +} +int internetGobangDataHandler(SOCKET s_client){ + COORD coord; + int send_status, recv_status; + + char buf[100]; + memset(buf,0,sizeof(buf)); + recv_status = recv(s_client, buf, 100, 0); + //���ܶ��ֵ��������� + if(recv_status>0){//������Ч + buf[recv_status]=0x00; + + if(strcmp(buf,SURRENDER_SIGNAL)==0){ + MessageBox(NULL, TEXT(MESSAGE_YOU_WIN), TEXT(TITLE_GAMEOVER), MB_OK | MB_ICONINFORMATION); + return GAMEOVER_SIGNAL; + }else if(strcmp(buf,UNDO_REQUEST)==0){ + int result=MessageBox(NULL, TEXT(MESSAGE_UNDO_REQUEST), TEXT(TITLE_UNDO_REQUEST), MB_YESNO | MB_ICONQUESTION); + + if(result==IDYES){ + onLocalUndoClick(0,0); + send(s_client,UNDO_ACCEPT,strlen(UNDO_ACCEPT),0); + + }else{ + send(s_client,UNDO_DENIED,strlen(UNDO_DENIED),0); + } + return CONTINUE_SIGNAL; + }else{ + //���±����������� + sscanf(buf,PLACE_DATA,&coord.X,&coord.Y); + int ret=Trigger(coord.X,coord.Y); + if(ret==GAMEOVER_SIGNAL) { + MessageBox(NULL, TEXT( (isBlackTheWinner&&isBlackIdentity) ? MESSAGE_YOU_WIN: MESSAGE_YOU_LOSE ), TEXT(TITLE_GAMEOVER), MB_OK | MB_ICONINFORMATION); + return GAMEOVER_SIGNAL; + } + return CONTINUE_SIGNAL; + } + } +} +int internetUserOperationHandler(SOCKET s_client){ + COORD coord=waitForMouseClick(); + + int ret=Trigger(coord.X,coord.Y); + int send_status, recv_status; + + char buf[100]; + memset(buf,0,sizeof(buf)); + if(ret==UNDO_CLICK_SIGNAL){ + send(s_client,UNDO_REQUEST,strlen(UNDO_REQUEST),0); + recv_status = recv(s_client, buf, 100, 0); + if(recv_status>0){ + buf[recv_status]=0x00; + if(strcmp(UNDO_ACCEPT,buf)==0){ + onLocalUndoClick(0,0); + }else{ + pos(25,2); + puts(MESSAGE_UNDO_DENIED); + } + } + return CONTINUE_SIGNAL; + + }else if(ret==SURRENDER_CLICK_SIGNAL){ + send(s_client,SURRENDER_SIGNAL,strlen(SURRENDER_SIGNAL),0); + MessageBox(NULL, TEXT(MESSAGE_SURRENDERED), TEXT(TITLE_GAMEOVER), MB_OK | MB_ICONINFORMATION); + return GAMEOVER_SIGNAL; + }else{ + //��ȡ������������� + sprintf(buf,PLACE_DATA,coord.X,coord.Y); + //���͸��ͻ��� + send_status = send(s_client, buf, strlen(buf), 0); + if(send_status!=SOCKET_ERROR){//���ͳɹ� + //���±����������� ���ж���Ӯ + + if(ret==GAMEOVER_SIGNAL) { + send(s_client,SURRENDER_SIGNAL,strlen(SURRENDER_SIGNAL),0); + MessageBox(NULL, TEXT((isBlackTheWinner&&isBlackIdentity) ? MESSAGE_YOU_WIN: MESSAGE_YOU_LOSE ), TEXT(TITLE_GAMEOVER), MB_OK | MB_ICONINFORMATION); + return GAMEOVER_SIGNAL; + } + SetConsoleTitle(internetMode==GOBANG_SERVER_MODE?MESSAGE_WAIT_CLIENT_MOVE:MESSAGE_WAIT_SERVER_MOVE); + } + return CONTINUE_SIGNAL; + } + +} +void internetGameStart(SOCKET s_client){ + COORD coord; + int send_status, recv_status; + + char buf[100]; + while(1){ + + memset(buf,0,sizeof(buf)); + + int res=CONTINUE_SIGNAL; + pos(25,1); + if(isBlackMove ^ isBlackIdentity==0){ + //���Լ��Ļغ� + //1.�Լ��Ǻ��壬�����Ǻ����ƶ� + //2.�Լ��ǰ��壬�����ǰ����ƶ� + puts(MESSAGE_WAIT_YOU); + //�����û��IJ������ݣ����������͸��Է� + res=internetUserOperationHandler(s_client); + }else{ + //�����Լ��Ļغ� + //1.�Լ��Ǻ��壬�����ǰ����ƶ� + //2.�Լ��ǰ��壬�����Ǻ����ƶ� + puts(isBlackIdentity?MESSAGE_WAIT_WHITE:MESSAGE_WAIT_BLACK); + //�������ԶԷ��IJ������ݲ����� + res=internetGobangDataHandler(s_client); + } + if(res==GAMEOVER_SIGNAL) break; + } +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..3e7995b --- /dev/null +++ b/main.c @@ -0,0 +1,133 @@ + +#include + +#include +#include +#include +#include +#include +#include +#include "internet.h" + +void launchLocalMode(); +void internetModeMenu(); +void initListener(); +void renderBotton(); +void hideCursor(); +int onUndoClick(int x,int y); +int onSurrenderClick(int x,int y); +int mainMenu(); +void clear(); + +int onUndoClick(int x,int y){ + if(internetMode==GOBANG_LOCAL_MODE) return onLocalUndoClick(x, y); + return UNDO_CLICK_SIGNAL; + +} +int onSurrenderClick(int x,int y){ + if(internetMode==GOBANG_LOCAL_MODE) return onLocalSurrenderClick(x, y); + return SURRENDER_CLICK_SIGNAL; +} +void initListener(){//ע����Ϸ��ť������ + registerListener(newPoint(1,1),newPoint(21,21),play); + registerListener(newPoint(25,20),newPoint(30,20),onUndoClick); + registerListener(newPoint(35,20),newPoint(45,20),onSurrenderClick); +} +void renderBotton(){ + pos(25,20); + puts("[Undo]"); + pos(35,20); + puts("[Surrender]"); +} + +void internetModeMenu(){ + clear(); + pos(0,0); + puts("Internet Mode Configure"); + puts("[1] Client Mode"); + puts(" Connect a existing GOBANG server."); + puts("[2] Server Mode"); + puts(" Listening on a PORT and wait client to connect."); + int op; + scanf("%d",&op); + getchar(); + if(op==1){ + internetMode=GOBANG_CLIENT_MODE; + clear(); + pos(0,0); + puts(MESSAGE_ENTER_IPADDR); + char ip[50]; + scanf("%s",&ip); + getchar(); + internetClientMode(ip); + + }else if(op==2){ + internetMode=GOBANG_SERVER_MODE; + clear(); + pos(0,0); + internetServerMode(); + }else { + puts(MESSAGE_UNKNOWN_OPTION); + return; + } + +} +int mainMenu(){ + clear(); + pos(0,0); + puts("Welcome to GOBANG!\n[1] Local Multiple Player\n[2] Internet Multiple Player\n[3] Exit\n"); + showCursor(); + int op; + scanf("%d",&op); + pos(0,4); + switch(op){ + case 1: + launchLocalMode(); + break; + case 2: + internetModeMenu(); + break; + case 3: + exit(0); + break; + default: + puts(MESSAGE_UNKNOWN_OPTION); + + } +} + + + +void launchLocalMode(){ + internetMode=GOBANG_LOCAL_MODE; + //������Ϸ + clear(); + //ע�᱾����Ϸ��ť������ + initListener(); + resetBoard(); + SetConsoleTitle(TITLE_GOBANG); + hideCursor(); + renderBotton(); + pos(25,0); + puts(BANNER_GOBANG); + + + int ret; + int click=0; + while (1) { + pos(25,1); + puts(isBlackMove?MESSAGE_WAIT_BLACK:MESSAGE_WAIT_WHITE); + COORD coord=waitForMouseClick(); + int ret=Trigger(coord.X,coord.Y); + if(ret==GAMEOVER_SIGNAL) break; + } + MessageBox(NULL, TEXT(TITLE_GAMEOVER), TEXT(TITLE_GAMEOVER), MB_OK | MB_ICONINFORMATION); +} +int main(){ + while(1){ + //���˵� + SetConsoleTitle(TITLE_GOBANG); + mainMenu(); + } + return 0; +} \ No newline at end of file diff --git a/message.h b/message.h new file mode 100644 index 0000000..26c2f16 --- /dev/null +++ b/message.h @@ -0,0 +1,51 @@ +#pragma once +const char* SERVER_START_DATA="START %d"; +const char* CLIENT_READYSIGNAL="READY"; +const char* PLACE_DATA="PLACE %d,%d"; +const char* UNDO_REQUEST="UNDO_REQ"; +const char* UNDO_ACCEPT="UNDO_YES"; +const char* UNDO_DENIED="UNDO_NO"; +const char* SURRENDER_SIGNAL="GIVEUP"; +const char* MESSAGE_IDENTITY_BLACK="You're the BLACK(*)"; +const char* MESSAGE_IDENTITY_WHITE="You're the WHITE(O)"; +const char* MESSAGE_WAIT_BLACK="Wait BLACK(*) make the move..."; +const char* MESSAGE_WAIT_WHITE="Wait WHITE(O) make the move..."; +const char* MESSAGE_WAIT_YOU ="Wait your move... "; +const char* MESSAGE_WAIT_SERVER_MOVE="Gobang - Wait server's move..."; +const char* MESSAGE_WAIT_CLIENT_MOVE="Gobang - Wait client's move..."; +const char* MESSAGE_BLACK_WIN="BLACK(*) WIN! "; +const char* MESSAGE_WHITE_WIN="WHITE(O) WIN! "; +const char* MESSAGE_YOU_WIN="Congratulations! You WIN!"; +const char* MESSAGE_YOU_LOSE="Oh NO! You LOSE! Try again later :)"; +const char* MESSAGE_UNDO_NOTHING="Nothing to Undo! "; +const char* MESSAGE_UNDO_OK="Undo OK! "; +const char* MESSAGE_UNDO_DENIED="Undo DENIED! "; +const char* MESSAGE_UNDO_REQUEST="The oppsite request to UNDO his move. \nDo you ACCEPT?"; +const char* MESSAGE_ILLEGAL_MOVE="Illegal Move! "; +const char* MESSAGE_LASTMOVE_FORMAT="Last Move(%c): (%c,%c) "; +const char* MESSAGE_SURRENDERED="You have SURRENDERED!"; +const char* MESSAGE_CONNECTION_ESTABLISHED="Connection established!"; +const char* MESSAGE_ESTABLISHED_CONNECTION_WITH_CLIENT_FAILED="Fail to establish connection with client!"; +const char* MESSAGE_CONNECTION_TIMEOUT="Connection timeout!"; +const char* MESSAGE_STARTING_GAME="Starting Game..."; +const char* MESSAGE_CLOUD_NOT_BIND_TO_PORT="Could not bind to port 5050!\nWould you want to retry?"; +const char* MESSAGE_WAIT_CONNECTION="Waiting for connection..."; +const char* MESSAGE_BIND_OK="Bind successfully!"; +const char* MESSAGE_LISTENING="Listening on port 5050..."; +const char* MESSAGE_FAILED_TO_CONNECT_SERVER="Failed to connect the server.\nWould you want to retry?"; +const char* MESSAGE_UNKNOWN_OPTION="Unknown Option!"; +const char* MESSAGE_ENTER_IPADDR="Enter server IP address:"; +const char* TITLE_GOBANG="Gobang"; +const char* TITLE_GOBANG_COORD_FORMAT="Gobang (%d,%d)"; +const char* TITLE_GAMEOVER="Game Over"; +const char* TITLE_ERROR="Error"; +const char* TITLE_UNDO_REQUEST="UNDO REQUEST"; +const char* BANNER_GOBANG="============Gobang============"; +const int GAMEOVER_SIGNAL=0x00; +const int CONTINUE_SIGNAL=0x01; +const int UNDO_CLICK_SIGNAL=0xBB; +const int SURRENDER_CLICK_SIGNAL=0xAA; +const int GOBANG_CLIENT_MODE=1; +const int GOBANG_SERVER_MODE=0; +const int GOBANG_LOCAL_MODE=-1; +//const int GOBANG_AI_MODE=0xFF; \ No newline at end of file diff --git a/ui.h b/ui.h new file mode 100644 index 0000000..5b10cec --- /dev/null +++ b/ui.h @@ -0,0 +1,112 @@ + +#include +#include +#include "message.h" +typedef int (*CallbackFunc)(int,int); +typedef struct Point +{ + int x,y; +}Point; +typedef struct Listener +{ + struct Point p1,p2; + CallbackFunc func; +}Listener; +extern COORD waitForMouseClick(); +extern void registerListener(Point p1,Point p2,CallbackFunc p); +extern Listener newListener(Point _p1,Point _p2,CallbackFunc p); +extern Point newPoint(int x,int y); +extern void pos(int x,int y); +extern int Trigger(int nx,int ny); +extern void hideCursor(); +extern void showCursor(); +Listener listener[101]; +int listenercnt=0; +Listener newListener(Point _p1,Point _p2,CallbackFunc p){ + Listener listener; + if(_p1.x>_p2.x){ + int t; + t=_p1.x; + _p1.x=_p2.x; + _p2.x=t; + t=_p1.y; + _p1.y=_p2.y; + _p2.y=t; + } + listener.p1=_p1; + listener.p2=_p2; + //this->enabled=true; + listener.func=p; + return listener; +} +Point newPoint(int x,int y){ + Point p; + p.x=x; + p.y=y; + return p; +} +void registerListener(Point p1,Point p2,CallbackFunc p){ + listener[++listenercnt]=newListener(p1,p2,p); +} +void pos(int x,int y){ + COORD posPoint = {x,y}; + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),posPoint); +} +int Trigger(int nx,int ny){ + int i; + for(i=1;i<=listenercnt;i++){ + //printf("%d<=%d %d>=%d %d>=%d %d<=%d\n", listener[i].p1.x,nx,listener[i].p1.y,ny,listener[i].p2.x,nx,listener[i].p2.y,ny); + if(listener[i].p1.x<=nx && listener[i].p1.y<=ny && listener[i].p2.x>=nx &&listener[i].p2.y>=ny){ + + return (*listener[i].func)(nx,ny); + } + } + //nothing found! + //(*callbacks[0])(x,y); +} +COORD waitForMouseClick(){ + //��ȡ��������� ֱ��������Ч�Żش� + INPUT_RECORD inRec; + DWORD res; + HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); + + char title[101]; + + while(1){ + ReadConsoleInput(hInput, &inRec, 1, &res); + + //puts("") + if (inRec.EventType == MOUSE_EVENT){ + COORD coord= { inRec.Event.MouseEvent.dwMousePosition.X ,inRec.Event.MouseEvent.dwMousePosition.Y}; + if(inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) { + return coord; + } + sprintf(title, TITLE_GOBANG_COORD_FORMAT + ,coord.X ,coord.Y); + SetConsoleTitle(title); + + } + + + } +} +void hideCursor(){//���ع�� + HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_CURSOR_INFO cinfo; + cinfo.bVisible=0; + cinfo.dwSize=1; + SetConsoleCursorInfo(hOut,&cinfo); +} +void showCursor(){//��ʾ��� + HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_CURSOR_INFO cinfo; + cinfo.bVisible=1; + cinfo.dwSize=1; + SetConsoleCursorInfo(hOut,&cinfo); +} +void clear(){//���� + pos(0,0); + int i; + for(i=0;i<=30;i++) + puts(" "); +} \ No newline at end of file