Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中的一个游戏的while循环?_C_String_Sockets_While Loop - Fatal编程技术网

在C中的一个游戏的while循环?

在C中的一个游戏的while循环?,c,string,sockets,while-loop,C,String,Sockets,While Loop,我有一个猜字游戏,我需要重复,直到用户键入Q:。通常,答案的格式为a:answer。游戏正在使用套接字 我没有使用while(1),而是尝试使用while(buffer[0]!='Q'),但似乎不起作用 我如何让客户继续玩游戏 此外,我还需要告诉用户他正确通过了多少游戏 while(1) { FD_零(&readfds); FD_集(服务器_FD和读取FDS); int max_fd=服务器_fd; for(int i=0;i0) { FD_集(文件描述符和readfds); } if(文件描述

我有一个猜字游戏,我需要重复,直到用户键入
Q:
。通常,答案的格式为
a:answer
。游戏正在使用套接字

我没有使用
while(1)
,而是尝试使用
while(buffer[0]!='Q')
,但似乎不起作用

我如何让客户继续玩游戏

此外,我还需要告诉用户他正确通过了多少游戏

while(1)
{
FD_零(&readfds);
FD_集(服务器_FD和读取FDS);
int max_fd=服务器_fd;
for(int i=0;i0)
{
FD_集(文件描述符和readfds);
}
if(文件描述符>最大fd)
{
max_fd=文件描述符;
}
}
int return_value=select(max_fd+1,&readfds,NULL,NULL);
如果(返回_值==-1)
{
printf(“选择错误\n”);
}
if(FD_ISSET(server_FD和readfds))
{
如果((new_socket=accept(server_fd,(struct sockaddr*))和地址,
(socklen_t*)和addrlen))<0)
{
佩罗(“接受”);
}
发送(新的_套接字,问候语[0],strlen(问候语[0]),0);
发送(新的_套接字,问候语[1],strlen(问候语[1]),0);
for(int i=0;i问题,strlen(客户端\u挑战->问题),0);
打破
}
}
}
for(int i=0;i回答)=(strlen(缓冲区)-4))
{
字符存储[100];
for(int i=1;i回答);i++)
{
存储区[i-1]=缓冲区[2+i];
}
存储区[strcspn(存储区,“\r\n”)]=0;
if(strcmp(商店、客户挑战->回答)=0)
{
发送(文件描述符,正确,strlen(正确),0);
//printf(“O:祝贺-挑战通过!\n”);
}
其他的
{
发送(文件描述符,错误,strlen(错误),0);
发送(文件描述符,客户端挑战->应答,strlen(客户端挑战->应答),0);
}
//printf(“错误猜测-预期:%s”,客户机挑战->回答);}
}
其他的
{
发送(文件描述符,错误,strlen(错误),0);
发送(文件描述符,客户端挑战->应答,strlen(客户端挑战->应答),0);
}
//{printf(“错误猜测-预期:%s”,客户端挑战->回答);}
}
else if(缓冲区[0]=“Q”)
{
发送(文件描述符,结束,strlen(结束),0);
出口(1);
}
其他的
{
发送(文件描述符,错误,strlen(错误),0);
出口(1);
}
}
}
}

如果只有一个客户端,您只需执行以下操作即可

//启动游戏的实际函数
int play(){
int run=1;
while(运行){
//运行游戏
//如果比赛结束,
run=0;
}
返回0;//表示游戏优雅结束
}
int main(int argc,字符**argv){
int run=1;
int=0;
while(运行){
如果(play()){
//错误:游戏以不愉快的方式结束
}
//再次提示播放
如果(!再次播放){
run=0;
}
}
//再见
}
原因是变量
run
用于控制游戏流程。如果用户退出或出现问题,您可以将
run
设置为
0
,游戏将停止运行

如果有多个客户机,您可能需要查看。每次收到新连接时,都可以使用
pthread\u create
创建一个新线程,并将
play
函数设置为
start\u例程
,将
fd
设置为参数。例如,你可以试试看

int MAX_CLIENT=5;
结构pthread_参数{
int-fd;
};
无效*播放(无效*参数){
struct pthread_args*args=(struct pthread_args*)arg;
intfd=args->fd;
//开始比赛
}
int main(int argc,字符**argv){
pthread_t pth[MAX_CLIENT];
结构pthread_args pth_args;
int new_fd;
int i=0;
而(1){//服务器持续接收连接
//接受连接
new_fd=accept(/*…*/)
如果(新的_fd<0){
//错误:接受新连接
}
pth_args.fd=新的_fd;
int r=pthread_create(&pth[i],NULL,play,&pth_args);
if(!r){
//错误:正在创建线程
}
++一,;
}
}
附言:你也可以看看

我尝试使用while(buffer[0]!='Q')代替while(1),但这似乎不起作用

while(buffer[0]=='Q')
不起作用的原因是,当
while
检查条件时,缓冲区(假设它是在while循环之外声明的)可能不再是同一个缓冲区,因为您正在对所有客户端和