【まとめ】
最後に、今まで書いたコードを全て掲載します。Outlet接続がうまくできていればコピペでも
動くはずです。
実際にコードを記述したのはGameViewController.swiftとResultViewController.swift
の2つのファイルですので、その2つを載せます。
GameViewController.swift
import UIKit
class GameViewController: UIViewController {
@IBOutlet weak var centerView: UIView!
@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
var myButtonAry: [UIButton] = []
var countNum: Int = 2
var scoreNum = 0
var timeNum = 60
var colorLebel: CGFloat = 0.1
var timer: Timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
makeBtn(num: countNum)
showBtn(num: countNum)
timer = Timer.scheduledTimer(timeInterval: 1.0,
target: self,
selector: #selector(countDown),
userInfo: nil,
repeats: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//ボタンを生成するメソッド。引数(num)を1つ取る。numが列数を表す。num×num個のボタンを生成する。
func makeBtn(num: Int) {
//ランダムな色を生成して、その色を格納する定数を定義する
let color = makeColor()
//ボタンをnum×num個生成する。for文で回す。
for _ in 1...(num*num) {
let button = UIButton(type: UIButtonType.custom)
button.backgroundColor = color.0 //この部分を変更する
button.layer.cornerRadius = 5
button.layer.masksToBounds = true
myButtonAry.append(button)
}
//生成されたボタンの中で1つだけ正解となるボタンを作りたいので、ランダムな数値を生成する
let random = Int(arc4random_uniform(UInt32(num*num)))
//その「ランダムな数値」番目のボタンにだけ、色を正解の色に変更する
myButtonAry[random].backgroundColor = color.1
//その「ランダムな数値」番目のボタンにだけ、タップアクションを定義する
myButtonAry[random].addTarget(self, action: #selector(onClickBtn), for: UIControlEvents.touchDown)
}
//ボタンのサイズと座標を指定し、画面に描画するメソッド。これも引数(num)を取る。
func showBtn(num: Int) {
//ボタンの1辺の長さを表す変数side
var side: CGFloat = 0
//numはInt型なので、計算用にCGFLoat型の変数にキャストしておく
let CGFloatNum: CGFloat = CGFloat(num)
//ボタンの1辺の長さは、centerViewの1辺の長さから、両端の5pt×2=10ptと、ボタン同士の隙間の間隔を引いて、num個で割る。
side = (centerView.frame.width - (10 + (CGFloatNum-1)*2)) / CGFloatNum
//座標用の変数xとyを定義。
var x: CGFloat = 0
var y: CGFloat = 0
//各ボタンの座標は異なるので、それぞれのx座標,y座標の値をを格納する空の配列を用意しておく。
//座標を指定する値もCGFloat型のため、CGFloat型で宣言する。
var point: [(CGFloat, CGFloat)] = []
//ボタンの座標をfor文で生成する。
for i in 0...num-1 {
for j in 0...num-1 {
x = 5 + (side + 2) * CGFloat(j)
y = 5 + (side + 2) * CGFloat(i)
point.append((x,y))
}
}
//各ボタンの座標に、pointの値とsideの値をfor文で回して設定していく。
for i in 0...(num*num)-1 {
myButtonAry[i].frame = CGRect(x: point[i].0, y: point[i].1, width: side, height: side)
//生成したボタンを画面に表示する
centerView.addSubview(myButtonAry[i])
}
}
//ランダムな色を生成するメソッド
func makeColor() -> (UIColor, UIColor) {
//RGBのそれぞれの値をランダムに生成する。このように書くことで、0〜1までの小数点以下3桁までの値を取得できる。
//このように書くことで、色のバリエーションが増える(ような気がする)
let red: CGFloat = CGFloat(arc4random_uniform(1001)) / 1000
let green: CGFloat = CGFloat(arc4random_uniform(1001)) / 1000
let blue: CGFloat = CGFloat(arc4random_uniform(1001)) / 1000
let color = UIColor(red: red, green: green, blue: blue, alpha: 1)
//正解となるボタンの色を生成する。明度を明るくすることで違いを生み出す。
//RGBの色は0〜1の値を設定することができ、1に近づけば近づくほど白色寄りに、0に近づけば黒色寄りになるため、
//ちょっと色の値を小さくする。
let correctRed: CGFloat = red + colorLebel
let correctGreen: CGFloat = green + colorLebel
let correctBlue: CGFloat = blue + colorLebel
let correctColor = UIColor(red: correctRed, green: correctGreen, blue: correctBlue, alpha: 1)
//外れボタンの色と正解ボタンの色を戻り値としてタプルで返す
return (color, correctColor)
}
//ボタンがタップされた時のメソッドを定義
func onClickBtn() {
//スコアを1加算してテキストに埋め込む
scoreNum = scoreNum + 1
scoreLabel.text = "\(scoreNum)"
//正解ボタンをタップすると、まず、一度画面からボタンを取り除き、配列も空にする。
for i in 0...(countNum*countNum-1) {
myButtonAry[i].removeFromSuperview()
}
myButtonAry.removeAll()
//難易度調整メソッド実行。このメソッドを実行することでボタンの数と色の違いが変わる。
decideDifficulty()
//再度ボタンを生成。これで新しいランダムな色のボタン&正解ボタンもランダムに決められたボタンが画面に表示される。
makeBtn(num: countNum)
showBtn(num: countNum)
}
//残り時間を減らしていくメソッド
func countDown() {
//1秒ごとに表示する残り時間を1ずつ減らし、その数値をラベルに表示する
timeNum = timeNum - 1
timeLabel.text = "\(timeNum)"
//0秒でタイマーを止める。
if timeNum <= 0 {
timer.invalidate()
//さらに、このタイミングで画面遷移も行う
self.performSegue(withIdentifier: "toResult", sender: nil)
}
}
//ゲーム画面→結果表示画面のViewControllerにプロパティの値を渡す
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let newVC = segue.destination as! ResultViewController
newVC.scoreNum = self.scoreNum
}
//スコアに応じて表示されるボタンの数と難易度を決めるメソッド。
func decideDifficulty() {
switch scoreNum {
case 0:
countNum = 2
colorLebel = 0.1
case 1:
countNum = 3
colorLebel = 0.09
case 2:
countNum = 4
colorLebel = 0.08
case 3,4:
countNum = 5
colorLebel = 0.07
case 5,6:
countNum = 6
colorLebel = 0.06
case 7...9:
countNum = 7
colorLebel = 0.05
case 10...15:
countNum = 8
colorLebel = 0.04
case 16...29:
countNum = 9
colorLebel = 0.03
default:
countNum = 10
colorLebel = 0.02
}
}
}
GameViewController.swift
import UIKit
class ResultViewController: UIViewController {
@IBOutlet weak var resultScoreLabel: UILabel!
@IBOutlet weak var rankLabel: UILabel!
var scoreNum: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
self.resultScoreLabel.text = String(scoreNum)
showRank(num: scoreNum)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func showRank(num: Int) {
var text: String
switch num {
case 0...10:
text = "もっとがんばりましょう"
case 11...20:
text = "あと少しがんばりましょう"
case 21...27:
text = "正常な色彩です"
case 28...32:
text = "良い色彩の持ち主です"
case 33...40:
text = "素晴らしい色彩の持ち主です"
default:
text = "神レベル"
}
rankLabel.text = text
}
}
これがみなさんの学習の助けになれば幸いです。
最後まで読んでいただいてありがとうございました!
TechProjin 開発系基礎講座 連載リンク
基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載
AIなどで注目急上昇!これから学ぶならPython!!
独学で学ぶ-pythonプログラミング 連載
汎用性◎ 定番プログラミング言語JAVA
Java基礎講座 連載