みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

xcode 画像をランダムに並べ順番に押す

初めてですが質問よろしくお願いします。

iphone開発初心者です。

数字の画像をランダムに5×5に並べ、1から25まで順番に押していく、
というアプリを制作中なのですが行き詰まっています。

現在下記コードのようになっています。
画像を表示まではできたのですが、下記3つ、できればソースコードをお聞きしたいです。

(1)画像25個をランダムに表示する記述がわかりません
(今はとりあえずで同じ画像を1つ入れてます。(img1~img25のimg1を代入中))

(2)順番に押していく処理

(3)画像を押された時に音を出したい
- (IBAction)image:(id)sender {
AudioServicesPlaySystemSound(sound_1);
}
の部分をうまく入れこめばいいのかと思っていますが、その入れこみ方もわかりません。
AudioToolboxは追加済みです。

どなたかご教授よろしくお願いします。


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *path = [[NSBundle mainBundle] pathForResource:@"btn_1" ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:path];
AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain(url), &sound_1);

int yo = 5;
for(int i = 0;i<yo; i++){
UIImageView *imageView = [UIImageView new];
imageView.frame = CGRectMake(15+60*i, 100, 60, 60);
imageView.image = [UIImage imageNamed:@"img1.png"];
[self.view addSubview:imageView];
}

int f = 25;
for(int i = 0;i<f; i++){
UIImageView *imageView = [UIImageView new];
imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60);
imageView.image = [UIImage imageNamed:@"img1.png"];
[self.view addSubview:imageView];

}

int rand = arc4random()%f;
for(int i = 0; i<f; i++){
if(i == rand){
UIButton*button = [UIButton new];
button.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60);

[button setImage:[UIImage imageNamed:@"img1.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchDown];
[self.view addSubview:button];
}else{
UIImageView *imageView = [UIImageView new];
imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60);
imageView.image = [UIImage imageNamed:@"img1.png"];
[self.view addSubview:imageView];
}
}
}
- (IBAction)image:(id)sender {

AudioServicesPlaySystemSound(sound_1);

}
-(void)buttonTapped{


}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

投稿日時 - 2014-10-08 01:41:01

QNo.8782861

困ってます

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

> (1)画像25個をランダムに表示する記述がわかりません

疑似乱数を発生させる方法は、3つ。
ひとつは、C言語のrand()関数を使うこと。これはC言語の教科書にも、ネット上にも説明とサンプルがあると思うので、それで学んでください。
つぎは、BSDライブラリにあるarc4random()関数を使うこと。FreeBSDというUINX OSのライブラリですが、iOSでも使えます。これの特長は、rand()関数のように、srand()で疑似乱数の種を用意する必要がないこと。いきなりarc4random()を呼んで、乱数を取得できます。
さいごは、おなじBSDライブラリの、arc4random_uniform()関数を使うこと。arc4random()より精度が高い(乱数の出現に偏りが少ない)といわれています。
arc4random()は、0から符号なし32ビット整数の最大値の範囲で、整数値を返すので、0~24(計25個)の範囲で乱数を取得するには、

arc4random() % 25

と剰余を得ればいいです。
arc4random_uniform()は、符号なし32ビット整数を引数に持ち、

arc4random_uniform(25)

とすると、0~24の範囲の乱数を返します。

> (2)順番に押していく処理

ユーザ(人間)の起こすイベントを、プログラムで発生させる方法は、ありません。……と、ここではいっておきます。もし可能だとしても、アセンブリでプログラムが書けるくらいの技量が求められるでしょう。
いかにも画像が押されたかのようなふるまいを見せる、プログラムにするくらいでいいんじゃないですか?

> (3)画像を押された時に音を出したい

音が鳴らない原因は、AudioToolboxがMP3形式のサウンドをサポートしていないことにあります。MP3ファイルを、CAF形式というものに変換してください。変換のしかたは、グーグルなどで「iOS cafに変換」のようなキーワードで検索すれば、いくつも見つかります。
なお、AudioServicesCreateSystemSoundID()でバッファしたサウンドは、AudioServicesDisposeSystemSoundID()でバッファを解放してください。

- (void)dealloc {
AudioServicesDisposeSystemSoundID(sound_1);
}

と、View Controllerインスタンスが解放されるタイミングで解放するといいでしょう。

> できればソースコードをお聞きしたいです。

それはやめときましょう。問題集をやっていて、イライラがこうじて、巻末の回答を見てしまったら、勉強したことになりません。ここでグッとこらえることが、あなたの今後の成長にむすびつきます。

投稿日時 - 2014-10-09 12:25:33

あなたにオススメの質問