iPhoneアプリ開発 じゃんけんゲーム改造①

はじめに

Intune SDKを組み込んだiPhoneアプリ開発してみたいなと思いながら、Swiftを学んでおります。

UIKitでのMSAL組み込みは出来たので、次にSwiftUIにMSALを組み込みをしようとインターネットで調べながら進んでましたが、なかなか進まず。

サンデープログラマーな私ですので、structやclassの違いや、swiftのお作法などもあやふやで、もう少しまとまった知識と経験が必要だと思い、本を買ってやってみました。

「たった二日でマスターできる iPhoneアプリ開発 集中講座」

6本のサンプルアプリを本を読みながら、とにかく作りきりました。

自分でゼロからアプリが作れますかと言われると、まだまだですが、前よりは全然いける気がする。これはやってよかった。

2週目はなるべく本を見ずにできるように、また、こうしてみたいというところを組み込んで開発中です。

じゃんけんゲーム 改造

6本のサンプルアプリで学んだことを組み合わせて、じゃんけんアプリに 自分なりに動きをつけてみています。

改造内容

  • サンプルプログラムは、コンピュータの手が出るようになっていた。自分の手も画面に表示し、選択できるように変更
  • 実際のじゃんけんのように、じゃん、けん、ぽん と時間の流れがあるゲームとしたい

改造初日

自分の手を表示するところと、じゃん、けん、ぽんが順番にメッセージとして表示するようにできた。

MSALには近づいているはず!

改造 およそ1週間

考えていた 改造内容を実現できた。

自分の手を選択できるようにした。また、ぽん の時点で、コンピュータの手と自分の手を比較して、勝ち負けを判定するようにした。

次のゲームに移ると、勝ち負け、引き分けの回数を表示するようにした。

苦労した点

  • 作ってみて、初めて自分の頭の中の構想では、考慮が足りていないのがわかるところ
  • じゃん、けん、ぽん、のメッセージが時間経過とともに表示するようにするところ
  • コンピュータの手と自分の手が揃ってから判定するというところ

時間経過は、最初サンプルプログラムの中のタイマーを参考にしようと思ったのですが、うまく実装できず。

DispatchQueueというのを使ってみました。

コンピュータの手と自分の手が揃ったら判定するというところを、シーンを切り替えるようなフラグ変数を準備して・・・と考えたのですが、こちらはダメでした。具体的には、 SwiftUIのView型になっているプログラムの中では、単純にシーン切り替えフラグの変数値をfalseからtrueに切り替えるということはエラーとなってしまいました。View型の戻り値が必要とのこと。

これが分かったのは、収穫でした。

辛かったけれど、もう一度、画面の動きを考え直して、ボタンのような、描画されているもののアクションとして成立させられるように考え直して、なんとか思い通りになったというところです。

自分なりに山を1つ越えた気がします。

今後、追加したい機能

  • じゃん、けん、ぽんの切り替えを 早い・遅い で切り替える機能
  • 勝敗を次回まで記録する機能
  • 勝敗をリセットする機能

今後も次のプログラムを作るなど、地道にやってみたいと思います。

コード

恥ずかしいですが、コード載せます。

//
//  ContentView.swift
//  MyJanken2
//
//  Created by user on 2024/07/06.
//

import SwiftUI

struct ContentView: View {

    @State var win: Int = 0
    @State var lose: Int = 0
    @State var draw: Int = 0
    
    // JankenNumber
    //  1: グー
    //  2: チョキ
    //  3: パー
    @State var pcJankenNumber = 0
    @State var myJankenNumber = 0

    // TimeHandler
    //@State var timerHandler: Timer?
    
    @State var buttonFlag = true
    @State var message: String = "Let's Start"
    
    @State var useGu = false
    @State var useChoki = false
    @State var usePa = false
    
    var body: some View {
        
        //let soundPlayer = SoundPlayer()

        VStack {
            if win == 0 && lose == 0 && draw == 0 {
                Text("じゃんけんゲーム")
                    .font(.title)
                    .padding()
            } else {
                Text("\(win)勝 \(lose)負\(draw)分け")
                    .font(.title)
                    .padding()
                    .frame(height: 100)
                
            }
            
            ZStack {
                if message == "ぽん" || message == "かち" || message == "まけ" || message == "あいこ" {
                    if pcJankenNumber == 1 {
                        Image(.gu)
                            .resizable()
                            .scaledToFit()
                            .rotation3DEffect(.degrees(180),
                                              axis: (x: 1, y: 0, z: 0))
                            .padding()
                    } else if pcJankenNumber == 2 {
                        Image(.choki)
                            .resizable()
                            .scaledToFit()
                            .rotation3DEffect(.degrees(180),
                                              axis: (x: 1, y: 0, z: 0))
                            .padding()
                    } else if pcJankenNumber == 3 {
                        Image(.pa)
                            .resizable()
                            .scaledToFit()
                            .rotation3DEffect(.degrees(180),
                                              axis: (x: 1, y: 0, z: 0))
                            .padding()
                    }
                }
            }
            
            Text("Computer")
            
            Spacer()
            
            if buttonFlag {
                
                Button {
                    
                    buttonFlag = false
                    useGu = false
                    useChoki = false
                    usePa = false
                    message = "じゃ--ん"
                    
                    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                        message = "けーーん"
                    }
                    
                    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                        message = "ぽん"
                        
                        var newPCJankenNumber = 0
                        //repeat {
                        newPCJankenNumber = Int.random(in: 1...3)
                        //} while newPCJankenNumber == pcJankenNumber
                        
                        pcJankenNumber = newPCJankenNumber
                        
                        print(pcJankenNumber)
                    }
                    
                    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                        
                        if myJankenNumber == 0 {
                            message = "出さなきゃ まけよ"
                            print("出さなきゃ まけよ")
                            lose += 1
                        } else if myJankenNumber == 1 {
                            if pcJankenNumber == 1 {
                                message = "あいこ"
                                print("あいこ")
                                draw += 1
                            } else if pcJankenNumber == 2 {
                                message = "かち"
                                print("かち")
                                win += 1
                            } else if pcJankenNumber == 3 {
                                message = "まけ"
                                print("まけ")
                                lose += 1
                            }
                        } else if myJankenNumber == 2 {
                            if pcJankenNumber == 1 {
                                message = "まけ"
                                print("まけ")
                                lose += 1
                            } else if pcJankenNumber == 2 {
                                message = "あいこ"
                                print("あいこ")
                                draw += 1
                            } else if pcJankenNumber == 3 {
                                message = "かち"
                                print("かち")
                                win += 1
                            }
                        } else if myJankenNumber == 3 {
                            if pcJankenNumber == 1 {
                                message = "かち"
                                print("かち")
                                win += 1
                            } else if pcJankenNumber == 2 {
                                message = "まけ"
                                print("まけ")
                                lose += 1
                            } else if pcJankenNumber == 3 {
                                message = "あいこ"
                                print("あいこ")
                                draw += 1
                            }
                        }
                        //初期化
                        // ゲーム開始ボタン表示
                        // 自分の手をリセット
                        buttonFlag = true
                        myJankenNumber = 0
                    }
                    //soundPlayer.onseiPlay()
                } label: {
                    Text("Let's Start")
                        .font(.title)
                        .padding()
                }
            }

            if message != "Let's Start" {
                Text(message)
                    .font(.title)
                    .padding()
            }

            Spacer()
            
            Text("You")
            
            ZStack {
                HStack {
                    Button {
                        useGu = true
                        useChoki = false
                        usePa = false
                        
                        myJankenNumber = 1
                        //print("myJankenNumber=\(myJankenNumber)")
                        print("useGu = \(useGu)")
                    } label: {
                        Image(.gu)
                            .resizable()
                            .scaledToFit()
                            .padding()
                    }
                    .background(useGu ? .red : .white)
                    
                    Button {
                        useGu = false
                        useChoki = true
                        usePa = false

                        myJankenNumber = 2
                        //print("myJankenNumber=\(myJankenNumber)")
                        print("useChoki = \(useChoki)")
                    } label: {
                        Image(.choki)
                            .resizable()
                            .scaledToFit()
                            .padding()
                    }
                    .background(useChoki ? .red : .white)

                    Button {
                        useGu = false
                        useChoki = false
                        usePa = true

                        myJankenNumber = 3
                        //print("myJankenNumber=\(myJankenNumber)")
                        print("usePa = \(usePa)")
                    } label: {
                        Image(.pa)
                            .resizable()
                            .scaledToFit()
                            .padding()
                    }
                    .background(usePa ? .red : .white)
                }
            }
            
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です