SwiftUIは、2019年にアップルが発表したフレームワークです。
SwiftUIを使って、iPhoneで遊べるじゃんけんゲームを作成してみましょう。
この入門ではXcodeを使いますので、準備をしておいてください。
では、早速はじめていきましょう!
使用する画像について
今回はこちらの画像を使います。
解凍してお使いください。
新規プロジェクトの作成
まずは、新規プロジェクトを作成します。
Xcodeを開くと、次ような画面が表示されると思います。
この画面から、「Create a new Xcode project」をクリックします。
今回はじゃんけんゲームといえども、とてもシンプルなゲームですので、「Single View App」を選択します。
すると、次のような画面が表示されます。
たくさん入力する場所がありますが、一つずつ見ていきましょう。
まず、Project Nameには、プロジェクトの名前を入力します。今回は「Janken」と入力しました。
次にTeamなのですが、これを指定しておかないと、実機でのテストなど、できないことが出てきます。ただ、指定するにはAppleIDが必要だったりと、少々大変なので、今回は「None」の状態で進めたいと思います。(後から変更もできますので、実機テストをしたいと思ったときに、設定すればいいと思います)
Organization Nameは、組織名ですが、個人の方はニックネームを入れてあげればいいと思います。
Organization Identifierは、任意のもので構いませんが、アプリを公開するとなると、注意が必要です。
世界に一つだけのものにしなくてはいけないので、ドメインを持っている人は、それをひっくり返したものを入力します。持っていない人は、とりあえず任意のものを入力してください。
Languageは、開発言語ですので、Swiftを選択してください。
User Interfaceは、SwiftUIを選択してください。
全ての選択が終わったら、「Next」をクリックします。
すると、プロジェクトを作成する場所を選択することができます。
このとき、「Create Git repository on my Mac」の項目があります。
これは、どちらでもいいのですが、今回はGitでのバージョン管理はしないので、私はチェックを外しました。
おめでとうございます。新規プロジェクトが作成され、SwiftUIで開発する準備が整いました。
使用する画像を読み込む
では、使用する画像をプロジェクトに読み込んでいきます。
まず、ナビゲーターエリアから、「Assets.xcassets」を選びます。
もしもナビゲーターエリアが表示されていない場合は、右上のボタンで表示させることができます。
先ほどダウンロードしたファイルを、全てドラッグして、白いところにドロップします。
プレビューを使う
SwiftUIでは、わざわざエミュレータを使わなくても、プレビューを見るだけで実行結果が分かります。
スマホが表示され、その画面に「Hello,World!」と表示されれば成功です。
このプレビューですが、もし止まってしまった場合はもう一度「Resume」をクリックしてあげてください。
テキストの変更
続いて、今表示されている「Hello,World!」の文字列を変更してみましょう。
プレビュー画面上の「Hello,World!」をクリックしてください。
すると、ユーティリティエリアに表示されていたものが、ポンっと変わります。
もしもユーティリティエリアが表示されていない場合は、右上のボタンで表示させることができます。
では、テキストを変更してみましょう。
ユーティリティエリアに「Text」という項目があります。
じゃんけんゲームを作るのですから、ここはもちろん「じゃんけん」に変更します。
もちろんソースを直接変更しても構いません。
もしもソースから変更したい場合は、「ContentView.swift」の5行目を「Text(“じゃんけん”)」に変更します。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { Text("じゃんけん") } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
フォントの変更
続いて、フォントを変更してみましょう。
ユーティリティエリアを見ると、「Font」という項目があります。ここで、フォントを変更することができます。
プレビューのフォントが若干大きくなりました。
さらに、ソースには.font(.title)
という命令が加わっています。
数値を指定してフォントのサイズを変更する方法もありますが、ここでは割愛します。
縦並びのレイアウト(VStack)
VStackを使うと、縦並びのレイアウトにすることができます。
といっても、ここではまだTextしかないので、表示は変わりません。このあと、ボタンを作った時に反映されます。
ただ、そのままボタンを作ってしまうと、エラーになってしまうので、まずはレイアウトの指定だけしておきます。
では、ソースの「Text(“じゃんけん”)」の、Textの部分をcommandを押しながらクリックします。
そして「Embed in VStack」をクリックします。
すると、VStack {}
が作られ、その中にTextが入ったと思います。
ソースは現在、こうなっております。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Text("じゃんけん") .font(.title) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
ボタンを作る
つづいて、ボタンを作っていきます。
まず、.font(.title)
の後ろにカーソルを移動させ、Enter(return)で改行します。
これで、ボタンが作られました。
また、VStackのおかげで「じゃんけん」の文字と「Button」というボタンが縦に並んで配置されました。
では、このボタンの文字を変更してみます。
先ほどと同じようにユーティリティエリアから変更することも可能ですが、今度はちょっと違う方法を試してみましょう。
プレビューのボタンを、commandを押しながらクリックします。
さらに表示されたメニューから、「Show SwiftUI Inspector…」をクリックします。
ボタンを画像にする
続いて、ボタンを画像にしてみましょう。
せっかく作ったボタンですが、ちょっと改変していきます。
するとエラーが発生してしまいますが、ここでは気にしません。
カーソルが、Button(action {}) {}
の、後ろの{}の中にあるのを確認します。
表示されたウィンドウから、「Image」を探して、選択します。
これで、Image(Image Name)
という命令が追加され、エラーも消えました。
Image Nameのところには、最初に読み込んだ画像ファイル名を入れます。
拡張子は入力しません。
しかし、このようにボタンが青くなってしまっていると思います。
そんなときは、レンダリングモードを指定します。
Image("b_gu")
の後ろで改行し、以下の命令を入力します。
.renderingMode(.original)
ボタンが押されたときのアクションを加える
つづいて、ボタンが押されたときのアクションを作っていきます。
さきほど作ったボタン、Button(action: {}) {/*省略/}
の、最初の{}の中に作っていきます。
しかし、まだ{}が青くなった状態になっているので、ダブルクリックして、入力できるようにします。
さらにカーソルの位置を{}の中に移動し、enter(return)を押して改行します。
そこに、以下の命令を入力してください。
print("グー")
これでボタンを押すとデバッグエリアに「グー」と表示されるようになるのですが、プレビューのボタンを押しても、ボタンが選択されるだけになってしまいます。
そこでプレビューの右下にある、「▷」を右クリックし、「Debug Preview」をクリックしてください。
「Preview」の左の、くるくる回っているマークが消えるのを待ちます。
また、デバッグエリアの表示非表示は、右上のボタンから切り替えられます。
では、実際にプレビューの中の、作成したボタンをクリックしてみてください。
すると、デバッグエリアに「グー」と表示されたと思います。
これで、ボタンをつくることができました。
全体のソースはこのようになっています。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Text("じゃんけん") .font(.title) Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
チョキとパーのボタンを作る
さて、ここまでで、テキストとボタンを作成することができたのですが、ボタンはまだグーしかありません。
では、チョキとパーのボタンも作っていきましょう。
まず、グーボタンのソースを選択して、右クリックからコピーします。
では、ソースを変更して、グーボタンを、チョキとパーのボタンに、変更していきます。
変更する箇所は画像の通りです。
今現在のソースは、このようになります。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Text("じゃんけん") .font(.title) Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
これで、それぞれのボタンを押したとき、そのボタンにあった文字が、デバッグエリアに表示されます。
横並びのレイアウト(HStack)
続いて、ボタンを横並びにしてみたいと思います。
さきほど、VStack
という縦並びのレイアウトを使いました。こんどはHStack
を使って、横並びのレイアウトを作ってみます。
VStack
とHStack
を組み合わせて、さまざまなレイアウトを作ることが可能です。
では、先ほど作った3つのボタンを、HStack {}
の{}に入れるように書いていきます。
ContentView.swift
/** 省略 */ HStack { Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) } } /** 省略 */
ボタンを画面いっぱいに横並びにする
3つのボタンが横並びになったわけですが、このままではスマホの画面からはみ出てしまっています。
さらに、端末によっては、画面のわりに小さなボタンになってしまったりします。
そんなときに使うのが.resizable()
です。
これを使うことで、画像サイズを変更することが可能になります。
3箇所のそれぞれの画像の、.renderingMode(.original)
の下に入力します。
/** 省略 */ Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) .resizable() //追加 } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) .resizable() //追加 } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) .resizable() //追加 } /** 省略 */
すると、このようになります。
画像は画面いっぱいになったものの、比が崩れ、よくない見た目になってしまいました。
そんなときは、.scaledToFit()
を使いましょう。
これを使うことで、アスペクト比を維持しながらリサイズすることができます。
先ほど追加した、.resizable()
の下に追加しましょう。
Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() //追加 } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() //追加 } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() //追加 }
今現在のソースは、このようになっています。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Text("じゃんけん") .font(.title) HStack { Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
ゲーム全体の画面を作る
さて、以上のことが分かれば、ゲーム全体の画面をだいたい作ることができます。
では、相手の顔の画像を表示させます。
相手の顔は、画面の一番上に表示させたいので、VStack{}
の一番上に作っていきます。
Image(Image Name)の()の中を、「”face”」に変更します。
さらに、画面に合わせて大きさを変更したいので、先ほどのように、.resizable()
と.scaledToFit()
を指定します。
入力する場所は、Image("face")
の下です。
さて、今度は手を表示させていきます。
今作成した、顔の画像を表示するソースをコピーします。
Text("じゃんけん").font(.title)
の上と下に貼り付けます。
今作成したところの、2箇所のfaceは、とりあえず「gu」に変更しておきます。
これで、じゃんけんゲームの大まかな形ができました。
今現在のソースは、このようになっております。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Image("face") .resizable() .scaledToFit() Image("gu") .resizable() .scaledToFit() Text("じゃんけん") .font(.title) Image("gu") .resizable() .scaledToFit() HStack { Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
相手の手の向きを変更する
このままでは、自分の手と相手の手が同じ向きなので、パッと見たとき、どっちがどっちの手か分かりにくいです。
そこで、相手の手の向きを回転させてみましょう。
画像の回転には、.rotationEffect(Angle(degrees: 角度))
を使い、「角度」には数値を入れます。
実際には、このように入力します。
/** 省略 */ Image("face") .resizable() .scaledToFit() Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) //追加 Text("じゃんけん") .font(.title) /** 省略 */
コードの全体は、このようになります。
ContentView.swift
import SwiftUI struct ContentView: View { var body: some View { VStack { Image("face") .resizable() .scaledToFit() Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) Text("じゃんけん") .font(.title) Image("gu") .resizable() .scaledToFit() HStack { Button(action: { print("グー") }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
ボタンが押されたとき、自分の手の画像を切り替える
続いて、ボタンが押されたときに、自分の手の画像が切り替わるようにしてみます。
そんなときに使えるのが、変数と条件分岐です。
では、struct ContentView: View {}
の一番上に、次の命令を入力します。
@State private var playerHand = 0
@State
をつけることによって、値を変更することが可能になります。
今回は、勝敗のプログラムが作りやすいように、数値で、なにを出したか、を管理するようにします。
0はグー、1はチョキ、2はパーです。
そして、自分の手の画像を表示している部分は、次のようにして、画像が切り替わるようにします。
/** 省略 */ /** 自分の手 */ if(playerHand == 0) { Image("gu") .resizable() .scaledToFit() } else if(playerHand == 1) { Image("choki") .resizable() .scaledToFit() } else if(playerHand == 2) { Image("pa") .resizable() .scaledToFit() } /** 省略 */
さらに、ボタンを押したとき、変数の数値が変わるようにします。
/** 省略 */ /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; //追加 }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; //追加 }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; //追加 }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } /** 省略 */
すると、ボタンを押すたびに、手の画像が切り替わるようになりました。
全体のソースは、このようになります。
分かりやすいように、コメントも入れました。
ContentView.swift
import SwiftUI struct ContentView: View { @State private var playerHand = 0 var body: some View { VStack { /** 顔 */ Image("face") .resizable() .scaledToFit() /** 相手の手 */ Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) /** 文字 */ Text("じゃんけん") .font(.title) /** 自分の手 */ if(playerHand == 0) { Image("gu") .resizable() .scaledToFit() } else if(playerHand == 1) { Image("choki") .resizable() .scaledToFit() } else if(playerHand == 2) { Image("pa") .resizable() .scaledToFit() } /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
ランダムな値を取得して、相手の手の画像を切り替える
ここまでくると、早く相手の手も切り替わるようにしたいですね。
しかし、相手の手はランダムに切り替わるようにしたいです。
それならば、ランダムな値を取得し、その数値によって、それぞれの画像に切り替わるようにしてみましょう。
ランダムな数値を作るのは、以下のようなプログラムです。
この命令は、0~2までの整数の数値を、randamという変数に代入するものです。
let random = Int.random(in: 0..<3)
では、この命令を使って、コンピュータが出す手を選ぶための関数を作ってみましょう。
関数は以下のように作ります。
これで、コンピュータがなにを出すか、0〜2までの数値がランダムに選ばれます。
func chooseComputerHand() -> Int { let random = Int.random(in: 0..<3) let computerHand = random return computerHand }
この関数を、ボタンが押されたときの部分から呼び出します。
ContentView.swift
/** 省略 */ /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; self.computerHand = chooseComputerHand(); //追加 }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; self.computerHand = chooseComputerHand(); //追加 }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; self.computerHand = chooseComputerHand(); //追加 }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } /** 省略 */
さらに、computerHandに入っている数値によって、相手の手の画像も切り替わるようにします。
ContentView.swift
/** 省略 */ /** 相手の手 */ if(computerHand == 0) { Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 1) { Image("choki") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 2) { Image("pa") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } /** 省略 */
まだ、変数computerHandの宣言をしていないので、@State private var computerHand = 0
を、playerHandの宣言の下に入力しておきます。
そして、現在のソースはこのようになります。
ContentView.swift
import SwiftUI struct ContentView: View { @State private var playerHand = 0 @State private var computerHand = 0 var body: some View { VStack { /** 顔 */ Image("face") .resizable() .scaledToFit() /** 相手の手 */ if(computerHand == 0) { Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 1) { Image("choki") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 2) { Image("pa") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } /** 文字 */ Text("じゃんけん") .font(.title) /** 自分の手 */ if(playerHand == 0) { Image("gu") .resizable() .scaledToFit() } else if(playerHand == 1) { Image("choki") .resizable() .scaledToFit() } else if(playerHand == 2) { Image("pa") .resizable() .scaledToFit() } /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; self.computerHand = chooseComputerHand(); }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; self.computerHand = chooseComputerHand(); }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; self.computerHand = chooseComputerHand(); }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } func chooseComputerHand() -> Int { let random = Int.random(in: 0..<3) let computerHand = random return computerHand } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
じゃんけんの勝敗を判定する
いよいよ、じゃんけんの勝敗を判定するプログラムを作っていきます。
じゃんけんを判定する関数を作ります。
このようにすると、じゃんけんの勝敗を判定することができます。
func determineVictoryOrDefeat(playerHand:Int, computerHand:Int) -> String { var result = "" var playerHandTemp = playerHand playerHandTemp+=1 if (playerHand == computerHand) { result = "ぽん……あいこです"; } else if ((playerHand == 2 && computerHand == 0)||(playerHandTemp == computerHand)) { result = "ぽん……あなたの勝ちです"; } else { result = "ぽん……あなたの負けです"; } return result }
では、今作った関数を、ボタンを押したときの部分から呼び出します。
ContentView.swift
/** 省略 */ /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) //追加 }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) //追加 }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) //追加 }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } /** 省略 */
さらに、「じゃんけん」の文字を変えたいので、text変数に「じゃんけん」という文字列を代入し、それを表示するようにします。
computerHandの宣言の下に、@State private var text = "じゃんけん"
を入力して、textの宣言と代入をします。
そして、Text("じゃんけん")
の部分は、Text(text)
に書き換えます。
/** 文字 */ Text(text) .font(.title)
すると、さきほどのプログラムで、determineVictoryOrDefeat()関数が呼ばれた結果がtext変数に代入されるようになっているので、「じゃんけん」の文字が、結果の文字に切り替わるようになります。
さて、これでじゃんけんゲームの完成です。
さいごに、完成したソース全体になります。
ContentView.swift
import SwiftUI struct ContentView: View { @State private var playerHand = 0 @State private var computerHand = 0 @State private var text = "じゃんけん" var body: some View { VStack { /** 顔 */ Image("face") .resizable() .scaledToFit() /** 相手の手 */ if(computerHand == 0) { Image("gu") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 1) { Image("choki") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } if(computerHand == 2) { Image("pa") .resizable() .scaledToFit() .rotationEffect(Angle(degrees: 180)) } /** 文字 */ Text(text) .font(.title) /** 自分の手 */ if(playerHand == 0) { Image("gu") .resizable() .scaledToFit() } else if(playerHand == 1) { Image("choki") .resizable() .scaledToFit() } else if(playerHand == 2) { Image("pa") .resizable() .scaledToFit() } /** ボタン */ HStack { Button(action: { print("グー") self.playerHand = 0; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) }) { Image("b_gu") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("チョキ") self.playerHand = 1; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) }) { Image("b_choki") .renderingMode(.original) .resizable() .scaledToFit() } Button(action: { print("パー") self.playerHand = 2; self.computerHand = chooseComputerHand(); self.text = determineVictoryOrDefeat(playerHand:self.playerHand, computerHand:self.computerHand) }) { Image("b_pa") .renderingMode(.original) .resizable() .scaledToFit() } } } } } func chooseComputerHand() -> Int { let random = Int.random(in: 0..<3) let computerHand = random return computerHand } func determineVictoryOrDefeat(playerHand:Int, computerHand:Int) -> String { var result = "" var playerHandTemp = playerHand playerHandTemp+=1 if (playerHand == computerHand) { result = "ぽん……あいこです"; } else if ((playerHand == 2 && computerHand == 0)||(playerHandTemp == computerHand)) { result = "ぽん……あなたの勝ちです"; } else { result = "ぽん……あなたの負けです"; } return result } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
まとめ
今回はSwiftUIを使って、じゃんけんゲームを作成しました。
SwiftUIを使うと、少ないコードで書けるようになるので、開発の時間がかなり短縮できそうです。
日本では、iPhoneを使っている人がとても多いので、iPhoneアプリ開発はぜひ覚えておきたいですね。