/*
2011.05.22-28.
Daun.
Client For Poker..
*/
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define PORT 8494
#define IP "192.168.0.36"
#define OFF 0
#define ON 1
char *SHAPE[4] = {"♤", "◇", "♡", "♧"};
char *NUM[13] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
enum {BLACK,D_BLUE,D_GREEN,D_SKYBLUE,D_RED,D_VIOLET,D_YELLOW,GRAY,D_GRAY,BLUE,GREEN,SKYBLUE,RED,VIOLET,YELLOW,WHITE,};
void SetColor(int backcolor, int fontcolor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), backcolor*16+fontcolor);
}
int myCard[5]={0}; //나의 카드 저장배열
int winner = 0;
int player0Card[5]={0}; //다른player의 카드 저장배열
int player1Card[5]={0}; //다른player의 카드 저장배열
int player2Card[5]={0}; //다른player의 카드 저장배열
int player3Card[5]={0}; //다른player의 카드 저장배열
int player4Card[5]={0}; //다른player의 카드 저장배열
int playerCard[5][5]={0};
int playerMoney[5]={20000000};
int allMoney = 0;
int willgiveMoney=100;
int menu=0;//선택매뉴를 저장하는 변수
int cardTurn = 0; //공개한 카드의 갯수를 저장함 0은 어처피 비공개라서...
int myPlayerNumber=0;
int die = OFF; //0인경우는 다이가 아닌경우 1로 변하면 다이가 되어있는경우.
int itemp=0; //int형 임시 저장소
char ctemp=0; //char형 임시 저장소
SOCKET soc; //소켓변수
struct sockaddr_in addr; //구조체변수
char buf[256]={0}; //전달할 문자열을 저장할 배열
void show();
void print_card(int);
void display_card(int , int);
void playGame(int);
void betting(int,int);
void printMoney(int );
void main()
{
system("COLOR F0");
SetColor(WHITE,BLACK);
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_addr.S_un.S_addr=inet_addr(IP);
addr.sin_family=AF_INET;
addr.sin_port=htons(8494);
SetColor(WHITE,VIOLET);
printf("\n\n\n\n\n\n\nWaiting~");
SetColor(WHITE,BLACK);
connect(soc,(struct sockaddr*)&addr, sizeof(addr));
memset(buf,0,256);
recv(soc,buf,256,0);
sscanf(buf,"%d",&myPlayerNumber);
die = OFF;
memset(buf,0,256);
recv(soc,buf,256,0); //나의 카드 목록을 받음
sscanf(buf, "%d %d %d %d %d",&myCard[0],&myCard[1],&myCard[2],&myCard[3],&myCard[4]); //나의 카드를 배열에 저장
system("cls");
SetColor(WHITE,VIOLET);
printf("당신은 %d번 플레이어입니다.\n",myPlayerNumber);
printf("게임이 시작되었습니다.\n\n");
SetColor(WHITE,BLACK);
printf("\t\t받은 카드는 ");
print_card(myCard[0]);
print_card(myCard[1]); //받은 카드중 2개를 공개
printf("입니다.\n\n");
while(1)
{
fflush(stdin);
memset(buf,0,256);
recv(soc, buf, 256, 0);
menu = buf[0];
playGame(menu);
if(menu == '6')
break;
}
WSACleanup();
closesocket(soc);
}
void print_card(int card)
{
int shape = card / 13;
int num = card % 13;
if(shape==1||shape==2)
SetColor(WHITE,RED);
printf("%s%s ", SHAPE[shape], NUM[num]);
SetColor(WHITE,BLACK);
} //숫자로 저장된 카드를 모양으로 바꾸어주는 함수
void display_card(int card[5], int num)
{
num++;
for(int i = 0 ; i<=num; i++)
if(card[i] != 99)
print_card(card[i]);
else
printf(" XX ");
puts("");
} //카드목록을 보여주는 함수
void show()
{
Sleep(1000);
system("cls");
SetColor(WHITE,VIOLET);
printf("당신은 %d번 플레이어입니다.\n\n\n",myPlayerNumber);
SetColor(WHITE,BLACK);
for(int i = 0 ; i < 5 ; i++)
{
if(i==myPlayerNumber)
{
printf("\t\t나의 카드는 : ");
if(menu =='3')
display_card(myCard,cardTurn+1);
else
display_card(myCard,cardTurn);
}
else
{
printf("\t\tplayer%d의 카드는 : ",i);
display_card(playerCard[i],cardTurn-1);
}
}
}
void playGame(int menu)
{
switch(menu)
{
case '1':
if(die == OFF)
{
while(1)
{
printf("배팅을 할 차례입니다.\n (콜 : 1번, 하프 : 2번, 다이 : 0번)");
printf("\n콜 : %d , 하프 : %d\n\n",willgiveMoney,allMoney/2);
fflush(stdin);
scanf("%c",&ctemp);
if(ctemp == '1' || ctemp == '2' || ctemp == '0')
break;
}
if(ctemp == '0')
die = ON;
memset(buf,0,256);
sprintf(buf,"%c",ctemp);
send(soc,buf,256,0);
}
else
{
printf("현재 다이 상태 입니다.\n");
fflush(stdin);
memset(buf,0,256);
sprintf(buf,"%c",'0');
send(soc,buf,256,0);
}
//나의 배팅정보를 보냄
break;
case '2':
sscanf(buf, "%d %d %d %d %d %d",&menu,&playerCard[0][cardTurn],&playerCard[1][cardTurn],&playerCard[2][cardTurn],&playerCard[3][cardTurn],&playerCard[4][cardTurn]);//각 플레이어의 2번재 카드를 저장
if(die == OFF)
show();
else
{
Sleep(1000);
system("cls");
printf("다이상태입니다. \n게임이 끝날때까지 기다리숑!");
}
cardTurn++;
//카드를 받음
break;
case '3':
cardTurn=2;
show();
//마지막카드확인
break;
case '5':
int a, b;
sscanf(buf,"%d %d %d",&menu,&a,&b);
betting(a,b);
if(b == 0)
for(int i = 0 ; i < 5 ; i++)
if(a == i)
for(int p = 0 ; p < cardTurn; p++)
playerCard[a][i] = 99;
fflush(stdin);
//memset(buf,0,256);
recv(soc, buf, 256,0);
sscanf(buf,"%d %d %d %d %d %d %d",&allMoney, &willgiveMoney, &playerMoney[0], &playerMoney[1], &playerMoney[2], &playerMoney[3], &playerMoney[4]);
//배팅을한결과보여줌
break;
case '6':
for(int i = 0 ; i < 5 ; i++)
{
sscanf(buf,"%d %d %d %d %d %d %d %d",&menu, &itemp, &playerCard[i][0],&playerCard[i][1],&playerCard[i][2],&playerCard[i][3],&playerCard[i][4],&winner);
memset(buf,0,256);
if(i != 4)
recv(soc, buf, 256, 0);
}
for(int i = 0 ; i < 5 ; i++)
{
printf("player %d : ",i);
display_card(playerCard[i],3);
puts("");
}
printf("\n승자는 : %d player 입니다.\n",winner);
Sleep(10000);
break;
case '9':
while(1)
{
printf(" 어떤카드를 공개하겠습니까?(왼쪽카드 : 0, 오른쪽카드 : 1) : ");
fflush(stdin);
scanf("%d",&itemp); //공개할 카드 번호를 선택
if(itemp == 0 || itemp == 1)
break;
}
if(itemp==0)
sprintf(buf,"%d",myCard[0]);
else
sprintf(buf,"%d",myCard[1]);
send(soc,buf,256,0); //공개할 카드 번호를 보냄
break;
}
}
void betting(int player ,int sel)
{
switch(sel)
{
case 1:
printf("\n\n%d번 플레이어가 콜을 했습니다.\n",player);
printMoney(player);
break;
case 2:
printf("\n\n%d번 플레이어가 하프를 했습니다.\n",player);
printMoney(player);
break;
case 0:
printf("\n\n%d번 플레이어가 다이를 했습니다.\n",player);
printMoney(player);
break;
}
}
void printMoney(int player)
{
printf("\n%d번 플레이어의 남은 돈은 %d원 입니다.\n\n",player,playerMoney[player]);
}
'Code > socket' 카테고리의 다른 글
[SOCKET]1:1 chatting server (0) | 2011.09.03 |
---|---|
[SOCKET]1:1 chating client (0) | 2011.09.03 |
[SOCKET]chating server for test (0) | 2011.09.03 |
[SOCKET]chating client for test (0) | 2011.09.03 |