合計 昨日 今日

当たりゲーム 改良

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: masuter
[URL]
Date: 2017年4月14日(金) 21:39
No: 1
(OFFLINE)

 当たりゲーム 改良

学校で以下のコードを書き換える課題が出ました。
コード[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);

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

Name: purin52002
[URL]
中級者(10,724 ポイント)
Date: 2017年4月15日(土) 09:45
No: 2
(OFFLINE)

 Re: 当たりゲーム 改良

こんにちは

cx,cy,ex,ey,point,iがhit内で定義されていないからじゃないでしょうか?
hit関数に引数として渡すか、グローバル変数にするかで解決できると思います。
(グローバル変数は個人的に好きじゃないので、引数で渡すことをお勧めしますw)
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[15人]