ページ 11

宿題です。。。

Posted: 2010年8月25日(水) 09:10
by りょう
宿題でC言語を使ったゲームをつくらないといけないのですが、
てつだってくれませんか・・・?

関数を使った簡単なものがいいです


お願いします。

Re:宿題です。。。

Posted: 2010年8月25日(水) 09:21
by naohiro19
・ 自分はどこまで理解しているのか、学校ではどこまで習ったのか明確にしましょう
 ・ 自分で書いたソースプログラムがあるなら提示しましょう
 ・ (提示してある場合)自分が書いたソースプログラムはどこからどこまでなのか教えて下さい
 詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html

Re:宿題です。。。

Posted: 2010年8月25日(水) 10:32
by シエル
何を?

Re:宿題です。。。

Posted: 2010年8月25日(水) 10:43
by たかぎ
> 関数を使った

main関数でもよい?
関数を作るのではなく、使う必要があるのであれば、printfを呼び出すだけでもよい?

Re:宿題です。。。

Posted: 2010年8月25日(水) 14:30
by へろりくしょん
作ってみました。 こんぴゅーたとじゃんけんします。
どちらかが勝つまで繰り返します。

1つ関数を定義してそれを呼び出しています。
#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

static const char *Hand[/url] = {"ぐー", "ちょき", "ぱー"};

int main(int argc, char *argv[/url])
{
    int you, com;

    srand(time(NULL));
    if(argc < 1000){
        printf("じゃーんけーん\n");
        goto INPUT;
    }else{
        com = rand() % 3 + 1;
        you = argc - 1000;
        printf("you = %s   com = %s\n\n", Hand[you - 1], Hand[com - 1]);
        if(you == com){
            printf("あーいこーで\n");
            goto INPUT;
        }else goto JUDGE;
    }

INPUT:
    printf("\t[1]ぐー\n\t[2]ちょき\n\t[3]ぱー\ninput: ");
    scanf("%d", &you);
    main(you + 1000, NULL);

    return 0;

JUDGE:
    switch(you << 4 | com){
        case 0x12: case 0x23 : case 0x31: printf("あなたの勝ち\n"); break;
        case 0x21: case 0x32 : case 0x13: printf("COMの勝ち\n"); break;
    }

    return 0;
}
エラーチェックはしてません。
一応コンパイルが通る事は確認してますが実行はしてません。
とりあえずは動くはずです。 多分。


ちょっと貼り付け時にミスがあったようなので修正しました。 画像

Re:宿題です。。。

Posted: 2010年8月25日(水) 16:16
by ookami
ちょw これは良い地雷^^; りょうさんw これ提出したら絶対ホメられますよ。ボロが出ないようにしてくださいね!

Re:宿題です。。。

Posted: 2010年8月25日(水) 16:33
by バグ
現実逃避気味に勢いで作った。
後悔はしていないw
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

void input(int* number)
{
    printf("ところで答えは何番だと思う?【0~999】\n");
    scanf("%d", number);
}

int judge(int number, int answer)
{
    if (number > answer)
    {
        printf("すごく…大きいです…\n");
        return 0;
    }
    else if (number < answer)
    {
        printf("小さいこと言ってくれるじゃないの!\n");
        return 0;
    }
    else
    {
        printf("ウホッ!いい答え!\n");
        return 1;
    }
}

int repeat(void)
{
    int number = 0;

    for (; ;)
    {
        number = -1;
        printf("もう一度、やらないか?【やる=0、やらない=1】\n");
        scanf("%d", &number);

        if (number == 0 || number == 1)
        {
            break;
        }
        else
        {
            printf("ほら、遠慮しないで0か1を入れてみろよ\n");
        }
    }

    return number;
}

int main(void)
{
    int number = 0;
    int answer = 0;

    srand((unsigned)time(NULL));

    do
    {
        answer = rand() % 1000;

        do
        {
            input(&number);
        }
        while (judge(number, answer) == 0);
    }
    while (repeat() == 0);
}

Re:宿題です。。。

Posted: 2010年8月25日(水) 16:34
by シエル
吹きましたw

Re:宿題です。。。

Posted: 2010年8月25日(水) 16:52
by へろりくしょん
数当てゲームって奴ですね。
こうして見ると、いかに二分探索が強力なアルゴリズムか実感できますね。

#ところで、ここの掲示板の人たちは阿部さん好きですよね。

Re:宿題です。。。

Posted: 2010年8月25日(水) 17:51
by Tororo
>>バグs

びっくりさせないでくださいw

Re:宿題です。。。

Posted: 2010年8月25日(水) 17:53
by dic
for (; ;)
吹いたw

Re:宿題です。。。

Posted: 2010年8月25日(水) 18:39
by バグ
>>シエルさん
一番嬉しいリアクションです(笑)

>>へろりさん
阿部さんが好きな訳ではないのですが、ネタとして手っ取り早かったので(^_^;)

>>Tororoさん
ビックリさせてごめんなさい(笑)

>>dicさん
そこですか!?(笑)
普段は for (int i = 0; i < 10; ++i) みたいな書き方しているので、何も考えずに for(; ;) こう書いたんですが…(^_^;)

Re:宿題です。。。

Posted: 2010年8月25日(水) 18:44
by ookami
for涙目w

Re:宿題です。。。

Posted: 2010年8月25日(水) 18:46
by シエル
なるほどwそういう意味でしたかw

Re:宿題です。。。

Posted: 2010年8月25日(水) 19:08
by Dixq (管理人)
> りょうさん

こんばんは。
宿題お困りのようですね。
まず出来るところからやってみましょう。

現在どの辺まで出来ていますか?
もしジャンケンゲームを作れと言われたら作れそうですか?

最も簡単なゲームプログラムはやはりジャンケンでしょうか。
私も初めて作ったゲームはジャンケンでした。

ではジャンケンを作ることを検討してみましょう。

プログラムというものは初めから完成を目指すと挫折してしまいがちです。
解るところから作っていけばいいのです。

まずはじめに、ユーザーが0,1,2のいずれかの値を入力し、
コンピュータが0,1,2のいずれかの値を生成し、
それぞれその値を表示するだけのプログラムから始めてみましょう。

りょうさんがどのくらいC言語を学んでいらっしゃるかわかりませんが、とりあえずscanfなどは解りますか?
キーボードからの入力を受け付ける関数です。
解らないキーワードがあれば都度ぐぐりながらご覧ください。
ではプログラムを書いてみましょう。

#include <stdio.h>
#include <stdlib.h>

int main(){
int a, b;

scanf("%d",&a); //キーボードから入力した数値をaに格納

b = rand() % 3; //ランダムな値を0~2の値にしてbに格納

printf("a=%d, b=%d\n", a, b);//表示

return 0;
}

rand関数はランダムな値を生成する関数です。
%というのは割った余りを求める演算子です。0~2の値に変換しています。
後は表示しているだけですね。

今回は関数を使うという制約があるようなので、関数を使ってみましょう。
rand関数やprintf関数を既に使っているので、もしこれが制約なら満たしていることになりますが、
今回の質問の意図は自分で作った関数を使うという意味だと解釈します。

では、ユーザーが入力した数値の方がコンピュータが作った数値より大きければ「勝ち」と表示し、それ以外なら「負け」と表示する仕様を検討してみます。
そこで、勝敗を求める関数を作ってみましょう。
2つの値を渡し、第1引数が第2引数より大きければ1、それ以外なら0を返す関数を作ってみましょう。

#include <stdio.h>
#include <stdlib.h>

int Judge( int x, int y ){
if( x > y ){
return 1;
}
else{
return 0;
}
}

int main(){
int a, b, ret;

scanf("%d",&a); //キーボードから入力した数値をaに格納

b = rand() % 3; //0~2の乱数を格納

ret = Judge( a, b ); //勝敗を決める

printf("a=%d, b=%d\n", a, b);

if( ret == 0 ){
printf("負け");
}
else{
printf("勝ち");
}

return 0;
}

今回は勝敗を決めるJudge関数を自作しました。
この関数の返す値をしらべてmainで表示する文字を分ける処理をしています。

こうすれば●●をする関数といった具合に機能分担が関数ごとに出来そうですね。
ではジャンケンに応用するにはどうしたらよいでしょうか?
まず、ユーザーが入力する数値は0~2でなければなりませんが、今はそれ以外でも処理を続行してしまいます。
まずは、0~2以外ならエラーで終了する機能から実装してみましょう。
出来たらコードを投稿して見て下さい。
もし解らないところがあれば聞いて下さい。