質問: inet_addr("*.*.*.*");//接続先IPアドレス // サーバに接続 connect(sock, (struct sockaddr *)&server, sizeof(server)); //受信送信処理 int cnt=1; do{ memset(buf, 0, sizeof(buf));//送受信バッファ0クリア printf("相手のが選んでいます...。\n"); recv(sock, buf, sizeof(buf), 0);//受信 printf("[%d]相手の選んだ数字= %s\n", cnt,buf); printf("1~10の数字を選んでください...。\n"); memset(buf, 0, sizeof(buf));//送受信バッファ0クリア _read(0, buf, sizeof(buf));//キーボードから入力 send(sock, buf, sizeof(buf), 0);//送信 cnt++; } // TCPセッションの終了 closesocket(sock); // winsock2の終了処理 WSACleanup(); return 0; } ```
回答: > > はずれを引いた時のプログラムをどう書けばいいか分かりません。 > > > 状態遷移表を用いたプログラムにするのが一般的かと思います。 > > また、乱数sはサーバー側にしかないのでクライアント側でのはずれ判定ができません。 > > サーバー側がクライアント側から受け取った数字を判定すればよいのでしょうか? > > > 一般的には不正行為(チート)への対策として、サーバー側で判定させるべきです。クライアント側で「はずれ」となる値を保持している場合、デバッガなどでメモリを参照すれば、比較的容易にハズレの値を知ることが出来ます。そうすると、際限なく勝ち続ける事ができるようになります。 もちろん全てをサーバー側で行うと、サーバー側の負荷が大きくなります。不正行為を容易に行える可能性を承知の上で、クライアント側に「はずれ」の値を保持させ、クライアント側で判定する事もあります。例えば今回のようなゲーム内容の場合、勝率は必ず50%前後になるはずなので、勝率の統計をとれば不正行為があったことを容易に予想できます。