合計 昨日 今日
インフォメーション: 当サイトは3/3~3/4に大規模なメンテを実施し大幅リニューアルします。そのため3/3~3/4に長時間の利用停止時間が発生します。ご了承ください。

当たりゲーム 改良

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

返信する

Advanced BBCode Box 3 :: ヘルプ ページ Advanced BBCode Box 3 (aka ABBC3)  
選択テキストを切り取る (カット) 選択テキストをコピー コピーしたテキストを貼り付け (ペースト) 選択したテキストから全ての BBCode タグを削除します。 箇条書きリスト 連番付き箇条書きリスト リスト項目 水平線 太字 斜体 下線 取り消し線 上付き文字 下付き文字 フェードイン / アウト テキスト グラデーション 正当テキスト 左揃え 中央ぞろえ 右揃え 整形済みテキスト
タブインデント挿入 コード 引用 本題と外れた内容を囲むオフトピックテキストを挿入します。 Web アドレス Eメール 画像を挿入します。 サムネイル画像を挿入します。 Youtube 動画 を挿入します。 ニコニコ動画を挿入します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
トピックのレビュー
このトピックはまだ解決していません
   

展開ビュー トピックのレビュー: 当たりゲーム 改良

Re: 当たりゲーム 改良

投稿記事 by purin52002 » 2017年4月15日(土) 09:45

こんにちは

cx,cy,ex,ey,point,iがhit内で定義されていないからじゃないでしょうか?
hit関数に引数として渡すか、グローバル変数にするかで解決できると思います。
(グローバル変数は個人的に好きじゃないので、引数で渡すことをお勧めしますw)

当たりゲーム 改良

投稿記事 by masuter » 2017年4月14日(金) 21:39

学校で以下のコードを書き換える課題が出ました。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//////////////////////////////////////////////////////////////////////
//
// シューティングゲームのプログラム shootingReplay.c
//
//////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include <stdlib.h> // system()
#include <windows.h> // Sleep()
#include <conio.h> // kbhit()
 
#define SIZE 10
 
// キーボードに合わせて移動
// 4なら左、6なら右
int main()
{
    int i, x, [code][/code]y;
    int cx = 0, cy = 0;//自機 ●(circle)の場所
    int ex = 5, ey = 5;//敵 ▲(enemy)の場所
    int key, r;
    int point = 0;
    int hist_cx[300], hist_cy[300];
    int hist_ex[300], hist_ey[300];
   
    for( i = 0; i < 300; i++ )//繰り返し
    {
        // キーが押されていたら、キーコードを取得する
        if(kbhit()) // キーが入力されていれば真
        {
            key = getch();//一文字入力、エコーバックなし
            if ( key == '4')
                cx--;
            else if ( key == '6')
                cx++;
            else if ( key == '8')
                cy--;
            else if ( key == '2')
                cy++;
            cx = ( cx + SIZE ) % SIZE; //ワープ
            cy = ( cy + SIZE ) % SIZE;
        }
        r = rand() % 4;
        if ( r == 0 )
            ex--;
        else if ( r == 1 )
            ex++;
        else if ( r == 2 )
            ey--;
        else if ( r == 3 )
            ey++;
        ex = ( ex + SIZE ) % SIZE; //ワープ
        ey = ( ey + SIZE ) % SIZE;
 
        //画面表示
        printf( "-------- Play Mode --------\n");
        for( y = 0; y < SIZE; y++ )
        {
            for( x = 0; x < SIZE; x++ )
            {
                if( x == cx && y == cy )
                    printf("●");
                else if( x == ex && y == ey )
                    printf("▲");
                else
                    printf(" ");
            }
            printf("\n");
        }
        hist_cx[i] = cx;
        hist_cy[i] = cy;
        hist_ex[i] = ex;
        hist_ey[i] = ey;
 
 
        //当たり判定
        if ( cx == ex && cy == ey )
            point++;
 
        printf("\n");
        printf(" (cx,cy) = (%d, %d)\n", cx, cy);
        printf(" (ex,ey) = (%d, %d)\n", ex, ey);
        printf(" point: %d time: %d\n", point, i);
        Sleep(10);// 1秒間(wait_timeミリ秒)何もしない
        system("cls");// 画面消去
    }
    printf( "┏ ┏━┓┏━┓┏┳┓┳━┓ ┏━┓┳  ┳┳━┓┳━┓ ┓\n");
    printf( "┃ ┃  ┓┣━┫┃┃┃┣┫   ┃  ┃┃  ┃┣┫  ┣┳┛ ┃\n");
    printf( "┗ ┗━┛┻  ┻┻  ┻┻━┛ ┗━┛┗━┛┻━┛┻┗┛ ┛\n");
    Sleep(3000);// 何もしない
    system("cls");// 画面消去
 
    for( i = 3; i >= 1; i-- ){
        printf( "┏ ┳━┓┳━┓┳━┓┳  ┏━┓ ┳  ┳ ┓\n");
        printf( "┃ ┣┳┛┣┫  ┣━┛┃  ┣━┫ ┗┰┛ ┃\n");
        printf( "┗ ┻┗┛┻━┛┻  ┗━┛┻  ┻  ┻  ┛\n");
        printf( "\n\n\n                   [ %d ]\n", i);//カウントダウン
        Sleep(1000);// 何もしない
        system("cls");// 画面消去
    }
 
    //再現
    point = 0;
    for( i = 0; i < 300; i++ )//300回繰り返し
    {
        cx = hist_cx[i];
        cy = hist_cy[i];
        ex = hist_ex[i];
        ey = hist_ey[i];
        printf( "------- Replay Mode -------\n");
        //画面表示
        for( y = 0; y < SIZE; y++ )
        {
            for( x = 0; x < SIZE; x++ )
            {
                if( x == cx && y == cy )
                    printf("●");
                else if( x == ex && y == ey )
                    printf("▲");
                else
                    printf(" ");
            }
            printf("\n");
        }
        //当たり判定
        if ( cx == ex && cy == ey )
            point++;
        printf("\n");
        printf(" (cx,cy) = (%d, %d)\n", cx, cy);
        printf(" (ex,ey) = (%d, %d)\n", ex, ey);
        printf(" point: %d time: %d\n", point, i);
        Sleep(10);// 1秒間(wait_timeミリ秒)何もしない
        system("cls");// 画面消去
    }
   
    return 0;
}

shootingReplay.c を以下の要件を満たすよう関数を使って書き換えること
1. gameover()、renew()関数の作成と使用。
2. 自機と敵機が当たった時に呼ばれる関数 hit を作成し、2箇所で呼ぶ。関数 hit() では 当たった事がわかるよう”HIT!”などと画面に表示させ、1秒待機させる。
3. 画面表示を行う関数show を作成し、2箇所で呼ぶ。show はint型引数cx,cy,ex,ey を持つ。

1.はできました。2.3.ができません。
まず、2.ですが、
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
・・・・・・・・・・・・・・
void renew(int wait_time) {
    Sleep(wait_time);// 1秒間(wait_timeミリ秒)何もしない
    system("cls");// 画面消去
}
void hit() {
    point++;
    printf("\n");
    printf(" (cx,cy) = (%d, %d)\n", cx, cy);
    printf(" (ex,ey) = (%d, %d)\n", ex, ey);
    printf(" point: %d time: %d\n", point, i);
}
・・・・・・・・・・・・・・
//当たり判定
if (cx == ex && cy == ey)
hit();
renew(10);
・・・・・・・・・・・・・・
//当たり判定
if (cx == ex && cy == ey)
hit();
renew(10);

としましたところ、座標とポイントの画面表示がされなくなりました。何が間違っているのでしょうか

ページトップ