Intune SDKを組み込んだiPhoneアプリ開発してみたいなと思いながら、Swiftを学んでおります。
UIKitでのMSAL組み込みは出来たので、次にSwiftUIにMSALを組み込みをしようとインターネットで調べながら進んでましたが、なかなか進まず。
サンデープログラマーな私ですので、structやclassの違いや、swiftのお作法などもあやふやで、もう少しまとまった知識と経験が必要だと思い、本を買ってやってみました。
「たった二日でマスターできる iPhoneアプリ開発 集中講座」
6本のサンプルアプリを本を読みながら、とにかく作りきりました。
自分でゼロからアプリが作れますかと言われると、まだまだですが、前よりは全然いける気がする。これはやってよかった。
2週目はなるべく本を見ずにできるように、また、こうしてみたいというところを組み込んで開発中です。
6本のサンプルアプリで学んだことを組み合わせて、じゃんけんアプリに 自分なりに動きをつけてみています。
- サンプルプログラムは、コンピュータの手が出るようになっていた。自分の手も画面に表示し、選択できるように変更
- 実際のじゃんけんのように、じゃん、けん、ぽん と時間の流れがあるゲームとしたい
自分の手を表示するところと、じゃん、けん、ぽんが順番にメッセージとして表示するようにできた。
MSALには近づいているはず!
考えていた 改造内容を実現できた。
自分の手を選択できるようにした。また、ぽん の時点で、コンピュータの手と自分の手を比較して、勝ち負けを判定するようにした。
次のゲームに移ると、勝ち負け、引き分けの回数を表示するようにした。
- 作ってみて、初めて自分の頭の中の構想では、考慮が足りていないのがわかるところ
- じゃん、けん、ぽん、のメッセージが時間経過とともに表示するようにするところ
- コンピュータの手と自分の手が揃ってから判定するというところ
時間経過は、最初サンプルプログラムの中のタイマーを参考にしようと思ったのですが、うまく実装できず。
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()
}