题目三:猜数游戏
软件名:猜数游戏(分服务器端和客户端两部分)
功能:游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生一个1—100之间的随机数供游戏者猜,游戏者从客户端输入一个数值,如果该数比设定的数大,软件提示:“大了”,如果小,软件提示“小了”,若相等返回“猜对了,你共猜了*次”。服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。
编程语言及工具:自选(如VB、JAVA、C#、Delphi、VC)
描述:
服务器端:接收客户端的命令请求并提供相应的服务。
客户端:完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示。主要的命令有:
1.CONNECT IP地址 端口号
指定游戏服务器的IP地址和端口号,连接到服务器。
响应:连接成功/失败。
2.LOGIN 用户名
用户登录,报告服务器玩家的名字。
响应:成功/失败。
3.GUESS 数字
猜数。
响应:大了/小了/对了。
4.LISTTOP10
请求显示TOP10排行榜。
响应:显示TOP10排行榜。
5.EXIT
退出游戏。
Client:
#include<iostream>
#include<winsock2.h>
/* interfAcer */
/*欢迎访问我的csdn blog http://blog.youkuaiyun.com/nibiru_holmes*/
#pragma comment (lib,"ws2_32")
using namespace std;
int main(int argc, char * argv[])
{
while (TRUE) {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //创建套接字
sockaddr_in sockAddr;
sockAddr.sin_family = PF_INET;
sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockAddr.sin_port = htons(827);
char szBufferAccpect[MAXBYTE] = { "NULL" }; //接收服务器端发来的消息储存变量
char szBuffer[MAXBYTE] = { "NULL" };
char szBuffer1[65595] = { "NULL" };
char usercheck[10] = { "login" };
printf("I'm Client\r\n");
connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR)); //给服务器端发送TCP链接请求
cout << "connected to server" << endl;
while (TRUE) {
cout << "Client:";
memset(szBuffer, 0, sizeof(szBuffer)); //清理缓冲区
cin >> szBuffer; //读入用户输入
if (!strcmp(szBuffer, usercheck)) { //判断用户是否要login
send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);
printf("yourname:"); \
memset(szBuffer, 0, sizeof(szBuffer));
cin >> szBuffer;
send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);
continue;
}
else if (!strcmp(szBuffer, "exit")) {
cout << "exciting..\r\n";
break;
}
send(s, szBuffer, strlen(szBuffer) + sizeof(char), NULL);
memset(szBufferAccpect, 0, sizeof(szBufferAccpect));
recv(s, szBufferAccpect, MAXBYTE, NULL);
cout << "Server:";
cout << szBufferAccpect << endl;
}
closesocket(s); //关闭套接字 s
WSACleanup();
}
return 0;
}
Server:
<pre name="code" class="cpp">#include<winsock2.h>
/* interfAcer */
/*欢迎访问我的csdn blog http://blog.youkuaiyun.com/nibiru_holmes*/
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include<iostream>
#include <VersionHelpers.h>
#include <string.h>
#pragma comment (lib,"ws2_32")
using namespace std;
int check = 5;
void rands() { //产生随机数
int nl = 0;
int nj = 10;
nl = rand() % nj;
check = nl;
}
int main() {
char top[MAXBYTE*2] = {NULL};
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData); //初始化
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //套接字s用于监听
sockaddr_in sockaddr;
sockaddr.sin_family = PF_INET;
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_port = htons(827);
sockaddr_in clientAddr = { NULL };
int nSize = sizeof(SOCKADDR);
SOCKET clientSock;
bind(s, (SOCKADDR*)&sockaddr, sizeof(sockaddr)); //绑定套接字 ip,端口号
char szBuffer[MAXBYTE] = {NULL};
char szBufferAccpet[MAXBYTE] = { NULL };
char RecvBuf[1024] = {NULL};
char SendBuf[MAXBYTE] = { "hi" };
char Usercheck[6] = {"login"};
char User[MAXBYTE] = {"User"};
char gettop[3] = { "-1" };
char top10[10][30] = {NULL};
char toptest[10][2] = {NULL};
int usersum = 0;
int read = 0;
/// int check = 5;
int Recv = 0;
listen(s, 1); //进行监听
while (TRUE) {
clientSock = accept(s, (SOCKADDR*)&clientAddr, &nSize); //接受客户端的TCP请求
printf(" 接受到一个连接 From:%s:%d \r\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
rands(); //产生随机数
printf("the answer: %d", check);
char sum[2] = "1"; //尝试次数
while (true) {
read = recv(clientSock, RecvBuf, 1024, 0); //接收客户端消息
if (read <= 0) {
break;
}
printf(RecvBuf); //打印接收的消息
memset(SendBuf, 0, sizeof(SendBuf)); //清理缓存区
Recv = atoi(RecvBuf); //将char转换为int
if (!strcmp(RecvBuf,gettop)) { //判断客户端发送的消息是否为 get top 10
memset(top,0,MAXBYTE);
printf("get top\r\n");
for (int j = 0; j < 10; j++) {
strcat(top, top10[j]);
printf(" top10 %s", top10[j]);
}
send(clientSock, top, MAXBYTE, 0); //给客户端发送top10 信息
}
else if (!strcmp(RecvBuf, Usercheck)) { //判断客户端发送的消息是否为 login
memset(User,0,MAXBYTE);
printf("login \r\n");
recv(clientSock, RecvBuf, 1024, 0);
printf("login new user:%s\r\n",RecvBuf);
strcat(User,RecvBuf); //将用户名存入 user表
strcat(User, " ");
}
else if (Recv > check) { //猜解的数字 是否太大
strcat(SendBuf, "too big:");
strcat(SendBuf, sum);
printf("too big\r\n");
sum[0]++;
send(clientSock, SendBuf, MAXBYTE, 0);
}
else if (Recv == check) { //是否猜解正确
strcat(SendBuf, "you are right!! test:");
strcat(SendBuf, sum);
//strcat(top, inet_ntoa(clientAddr.sin_addr)); //获取客户端ip 并记录在top10
printf("suersum:%d !!!\r\n",usersum);
int i = usersum-1;
//if (i < 0) { i = 0; }
printf("sum:%s toptest:%s!!!\r\n", sum,toptest[i]);
for ( i ; (i >=0) && (strcmp(sum,toptest[i])<0); i--) { //寻找本次猜解在top10中的位置
printf(" for i=:%d !!!\r\n", i);
strcat(top10[i + 1], top10[i]);
memset(top10[i], 0, 30);
strcat(toptest[i + 1], toptest[i]);
memset(toptest[i], 0, 2);
//strcpy(top10[i]," ");
}
i++;
if (i < 11) { //将本次用户名写入top10
printf("write to top10 !!!\r\n");
printf("i= %d\r\n",i);
memset(top10[i], 0, 30);
strcat(top10[i], " UserName:");
strcat(top10[i], User);
strcat(top10[i], " test:");
strcat(top10[i], sum);
strcat(top10[i], "\r\n");
strcat(toptest[i], sum);
usersum++;
}
else { printf("isn't top10 !!!\r\n"); }
printf("right! %s\r\n", sum);
send(clientSock, SendBuf, MAXBYTE, 0);
strcpy(sum,"1");
}
else {
strcat(SendBuf, "too small:");
strcat(SendBuf, sum);
printf("too small\r\n");
sum[0]++;
send(clientSock, SendBuf, MAXBYTE, 0);
}
}
}
closesocket(clientSock);
closesocket(s);
WSACleanup();
return 0;
}