プログラミング日記

ここでは、私が体験したことを記事にしていくサイトです。いろんな言語に挑戦しています!目指せ!!フルスタックエンジニア!!

【Objective-C】iOSでじゃんけんゲームを作ってみよう!

今回は第1回目ということで、初めての方でも簡単にできる「じゃんけんゲーム」を作っていきたいと思います♪

 

実行環境

・MacBookPro 2013 Retina

OS X 10.9.4 Marvericks

Core i5 2.6GHz

・Memory 8GB

iPhone5S(実機)

 

まず確認すること・・・

 

必要なもの

Mac(必須)

・OS X10.9以降(必須)

Xcode 5(必須)

・やる気!(必須)

 

とりあえず全部必須ですね、、、

これらが揃ったことを確認して・・・

 

では、早速始めていきましょう!

まず、UIを考えていきます

 

UIとは何か?と思った方、UIとは、User Inerfaceの略で読み方は「ユーザインターフェース」と読みます

アプリを操作するときの画面のことです

f:id:Upar:20140726232535p:plain

今回はこんな感じに配置していきます

 

さぁ、いよいよ作っていきます♪

 

Xcodeを立ち上げましょう

f:id:Upar:20140726232643p:plain

Create a new Xcode project をクリック

f:id:Upar:20140726232714p:plain

Single View Application を選択して Next をクリック

f:id:Upar:20140726232805p:plain

Product Name : rpsApp(Rock-paper-scissors Applicationの略)

Organization Name : jec.ac.jp

Company Identifier : jp.ac.jec

 

これらを記入したら Next をクリック

f:id:Upar:20140726232838p:plain

保存場所を聞いてくるので、書類に New Folder で作成して「モバイルプログラミング」と記入しましょう

「モバイルプログラミング」フォルダを選んで Create をクリック

f:id:Upar:20140726232858p:plain

\          じゃ~ん♪         /

 

ようやくプロジェクトファイルが完成しました!

 

では早速作っていきたいと思います!

 

右にある Main.storyboard をクリック

f:id:Upar:20140726232940p:plain

このような画面が出ます

では、まずView Controllerにいろいろ貼付けていきましょう♪

f:id:Upar:20140726233012p:plain

まず Label と Button を View Controller に貼付けてください

f:id:Upar:20140726233101p:plain

こんな感じになるかと思います

次に、名前を変えていきましょう

f:id:Upar:20140726233128p:plain

こんな感じで変えていきます

 

では次にボタンに画像を追加していきます

 

Imageフォルダを作成して以下の画像を保存してください

 Image フォルダを下記のように保存してください

 

保存場所は「書類」→「モバイルプログラミング」→「rpsApp」→「rpsApp」→「Image」→ここに保存

f:id:Upar:20140726233259p:plainf:id:Upar:20140726233256p:plainf:id:Upar:20140726233252p:plain

f:id:Upar:20140726233300p:plainf:id:Upar:20140726233302p:plainf:id:Upar:20140726233257p:plainf:id:Upar:20140726233254p:plain

f:id:Upar:20140726233253p:plain

ではこのフォルダをプロジェクトに追加していきます

f:id:Upar:20140726233505p:plain

先ほど作成し、画像を入れたフォルダをドラッグ&ドロップします

f:id:Upar:20140726233550p:plain

すると、このような画面が出るので Destination にチェックを入れて Finish をクリック

 

では画像を張っていきましょう

f:id:Upar:20140726233614p:plain

文字を全部消します、消さないと文字と画像が重なって表示されてしまうからです

backgroundからGu.pngを選択します。

 

この方法で、「チョキ」「パー」も変更していきましょう

 

でも、このままだと画像のサイズが変ですよね?

 

サイズインスペクタを開いて画像の大きさを変えていきます

f:id:Upar:20140726233645p:plain

縦・横のサイズを90に変更してください

そうするといい感じのサイズになるはずです

 

「もう一回」ボタンも編集していきましょう

 

手順は同じで、「もう一回」ボタンを選択して background から again.png を選択します

 

インスペクタを開いてサイズは縦(Height)80・横(Width)150に変更します

f:id:Upar:20140726233714p:plain

こんな感じになるかと思います

 

次に相手と結果を表示させないといけないので、さらに追加していきます

f:id:Upar:20140726233739p:plain

View Controller に Image View を「相手用」「結果用」に2つ追加してください

上が「相手用」

下が「結果用」です

 

 

 

 

はい、ではここからプログラミングの作業に入ります!(やっとか・・・)

f:id:Upar:20140726233853p:plain

1.アシスタントエディタを開きます

2.ViewController.mを選択

f:id:Upar:20140726233922p:plain

2.ViewController.mを選択

[cntrol]ボタンを押しながら@interface ViewController () の下に入れる

f:id:Upar:20140726233943p:plain

入れるとこのようなものが出てくる

Connection は Outlet で Name は labelMessage と記入して Connect をクリック

f:id:Upar:20140726234014p:plain

このように、成功していれば

 

@property (weak, nonatomic) IBOutletUILabel *labelMessage;

 

になっているはずです

 

こんな感じで「グー」「チョキ」「パー」「もう一回」ボタンもやっていきましょう!

 

「グー」ボタンは guButton

「チョキ」ボタンは tyokiButton

「パー」ボタンは paButton

「もう一回」ボタンは againButton

 

このように名前を指定していきましょう!

 

@property (weak, nonatomic) IBOutletUIButton *guButton;

@property (weak, nonatomic) IBOutletUIButton *tyokiButton;

@property (weak, nonatomic) IBOutletUIButton *paButton;

@property (weak, nonatomic) IBOutletUIButton *againButton;

 

このようになれば成功です

 

次にボタンが押された時の動きと連動させる為にまた同じようなことをします

 f:id:Upar:20140726234324p:plain

[cntrol]ボタンを押しながら@end の上に入れる

f:id:Upar:20140726234443p:plain

Connection は Action で Name は guButtonDown と記入して Connect をクリック

f:id:Upar:20140726234514p:plain

このように成功していれば

 

- (IBAction) guButtonDown:(id)sender {

}

 

になっているはずです

 

こんな感じで「グー」「チョキ」「パー」「もう一回」ボタンもやっていきましょう!

 

「グー」ボタンは guButtonDown

「チョキ」ボタンは tyokiButtonDown

「パー」ボタンは paButtonDown

「もう一回」ボタンは againButtonDown

 

このように名前を指定していきましょう!

 

- (IBAction) guButtonDown:(id)sender {

}

(IBAction) tyokiButtonDown:(id)sender {

}

- (IBAction) paButtonDown:(id)sender {

}

- (IBAction) againButtonDown:(id)sender {

}

 

このようになれば成功です

ここから地道にプログラムを書いていきます・・・

ですが、書くのが面倒くさいなぁというあなたの為に!!

コピペ用のコード書いておくのでどんどんコピペしちゃってください(笑)

 

「相手」「結果」の画像を表示させるプログラムを書いてきます

 

ViewController.hを開いて

 

@interface ViewController : UIViewController {

}←中かっこを追加してください

 

の中にプログラムを書いていきます

 

@interface ViewController : UIViewController {

    

    // 「グー」「チョキ」「パー」の画像

    UIImage *gu_img;

    UIImage *tyo_img;

    UIImage *pa_img;

    

    // 「勝ち」「負け」「あいこ」の画像

    UIImage *kati_img;

    UIImage *make_img;

    UIImage *aiko_img;

 

}

 

次に、「相手」「結果」の画像を表示できるようにします

f:id:Upar:20140726235254p:plain

[cntrol]ボタンを押しながら@end の上に入れる

f:id:Upar:20140726235324p:plain

 Connection は Outlet で Name は viewAite と記入して Connect をクリック

 

こんな感じで、「結果」の画像表示も

f:id:Upar:20140726235406p:plain

 

次に、

 

ViewController.m に戻って

 

以下を viewDidLoad の中に書き込んでいきます

 

- (void)viewDidLoad

{

    [superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

 

// 「グー」「チョキ」「パー」の画像

    gu_img = [UIImageimageNamed:@"gu.png"];

   tyo_img = [UIImageimageNamed:@"tyo.png"];

    pa_img = [UIImageimageNamed:@"pa.png"];

    

    // 「勝ち」「負け」「あいこ」の画像

    kati_img = [UIImageimageNamed:@"kati.png"];

    make_img = [UIImageimageNamed:@"make.png"];

    aiko_img = [UIImageimageNamed:@"aiko.png"];

 

 

 

 

 

 

 

「グー」「チョキ」「パー」「もう一回」ボタンを操作できるようにプログラムを書いていきます

 

まず、ボタンを押したときの画面上の反応を指定していきます

 

「グー」のボタンの処理

 

- (IBAction)guButtonDown:(id)sender {

}

 

この中にラベルを表示できるようにしていきます

 

    // ラベルを表示

    self.labelMessage.text = @“じゃんけん、ポン”;

 

「グー」ボタンを選択すると「チョキ」「パー」を表示させないようにします

 

 // 「チョキ」「パー」のボタンを表示させない

    self.tyokiButton.hidden = YES;

    self.paButton.hidden = YES;

 

相手の結果を表示させるようにします

 

  // 相手の結果を表示

    self.viewAite.hidden = NO;

 

ユーザーの結果を表示させるようにします

 

// ユーザーの結果を表示

    self.viewKekka.hidden = NO;

 

相手の操作を乱数で表示します

 

// 相手の操作を乱数で表示

    NSInteger Aiterps;

    Aiterps = rand()% 3;

 

 

 

 

 

// 「グー」の時「0」

    if(Aiterps == 0) {

        

        //ラベルを表示する

        self.labelMessage.text = @"じゃんけん・・・";

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = gu_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = aiko_img;

        

        // 「もう一回」ボタンを表示させない

        self.againButton.hidden = YES;

        

        // 「チョキ」「パー」のボタンを表示する

        self.tyokiButton.hidden = NO;

        self.paButton.hidden = NO;

        

    }

    

    // 「チョキ」の時「1」

    if(Aiterps == 1) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = tyo_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = kati_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.guButton.enabled = NO;

    }

    

 

 

 

    // 「パー」の時「2」

    if(Aiterps == 2) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = pa_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = make_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.guButton.enabled = NO;

        

    }

 

「チョキ」「パー」のボタンの処理も同じようにプログラムを書いてください

 

「チョキ」のボタンの処理

 

// ラベルを表示する

    self.labelMessage.text = @"じゃんけん、ポン!";

    

    // 「パー」「グー」のボタンを表示させない

    self.paButton.hidden = YES;

    self.guButton.hidden = YES;

    

    // 相手の結果を表示

    self.viewAite.hidden = NO;

    

    // ユーザーの結果の表示

    self.viewKekka.hidden = NO;

    

    // 相手の操作を乱数で表示

    NSInteger Aiterps;

    Aiterps = rand()% 3;

    

 

    // 「グー」の時「0」

    if(Aiterps == 0) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = gu_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = make_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.tyokiButton.enabled = NO;

        

    }

    

    // 「チョキ」の時「1」

    if(Aiterps == 1) {

        

        //ラベルを表示する

        self.labelMessage.text = @"じゃんけん・・・";

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = tyo_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = aiko_img;

        

        // 「もう一回」ボタンを表示させない

        self.againButton.hidden = YES;

        

        // 「グー」「パー」ボタンを表示する

        self.paButton.hidden = NO;

        self.guButton.hidden = NO;

        

    }

    

 

 

 

 

    // 「パー」の時「2」

    if(Aiterps == 2) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = pa_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = kati_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.tyokiButton.enabled = NO;

        

    }

 

「パー」のボタンの処理

 

//ラベルを表示する

    self.labelMessage.text = @"じゃんけん、ポン!";

    

    // 「グー」「チョキ」のボタンを表示させない

    self.guButton.hidden = YES;

    self.tyokiButton.hidden = YES;

    

    // ユーザーの結果を表示

    self.viewKekka.hidden = NO;

    

    // 相手の結果を表示

    self.viewAite.hidden = NO;

    

    // 相手の操作を乱数で表示

    NSInteger Aiterps;

    Aiterps = rand()% 3;

    

 

 

 

    // 「グー」の時「0」

    if(Aiterps == 0) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = gu_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = kati_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.paButton.enabled = NO;

        

    }

    

    // 「チョキ」の時「1」

    if(Aiterps == 1) {

        

        // 相手の結果に画像を表示させる

        self.viewAite.image = tyo_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = make_img;

        

        // 勝敗後「もう一回」ボタンの表示

        self.againButton.hidden = NO;

        

        // 結果後に押しても反応しないようにする

        self.paButton.enabled = NO;

    }

    

 

 

 

 

 

 

 

    // 「パー」の時「2」

    if(Aiterps == 2) {

        

        //ラベルを表示する

        self.labelMessage.text = @"じゃんけん・・・";

        

 

        // 相手の結果に画像を表示させる

        self.viewAite.image = pa_img;

        

        // ユーザーの結果に画像を表示させる

        self.viewKekka.image = aiko_img;

        

        // 「もう一回」ボタンを表示させない

        self.againButton.hidden = YES;

        

        // 「グー」「チョキ」のボタンを表示させる

        self.guButton.hidden = NO;

        self.tyokiButton.hidden = NO;

        

    }

 

ふぅ…長かったですね、

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

次は「もう一回」ボタンの処理を書いていきましょう(まだあるのか・・・)

 

// 「もう一回」のボタン

- (IBAction)againButtonDown:(id)sender {

    

    //ラベルを表示する

    self.labelMessage.text = @"じゃんけん・・・";

    

    // 「グー」「チョキ」「パー」のボタンを表示させる

    self.guButton.hidden = NO;

    self.tyokiButton.hidden = NO;

    self.paButton.hidden = NO;

    

    // 「グー」「チョキ」「パー」のボタンを元に戻す

    self.guButton.enabled = YES;

    self.tyokiButton.enabled= YES;

    self.paButton.enabled = YES;

    

    // 相手の結果の画像を表示させない

    self.viewAite.hidden = YES;

    

    // ユーザーの結果の画像を表示させない

    self.viewKekka.hidden= YES;

 

    // 「もう一回」ボタンを非表示にする

    self.againButton.hidden = YES;

 

    

}

 

これで、じゃんけんゲームができるようになったと思います♪

でもこのままでは、ずっと「もう一回」ボタンが出たままです

 

最初の画面での非表示処理をやって行きましょう

 

 

 

 

 

 

 

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

 

この中に

 

// 「もう一回」ボタンを非表示

    self.againbutton.hidden = YES;

 

を書き込みます

 

そうすると、最初の画面、「もう一回」ボタンを押した後は非表示になるはずです

 

仕上げに、画面の背景を設定していきます!

 

Main.storyboardを開いて、ViewController にViewImageを追加します

f:id:Upar:20140726235528p:plain

このままだと背景画像が一番上となってしまいボタンが見えなくなります

なので、背景の画像を一番後ろに持っていきましょう(最初っからやれよ・・・)

 

(;^ω^)・・・

 

f:id:Upar:20140726235603p:plain

 

こんな感じに、右の欄の ImageView(背景)を一番上(Viewの中)に持っていきましょう

 

そうすると、背景がしっかり「背景」になります♪

 

それでは背景画像をいれていきましょう

 

先ほど移動させた ImageView を選んで、アトリビュートインスペクタを選び

 

一番上の Image View の中の Image のところで画像をbg01.pngを選んでください

f:id:Upar:20140726235622p:plain

 

すると、こんな感じになると思います

 

でもこれだと、「じゃんけん・・・」の文字が見えません

 

あたりまえです、だって文字色黒だもん(;^ω^)

 

ということで、「じゃんけん・・・」の文字色を白にしましょう

f:id:Upar:20140726235724p:plain

 

 

「じゃんけん・・・」を選択して

アトリビュートインスペクタを選択して

Label の Color を Black Color から White Color に変更する

 

あと、iOS 7から上のステータスバーが透明になってしまったので背景が黒なので全く見えなくなってしまいます。

 

なので、ステータスバーの文字色を白色に変更しましょう

 f:id:Upar:20140726235748p:plain 

右の Supporting Files の rpsApp-Inf.plist を開く

 

f:id:Upar:20140726235817p:plain

 

一番上の Information Property List の横の+ボタンを選択

f:id:Upar:20140726235836p:plain

 

一番下のView controller-based status b... を選択

 

f:id:Upar:20140726235900p:plain 

f:id:Upar:20140726235910p:plain

すると、確認画面が出ますが、気にしないで Replace Existing Pair をクリック

 

View Controller-based status... の Value を NO にしてください

 

次に、

 

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

 

の中に、

 

// ステータスバーを白色に変更

[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

 

を追加します

 

これでアプリ実行時にステータスバーが白色になるはずです

 

後は、Main.storyboardに戻って、画像やテキストを奇麗に配置してください(重要)

f:id:Upar:20140726235956p:plain

こんな感じですね!

 

はい!これで「じゃんけんゲーム」アプリの完成でーす!!!!👏パチパチ

 

では早速エミュレーターで試してみましょう♪

 

f:id:Upar:20140727000026p:plain

 

\        じゃ~ん♪       /

 

ついに完成しましたよ~(*´σー`)エヘヘ

 

 

じゃぁ試しに一回・・・勝負!!

 

f:id:Upar:20140727000051p:plainf:id:Upar:20140727000115g:plain

 

 なんだと・・・しょっぱなから負けたんだけど・・・

 

ならばもう一度っ!!!

f:id:Upar:20140727000139p:plainf:id:Upar:20140727000203g:plain

コンピューター(乱数)恐るべし・・・(いや、俺が弱いのか?)

 

はい、こんな感じで遊べるようになりました(笑)

 

おつかれさまでした( ´,_ゝ`)

 

 

 

ViewCntroller.h

f:id:Upar:20140727000240p:plain

ViewController.m

f:id:Upar:20140727000259p:plainf:id:Upar:20140727000310p:plain

f:id:Upar:20140727000325p:plain

f:id:Upar:20140727000415p:plain

f:id:Upar:20140727000425p:plain