windows中猜数字游戏与TCP通信

//server
#include<iostream>
using namespace std;
#include<Winsock2.h>
#include<stdlib.h>
#include<time.h>
#include<vector>
#include<string>
#include<Windows.h>
#define _LISTEN_SUM_ 5
#define _IP_ "127.0.0.1"
#define _PORT_ 8080
#pragma comment(lib,"Ws2_32.lib")
#define _CRT_SECURE_NO_WARNINGS
#define _SIZE_ 256
vector<string> user_ip(_SIZE_);
int scos[_SIZE_];//对应相应用户IP的游戏次数
int user_index = 0;
char result[20];//存储游戏结果,排名
int startup(char*ip, int port)
{
	int sock = socket(AF_INET, SOCK_STREAM, 0);//创建套接字
	if (sock < 0)
	{
		printf("sock");
		exit(1);
	}
	struct sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port = htons(_PORT_);
	local.sin_addr.s_addr = inet_addr(_IP_);
	if (bind(sock, (struct sockaddr*)&local, sizeof(local))<0)//绑定端口号
	if (sock < 0)
	{
		printf("bind");
		exit(2);
	}
	if (listen(sock, _LISTEN_SUM_) < 0)//设置监听状态
	{
		printf("listen");
		exit(3);
	}
	return sock;

}

void menu(int new_sock)//向用户打印游戏菜单
{
	char buf[1024] = "--------------------------\n1:start play\n2:restart play\n0:quit play\n--------------------------\n";
	send(new_sock, buf, sizeof(buf)-1, 0);
}
int main()
{
	WSADATA wsadata;
	WSAStartup(0x0202, &wsadata);             //初始化winsock
	int sock = startup(_IP_, _PORT_);//获取服务器套接字
	struct sockaddr_in client;
	int len = sizeof(client);
	while (1)
	{
		int new_sock = accept(sock, (struct sockaddr*)&client, &len);//接收用户连接
		user_ip[user_index] = inet_ntoa(client.sin_addr);//存储用户IP
		scos[user_index] = 0;//初始化用户游戏次数
		if (new_sock < 0)
		{
			printf("new_sock");
			continue;
		}
		//cout << "receive sock" << new_sock << endl;
		while (1)
		{
			menu(new_sock);       //给客户端发送游戏指示
			//	play(new_sock);
			char buf[1024];
			buf[0] = ‘\0‘;
			srand(unsigned int(time(NULL)));
			int num = rand() % 100;    //产生随机数
			int ret = 0;
			char msg[1024];
			recv(new_sock, buf, sizeof(buf)-1, 0);//接收客户端用户选择:开始游戏还是退出
			ret = atoi(buf);//判断用户输入
			switch (ret)
			{
			case 2:
				strcpy(msg, "your restart play");//重新开始游戏
				send(new_sock, msg, sizeof(msg)-1, 0);
				continue;
			case 0:
				strcpy(msg, "your are quit");//退出游戏
				send(new_sock, msg, sizeof(msg)-1, 0);
				return 0;
			case 1:
				strcpy(msg, "your are start");//开始游戏
				send(new_sock, msg, sizeof(msg)-1, 0);
			}
			while (1)
			{
				memset(buf, ‘\0‘, sizeof(buf));
				memset(msg, ‘\0‘, sizeof(msg));
				recv(new_sock, buf, sizeof(buf)-1, 0);//接收用户输入数值
				//cout << buf << endl;
				ret = atoi(buf);//转化为数字进行比较
				if (ret > num)//用户输入数字较大
				{
					strcpy(msg, "your input is biger");
					send(new_sock, msg, sizeof(msg)-1, 0);//向用户发送游戏结果:输入数较大
					scos[user_index]++;//游戏次数加1
				}
				else if (ret < num)//用户输入数字较小
				{
					strcpy(msg, "your input is smaller");
					send(new_sock, msg, sizeof(msg)-1, 0);//向用户发送游戏结果:输入数较小
					scos[user_index]++;//游戏次数加1
				}
				else//用户猜对了
				{
					strcpy(msg, "you are right");
					int tmp[_SIZE_] ;
					//在另一个数组进行排序,不更改原纪录数组
					for (int i = 0; i <= user_index; ++i)//排序所有用户游戏次数,得到排名
					{
						tmp[i] = scos[i];
					}
					int flag = 0;
					//冒泡排序得到排行榜
					for (int i = 0; i <= user_index - 1; ++i)
					{
						flag = 0;
						for (int j = 0; j <= user_index - i - 1; ++j)
						{
							if (tmp[j]>tmp[j + 1])
							{
								swap(tmp[j], tmp[j + 1]);
								flag = 1;
							}

							if (flag == 0)//冒泡排序优化:如果已经有序,直接退出循环
								break;
						}
					}
					int top = 0;//存储排名
					for (int i = 0; i <= user_index; ++i)
					{
						if (tmp[i] == scos[user_index])
						{
							//排名从一开始
							top = i + 1;
							break;
						}
					}
					//cout << scos[user_index] << " " << top;
					sprintf(result, "you IP is %s,you play %c counts,is top %c", user_ip[user_index].c_str(),scos[user_index]+‘0‘,top+‘0‘);//向客户输出猜测次数,并返回排名
					strcat(msg,result);
					send(new_sock, msg, sizeof(msg)-1, 0);//向用户发送游戏结果
					scos[user_index] = 0;//重置猜测次数为0
					break;
				}
			}
		}
	}
	return 0;
}
//client
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<Winsock2.h>
#include<stdlib.h>
#define _IP_ "127.0.0.1"
#define _PORT_ 8080
#pragma comment(lib,"Ws2_32.lib")
int main()
{
	WSADATA wsadata;
	WSAStartup(0x0202, &wsadata);                //初始化winsock
	int sock = socket(AF_INET, SOCK_STREAM, 0);//客户端产生套接字,不需绑定
	if (sock < 0)
	{
		printf("sock");
		exit(1);
	}
	struct sockaddr_in remote;
	remote.sin_family = AF_INET;
	remote.sin_port = htons(_PORT_);
	remote.sin_addr.s_addr = inet_addr(_IP_);
	int ret = connect(sock, (struct sockaddr*)&remote, sizeof(remote));//连接服务器
	//gets(buf);
	while (1)
	{
		//play(sock);
		char buf[1024];
		buf[0] = ‘\0‘;
		recv(sock, buf, sizeof(buf)-1, 0);//接收服务器端游戏说明
		cout << buf << endl;//打印游戏指示
		gets(buf);//接收用户选择
		send(sock, buf, sizeof(buf)-1, 0);//发送选择
		recv(sock, buf, sizeof(buf)-1, 0);//接收反馈信息
		if (strcmp(buf, "your restart play") == 0)//根据反馈信息得到用户接下来动作
			continue;//重新开始游戏
		else if (strcmp(buf, "your are quit") == 0)
			return 0;//退出游戏
		else if (strcmp(buf, "your are start") == 0)//开始游戏
		{
			cout << "start play" << endl;
			cout << "please input num in 0~99" << endl;
		}
		while (1)
		{
			printf("please input num:");

			gets(buf);//输入数值
			send(sock, buf, sizeof(buf)-1, 0);//想服务器发送用户数值
			//memset(buf, ‘\0‘, sizeof(buf));
			recv(sock, buf, sizeof(buf)-1, 0);//接收用户反馈信息
			cout << buf << endl;
			if (strncmp(buf, "you are right", strlen("you are right")) == 0)//猜对退出
			{

				cout << "you win" << endl;
				break;
			}
			memset(buf, ‘\0‘, sizeof(buf));//重置buf
		}
	}
}

时间: 2024-12-21 15:03:43

windows中猜数字游戏与TCP通信的相关文章

用MFC完成一个简单的猜数字游戏: 输入的四位数中,位置和数字都正确为A,数字相同而位置不同的为B。

最近学习了MFC一些比较基础的知识,所以打算通过做一个简单的数字游戏来理解MFC的流程并进一步熟悉其操作. 在这里,我做了一个猜数字的小游戏.第一步当然是设计主界面,先给大家展示一下游戏界面: 主界面: 从这个主界面可以看到,它包含标题,菜单栏,工具栏. 标题是给人一个认识,这是什么游戏,标题设置为:“猜数游戏”: 而菜单栏和工具栏才是游戏的核心,它要保证能够完成游戏的基本功能. 菜单栏和工具栏是对应的,包含了”start“,"help","restart"这三个菜

【python小练习】简单的猜数字游戏

简单的猜数字游戏 前两天在论坛回答问题时候,看到一个猜数字的游戏,就在原来的基础上改了一下,玩一玩. 此程序,数字范围和尝试次数是事先设定好的,当然可以通过代码修改.经过测试,由于难度过大,我在其中加入的作弊功能,聪明的你一定能发现啦~ 代码思路: 随机生成初始数 random.randint() 循环限制尝试次数 将输入的数与初始数进行比较,并输出比较结果 经过不断尝试,相等后会下载一张暴漫的图片,暴漫的图片分两种 imglist = re.findall('data-original-ima

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

猜数字游戏及rand()函数

#include<stdio.h>#include<stdlib.h>int main() { short number; short guess=0; number=rand()%100; number++; printf("猜数字游戏\n"); printf("该数字在1到100之间\n"); while(guess!=number) { printf("请你输入所猜数字:"); scanf("%hd&quo

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp

猜数字游戏代码

#include <iostream> #include <cstdlib> #include <conio.h> #include <ctime> using namespace std; //清屏 void ClearScreen() { system("cls"); } //显示菜单 void ViewMenu() { cout<<"******************"<<endl; c

LeetCode:Bulls and Cows - 猜数字游戏

1.题目名称 Bulls and Cows(猜数字游戏) 2.题目地址 https://leetcode.com/problems/bulls-and-cows/ 3.题目内容 英文:You are playing the following Bulls and Cows game with your friend: You write a 4-digit secret number and ask your friend to guess it, each time your friend g

新猜数字游戏--查看历史记录

猜数字游戏,就是随机生成一个数字,猜这个数字的大小,输入的值会有提醒比真值大还是小.这个新是说通过加入队列来实现了可以查看之前输入过得值. 1 # encoding = utf-8 2 from random import randint 3 # 引入队列 4 from collections import deque 5 6 N = randint(0,100) 7 # history队列能够存储5个值 8 history = deque([],5) 9 10 def guess(k): 11

Java完成简单猜数字游戏

猜数字游戏v1.0 实现了自定义区间的游戏玩法,并能在游戏结束后继续下一轮,这是其他程序没有兼顾的,希望有帮助,最后也希望有人愿意帮我解决代码优化的问题,谢谢. /*需求: *1. 完成一个猜数字游戏,数据区间由玩家自定义,游戏开始后针对玩家输入的值,给出一个缩小版的指导区间: *2. 结束一轮游戏后,玩家可以选择是否继续玩耍: *思路: *1. 创建一个指定区间int类型的随机数,区间由玩家指定: *2. 针对玩家猜的数据,比较后给出判断,大了.小了可以给出一个指导区间,直到猜对为止,记录猜的