猜数字游戏源码

client(玩家A)

#define  BUF_SZIE 64
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32")
#include <iostream>
#include <string>
#include <conio.h>
#include <Windows.h>
using namespace std;

char buf_rec[BUF_SZIE];
char buf_send[BUF_SZIE];
DWORD WINAPI funProc(LPVOID lpParameter);

int retVal;
int number;
bool myturn=true;
int result(int m,int num){
	int A=0,B=0;//数字对,位置对
	char ch1[5],ch2[5];
	itoa(m,ch1,10);
	itoa(num,ch2,10);
	for(int i=0;i<4;++i){
		for(int j=0;j<4;++j){
			if(ch1[i]==ch2[j]){
				A++;
				if(i==j)
					B++;
			}
		}
	}
	return 10*A+B;
}

SOCKET sHost;
int main(int argc, char* argv[])
{
	HANDLE hThread;
	hThread=CreateThread(NULL,0,funProc,NULL,0,NULL);
	CloseHandle(hThread);

	WSADATA wsd;
	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		printf("WSAStartup failed!\n");
		return -1;
	}

	/*创建套接字*/
	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
	if(INVALID_SOCKET == sHost)
	{
		WSACleanup();
		return  -1;
	}

	/*设置服务器地址*/
	SOCKADDR_IN     servAddr;
	servAddr.sin_family =AF_INET;
	servAddr.sin_addr.s_addr = inet_addr("219.245.81.15");
	servAddr.sin_port = htons((short)4999);
	int nServAddlen  = sizeof(servAddr);

	/*连接服务器*/
	while(1){
		retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));   
		if(retVal==0)
			break;
	}
	if(SOCKET_ERROR == retVal)
	{   
		closesocket(sHost);
		WSACleanup();
		return -1;
	}

	/*向服务器发送数据*/
	while(cin>>buf_send){
		if(*buf_send>'0'&&*buf_send<='9'&&myturn){//如果输入的是数字,且轮到自己
			retVal=send(sHost, buf_send, strlen(buf_send), 0);
			myturn=false;
			char buf[4]={*buf_send,*(buf_send+1),*(buf_send+2),*(buf_send+3)};
			if(atoi(buf)==number){//如果猜对了
				cout<<"You Win! The number is:"<<number<<endl;
				myturn=true;
			}
			else
				cout<<result(atoi(buf),number)<<endl;
		}
		else if(*buf_send>'0'&&*buf_send<='9'&&!myturn){//是数字,轮不到自己
			cout<<"Not your turn!"<<endl;
		}
		else
			retVal=send(sHost, buf_send, strlen(buf_send), 0);
	}
	closesocket(sHost);	
	WSACleanup();

	getchar();
	return 0;
}

DWORD WINAPI funProc(LPVOID lpParameter){
	while (1)
	{
		retVal = recv(sHost, buf_rec, BUF_SZIE, 0);
		if(*buf_rec!=0){
			if('0'<*buf_rec&&*buf_rec<='9'&&*(buf_rec+4)!='@'){//如果收到数字
				myturn=true;
				int m=1000*(*(buf_rec)-'0')+100*(*(buf_rec+1)-'0')+10*(*(buf_rec+2)-'0')+*(buf_rec+3)-'0';
				if(m==number){
					cout<<"You Lose! The number is:"<<m<<endl;
					myturn=false;
				}
				else
					cout<<"---->"<<m<<'\t'<<result(m,number)<<endl;
	
			}
			else if(*(buf_rec+4)=='@'){
				char str[4]={*buf_rec,*(buf_rec+1),*(buf_rec+2),*(buf_rec+3)};
				number=atoi(str);
				cout<<"Begin:"<<endl;
			}
			else{
				cout<<"dct: ";
				char* cp=buf_rec;
				while(*cp!=0){
					cout<<*cp;
					cp++;
				}
				cout<<endl;
				ZeroMemory(buf_rec, BUF_SZIE);
			}		
		}
	}
	return 0;
}


server(玩家B)

#include <stdio.h>
#define  BUF_SIZE    64
#include<WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include<conio.h>
#include <Windows.h>
#include<ctime>
using namespace std;
char buf_rec[BUF_SIZE];
char buf_send[BUF_SIZE];
DWORD WINAPI funProc(LPVOID lpParameter);
int retVal;
SOCKET sClient;
int number;
bool myturn=false;

int result(int m,int num){
	int A=0,B=0;//数字对,位置对
	char ch1[5],ch2[5];
	itoa(m,ch1,10);
	itoa(num,ch2,10);
	for(int i=0;i<4;++i){
		for(int j=0;j<4;++j){
			if(ch1[i]==ch2[j]){
				A++;
				if(i==j)
					B++;
			}
		}
	}
	return 10*A+B;
}
int rand_int(){
	srand(time(NULL));
	int a,b,c,d;
	while(1){
		a=rand()%10;
		if(a!=0)
			break;
	}
	while(1){
		b=rand()%10;
		if(b!=a)
			break;
	}
	while(1){
		c=rand()%10;
		if(c!=a&&c!=b)
			break;
	}
	while(1){
		d=rand()%10;
		if(d!=a&&d!=b&&d!=c)
			break;
	}
	return 1000*a+100*b+10*c+d;
}
int main(int argc, char* argv[])
{
	HANDLE hThread;
	hThread=CreateThread(NULL,0,funProc,NULL,0,NULL);
	CloseHandle(hThread);

	
	/*初始化套结字动态库*/
	WSADATA  wsd;
	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
	{
		printf("WSAStartup failed!\n");
		return 1;
	}

	/*创建套接字*/
	SOCKET sServer;
	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if(INVALID_SOCKET == sServer)
	{
		printf("socket failed!\n");
		WSACleanup();
		return  -1;
	}

	/*服务器套接字地址*/
	SOCKADDR_IN  addrServ;
	addrServ.sin_family = AF_INET;
	addrServ.sin_port = htons(4999);
	addrServ.sin_addr.s_addr = INADDR_ANY;      

	/*绑定套接字*/
	retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
	if (SOCKET_ERROR == retVal)
	{   
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	/*开始监听*/
	retVal = listen(sServer, 1);
	if(SOCKET_ERROR == retVal)
	{       
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	/*接受客户端请求*/
	sockaddr_in addrClient;
	int addrClientlen = sizeof(addrClient);
	sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
	if(INVALID_SOCKET == sClient)
	{
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	/*接收客户端数据*/

	number=rand_int();
	cout<<"Begin:"<<endl;
	itoa(number,buf_send,10);
	*(buf_send+4)='@';
	retVal=send(sClient,buf_send,BUF_SIZE,0);
	ZeroMemory(buf_rec, BUF_SIZE);
	while (cin>>buf_send){
		if(*buf_send>'0'&&*buf_send<='9'&&myturn){//如果输入的是数字,且轮到自己
			retVal=send(sClient,buf_send,BUF_SIZE,0);
			myturn=false;
			char buf[4]={*buf_send,*(buf_send+1),*(buf_send+2),*(buf_send+3)};
			if(atoi(buf)==number){
				myturn=true;
				cout<<"You Win! The number is:"<<number<<endl;
				number=rand_int();
				cout<<"Begin:"<<endl;
				itoa(number,buf_send,10);
				*(buf_send+4)='@';
				retVal=send(sClient,buf_send,BUF_SIZE,0);
			}
			else
				cout<<result(atoi(buf),number)<<endl;
		
		}
		else if(*buf_send>'0'&&*buf_send<='9'&&!myturn)
			cout<<"Not your turn!"<<endl;
		else
			retVal=send(sClient,buf_send,BUF_SIZE,0);
		
		
	}

	/*退出*/
	closesocket(sServer);
	closesocket(sClient);
	WSACleanup();
	getchar();

	return 0;
}
DWORD WINAPI funProc(LPVOID lpParameter){
	while(1){
		retVal = recv(sClient, buf_rec, BUF_SIZE, 0);
		if(*buf_rec!=0){
			if('0'<*buf_rec&&*buf_rec<='9'){//如果收到数字
				myturn=true;
				int m=1000*((int)*(buf_rec)-'0')+100*((int)*(buf_rec+1)-'0')+10*((int)*(buf_rec+2)-'0')+(int)*(buf_rec+3)-'0';
				if(m==number){
					cout<<"You Lose! The number is:"<<m<<endl;
					myturn=false;
					number=rand_int();
					cout<<"New Begin:"<<endl;
					itoa(number,buf_send,10);
					*(buf_send+4)='@';
					retVal=send(sClient,buf_send,BUF_SIZE,0);
				}
				else
					cout<<"---->"<<m<<'\t'<<result(m,number)<<endl;
	
			}
			else{
				cout<<"xct: ";
				char* cp=buf_rec;
				while(*cp!=0){
					cout<<*cp;
					cp++;
				}
			}
			cout<<endl;
			ZeroMemory(buf_rec, BUF_SIZE);
		}		
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值