質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C++

    4522questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

はずれ処理のプログラム

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 357

Asahi_1115

score 7

1対1通信で爆弾ゲームのようなものを作っています

1~10の乱数のうち、1つがはずれで交互に数字を選んでいってはずれを引くまで繰り返す流れのつもりなのですが、はずれを引いた時のプログラムをどう書けばいいか分かりません。
do以外の繰り返し処理に変えたほうがいいのでしょうか?

また、乱数sはサーバー側にしかないのでクライアント側でのはずれ判定ができません。
サーバー側がクライアント側から受け取った数字を判定すればよいのでしょうか?

失笑もののプログラムかもしれませんがどうかご助言ください

サーバ側

#include <stdio.h>
#include <io.h>//基本入出力関数
#include <winsock2.h>
#include<stdlio.h>
#include<time.h>

#define BUF_LEN 100//入出力バッファサイズ
int main()
{
    WSADATA wsaData;
    SOCKET sock0;
    struct sockaddr_in addr;
    struct sockaddr_in client;
    int len;
    SOCKET sock;

    char buf[BUF_LEN];//入出力バッファ

    // winsock2の初期化
    WSAStartup(MAKEWORD(2, 0), &wsaData);

    // ソケットの作成
    sock0 = socket(AF_INET, SOCK_STREAM, 0);

    // ソケットの設定(アドレス構造体の設定)
    addr.sin_family = AF_INET;//インターネットを使用する
    addr.sin_port = htons(12345);//サーバ(自分自身)のポート番号
    addr.sin_addr.S_un.S_addr = INADDR_ANY;//IPアドレスすべての値指定

    //ソケットのディスクリプタとアドエス構造体を結びつける
    bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

    // TCPクライアントからの接続要求を待てる状態にする(待ちクライアント数指定)
    listen(sock0, 5);

    // TCPクライアントからの接続要求を受け付ける
    printf("クライアントからの接続待ち\n");
    len = sizeof(client);
    sock = accept(sock0, (struct sockaddr *)&client, &len);

    int s;
    srand(time(NULL)); //乱数の初期化
    s = rand()%10+1; //1~10のランダムな数

    //送受信処理
    int cnt;
    do{
        printf("1~10の数字を選んでください...。\n");
        memset(buf, 0, sizeof(buf));//送受信バッファ0クリア
        _read(0, buf, sizeof(buf));//キーボードから入力
        send(sock, buf, sizeof(buf), 0);//送信
        printf("相手が選んでいます...。\n");
        memset(buf, 0, sizeof(buf));
        recv(sock, buf, sizeof(buf), 0);//受信
        printf("[%d]相手の選んだ数字=%s\n", cnt,buf);
        cnt++;
    } 
    // TCPセッションの終了
    closesocket(sock);

    // winsock2の終了処理
    WSACleanup();
    return 0;
}


クライアント側

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <io.h>//基本入出力関数
#include <winsock2.h>
#define BUF_LEN 100//入出力バッファサイズ
int main()
{
    WSADATA wsaData;
    struct sockaddr_in server;
    SOCKET sock;
    char buf[BUF_LEN];//入出力バッファ

    // winsock2の初期化
    WSAStartup(MAKEWORD(2, 0), &wsaData);

    // ソケットの作成
    sock = socket(AF_INET, SOCK_STREAM, 0);

    // 接続先指定用アドレス構造体の準備
    server.sin_family = AF_INET;//インターネット使用
    server.sin_port = htons(12345);//接続先ポート番号
    server.sin_addr.S_un.S_addr = 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;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

はずれを引いた時のプログラムをどう書けばいいか分かりません。

状態遷移表を用いたプログラムにするのが一般的かと思います。

また、乱数sはサーバー側にしかないのでクライアント側でのはずれ判定ができません。
サーバー側がクライアント側から受け取った数字を判定すればよいのでしょうか?

一般的には不正行為(チート)への対策として、サーバー側で判定させるべきです。クライアント側で「はずれ」となる値を保持している場合、デバッガなどでメモリを参照すれば、比較的容易にハズレの値を知ることが出来ます。そうすると、際限なく勝ち続ける事ができるようになります。

もちろん全てをサーバー側で行うと、サーバー側の負荷が大きくなります。不正行為を容易に行える可能性を承知の上で、クライアント側に「はずれ」の値を保持させ、クライアント側で判定する事もあります。例えば今回のようなゲーム内容の場合、勝率は必ず50%前後になるはずなので、勝率の統計をとれば不正行為があったことを容易に予想できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    4522questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。