编辑代码

图形化函数支持
func displayArrayGraphButton()  {
    let myView1 = self.view.viewWithTag(2001) as! UIImageView
    let myView2 = self.view.viewWithtag(2002) as! UIImageView
    myView1.backgroundColor = darkGray
    myView2.backgroundColor = darkGray

    myView1.isUserInteractionEnabled = ture
     myView2.isUserInteractionEnabled = ture
    
    let h = myView1.frame.size.height
    let w =  myView1.frame.size.height

    let padding : CGFloat = 5
    let margin : CGFloat = 10

    let grid_w = (w -margin * 2 -padding * CGFloat(cols-1)) / CGFloat(cols)
     let grid_h = (w -margin * 2 -padding * CGFloat(cols-1)) / CGFloat(rows)

       for i in 0..<rows {
            for j in 0..<cols {
                let x = margin + CGFloat(j) * (grid_w + padding)
                 let y = margin + CGFloat(j) * (grid_w + padding)
                 let rect = CGRect(x: X, y:y, width: grid_w, height: grid_h)
                 let fileName1 = iv1[i*cols+j]
                 let img1 = UIImage(named: fileName1)
                 let btn1 = UIImageView(frame: rect)
                 btn1.setImage(img1, for: .normal)
                 btn1.backgroundColor = .yellow
                 btn1.tag = i*cols+j + 4000
                 btn1.addTarget(self, action: #selector(buttonCheck(_:)),
                 for: .touchUpInside)
                 myView1.addSubview(btn1)

                 let fileName2 = iv2[i*cols+j]
                let img2 = UIImage(named: fileName2) 
                let btn2 = UIButton(frame: rect)
                btn2.setImage(img2, for: .normal)
                btn2.backgroundColor = .yellow
                btn2.tag = i*cols+j + 5000
                btn2.addTarget(self, action: #selector(buttonCheck(_:)),
                for: .touchUpInside)
                 myView2.addSubview(btn2)
            }
       }
Buuton事件的响应
@ojbc func buttconCheck(_sender : UIButton){
    let tipsLabel = self.view.viewWithtag(1001) as! UILabel
    let tag = sender.tag
    if tag >= 5000{
        let row = Int((tag -5000)/cols)
        let col = tag - 5000 -cols*row
        print("Bottom(\(row),\(col)")
        tipsLabel.text = "Bottom(\(row),\(col))"

    }
    else if tag >= 4000{
        let row = Int ((tag-4000)/cols)
        let col = tag-4000 -col * row
        print("Top(\(row),\(col))")
        tipsLabel.text = "top(\(row),\(col))"

    }
    else{
        print("Button.tag=\(sender.tag)")
        tipsLabel.text = "Button.tag=\(sender.tag)"
    }
        
    

}
相同干扰项函数
func distractorCreate(mount:Int){
    for _ in 0..<mount{
        let col = Int(arc4random()) % cols
        let row = Int(arc4random()) % rows
        cords.append((row,col))
        let index = Int(arc4random()) % images.count
        iv1[cols*row + col] = images[index]
        iv2[cols*row + col] = images[index]

    }
}
不同函数
func differenceCreate(mount:Int){
    for_in 0..<mount {
        let col = Int(arc4random()) % cols
        let row = int(arc4random()) % rows
        errorCords.append((row,col))
        let index= Int (arc4random()) % images.count
        let which = Int(arc4random()) % 2
        ifwhich == 0{
            iv1 [cols*row + col] = images[index]
        }
        else{
            iv2[cols*row + col] = images[index]
        }
    }
}
修改Button函数
@objc func buttonCheckMusic(_ sender : UIButton) {
    let tipsLabe1 = self.view.viewWithTag(1001) as! UILabel
    var tag = sender.tag
    if tag >= 5000 {
        tag -= 5000
    }
    else if tag >= 4000 {
        tag -= 4000
    }
    let row = Int (tag / cols)
    let col = tag - cols * row

    let result  = errorCords.filter {
        $0 == (row,col)
    }
    if result.count >= 1 {
        let path = Bundle.main.path(forResource:"birdsound",ofType:"m4a")
        let url = URL(fileURLWithPath: path!)
        soundPlayer=try? AVAudioPlayer(contentsOf: url)
        soundPlayer.play()
        tipsLabe1.text = "不同找到: (\(row),\(col))"
    }
    else {
        let path = Bundle.main.path(forResource: "error", ofType:"m4a")
        let url = URL(fileURLWithPath: path!)
        soundPlayer=try? AVAudioPlayer(contentsOf: url)
        soundPlayer.play()
        tipsLabe1.text = "找错啦: (\(row),\(col))"
    }
}
功能规划
var GameOver = false
var beginTimestamp : Int = 0
let Gameperiod = 20
var TimeCost = 0
定时器倒计时
func getCurrentTimeStamp() -> Int {
     let now =Date()
     let timeInterval : timeInterval = now.timeIntervalSincel1970
     return Int(timeInterval)
 }
 func timeElapse(){
    Timer.scheduledTimer(withTimeInterval: 0.5, repests: true){
        (timer) in
        let timestamp = self.getCurrentTimeStamp()
        let pastPeriod = timestamp - self.beginTimestamp
        let countDown = self.GamePeriod - pastPeriod
        self.TimeCost = pastPeriod
        if countDown <= 0 || self .GameOver{
            self.GameOver = true
            let tipsLabel = self.view.viewWithTag(1001) as! UIILabel
            tipsLabel.text = "游戏结束,共消耗时间\(self.TimeCost)秒"
            timer.invalidate()
        }
        let tipsLabel = self. view.viewWithTag(1002) as! UIILabel
        DispatchQueue.main.async{
            tipsLabel.text ="您消耗\(pastPeriod)秒,倒计时\(countDown)秒"
        }
    }
 }
修改Button函数倒计时
 @objc func buttonCheckMusicTimer(_ sender : UIButton) {
    if GameOver {return}
    let tipsLabel = self.view.viewWithTag(1001) as! UILabelvar tag = sender.tag
    if tag >= 5000 {
        tag -=5000
    }
    else if tsg >= 4000 {
        tag -=4000
    }
    let row = Int (tag / cols)
    let col - tag  - cols * row
    let result = errorCords.filter {
        $0 == (row,col)
    }
    let reserved = errorCords.filter {
        $0 != (row,col)
    }
    errorCords = reserved

    if result.count >= 1 {
        sender.backgroundColor = .reservedlet path = Bundle.main.path(forResource: "birdsound", ofType: "m4a")
        let ur1 = URL(fileURLWithPath:path!)
        soundPlayer=try? AVAudioPlayer(contentsOf: ur1)
        soundPlayer.play()
        tipsLabel.text = "不同找到:(\(row),\(col)),还剩\(errorCords.count)个"
        if errorCords.count <= 0 {
            GameOver = true
            tipsLabel.text = "任务完成,共花费时间\(self.TimeCost) 秒"
        }
    }
  else{
      sender.backgroundColor = .brown
      let path = Bundle.main.path|(forResource:"error",ofType:"m4a")
      let url = URL (fileURLWithPath: path!)
      soundPlayer.play()
      tipsLabel.text = "找错了: (\(row),\(col))"
      }
}
游戏开始
GameOver = false
beginTimestamp = getCurrentTimeStamp()
timeElapse()
initGame()
distractorCreate(mount: 5)
distractorCreate(mount: 3)
displayArrayGraphButton()
游戏提示和关卡
 func displayArrayGraphBottonTops() {
        let myView1 = self.view.viewWithTag(2001) as! UIImageView
        let myView2 = self.view.viewWithTag(2002) as! UIImageView
        myView1.backgroundColor = .darkGray
        myView2.backgroundColor = .darkGray
        //支持View可以进行交互等操作
        myView1.isUserInteractionEnabled = true
        myView2.isUserInteractionEnabled = true

        let h = myView1.frame.size.height
        let w = myView2.framesize.width

        let padding : CGFloat = 5
        let margin : CGFloat = 10

        //计算每个格子的高度和宽度
        let grid_w = (w-margin * 2 - padding * CGFloat(cols-1)) / CGFloat(cols)
        let grid_h = (h-margin * 2 - padding * CGFloat(cols-1)) / CGFloat(cols)

        for i in 0..<rows {
            for j in 0..<cols {
            let x = margin + CGFloat(j) * (grid_w + padding)
            let y = margin + CGFloat(i) * (grid_h + padding)
            let rect = CGFloat(x: x,y:y ,width:grid_w,height:grid_h)
            
            //在上面的ImageView中显示
            let fileName1 = iv1[i*cols+j]
            let tag1 =i*cols+j + 5000
            addButton(view.myView1,rect: ret, fileName: fileName1,tag: tag1)

            //在下面的ImageView中显示
            let fileName2 = iv1[i*cols+j]
            let tag2 =i*cols+j + 5000
            addButton(view.myView2,rect: ret, fileName: fileName2,tag: tag2)

            }
       
        }
    }

    //函数12:View上面添加Button的函数,提示功能,用于减少代码数量
    func addButton(view:UIView,rect:CGRect,fileName:String,tag:Int) {
        let img = UIImage(named: fileName)
        let bth = UIButton(frame: rect)
    bth.setImage(img, for: .normal)

    var mytag = tag
    if mytag >= 5000 {
        mytag -= 5000
    }
    eles if mytag >= 4000 {
        mytag -= 4000
    }
    let row = Int (mytag / cols)
    let col = mytag - cols * row

    let result = errorCords.filter {
        $0 == (row,col)
    }

    if result.count >= 1 && TipsFlag {
        btn.backgroundColor = .blue
    }
    eles {
        btn.backgroundColor = .yellow
    }
    btn.tag = tag
    btn.addTarget(self, action:: #selector(buttonCheckMusicTimer(_:)),for: .touchUpInside)
    view.addSubview(btn)
}
@IBAction func onBegin(_ sender : UIButton){
    //游戏结束标志
    GameOver = false
    //获取游戏开始时间并保存
    beginTimestamp = getCurrenTimeStamp()
    //倒计时
    timeElapse()
    //数组初始化
    initGame()
    distractorCreate(mount: 5)
    differenceCreate(mount: 3)
    displarArrayGraphButtonTips()
}
在下一关按钮事件增加代码
//函数12:View上面添加Button的函数,提示功能,用于减少代码数量
    func addButton(view:UIView,rect:CGRect,fileName:String,tag:Int) {
        let img = UIImage(named: fileName)
        let bth = UIButton(frame: rect)
    bth.setImage(img, for: .normal)

    var mytag = tag
    if mytag >= 5000 {
        mytag -= 5000
    }
    eles if mytag >= 4000 {
        mytag -= 4000
    }
    let row = Int (mytag / cols)
    let col = mytag - cols * row

    let result = errorCords.filter {
        $0 == (row,col)
    }

    if result.count >= 1 && TipsFlag {
        btn.backgroundColor = .blue
    }
    eles {
        btn.backgroundColor = .yellow
    }
    btn.tag = tag
    btn.addTarget(self, action:: #selector(buttonCheckMusicTimer(_:)),for: .touchUpInside)
    view.addSubview(btn)
}
@IBAction func onBegin(_ sender : UIButton){
    //游戏结束标志
    GameOver = false
    //获取游戏开始时间并保存
    beginTimestamp = getCurrenTimeStamp()
    //倒计时
    timeElapse()
    //数组初始化
    initGame()
    distractorCreate(mount: 5)
    differenceCreate(mount: 3)
    displarArrayGraphButtonTips()
}



//函数12:View上面添加Button的函数,提示功能,用于减少代码数量
func addButton(view:UIView,rect:CGRect,fileName:String,tag:Int) {
    let img = UIImage(named: fileName)
    let bth = UIButton(frame: rect)
    bth.setImage(img, for: .normal)

    var mytag = tag
    if mytag >= 5000 {
        mytag -= 5000
    }
    else if mytag >= 4000 {
        mytag -= 4000
    }
    let row = Int (mytag / cols)
    let col = mytag - cols * row

    let result = errorCords.filter {
        $0 == (row,col)
    }

    if result.count >= 1 && TipsFlag {
        btn.backgroundColor = .blue
        btn.tag = tag1btn.addTarget(self,action: #selector(buttonCheckMusicTimer(_:)),for: touchUpInside)
        view.addSubview(btn)
    }

    let result1 = cords.filter {
        $0 == (row,col)
    }
    if resultl.count >= 1 {
        btn.tag = tag
        btn.addTarget(self, action: #selector(buttonCheckMusicTimer(_:)),for: .touchUpInside)
        view.addSubview(btn)
    }
}

//函数13:移除所有子控件
func removeAllSubviews(view:UIView) {
    if view.subviews.count>0 {
        view.subviews.forEach({$0.removeFromSuperview()})
    }
}

@IBAction func onTips(_ sender : UIButton) {
    TipsFlag = !TipsFlag
    displayArrayGraphButtonTisp()
}

@IBAction Func onBegin(_ sends : UIButton) {
    //游戏结束标志
    GameOver = false
    //获取游戏开始时间并保存
    beginTimestamp = getCurrenTimeStamp()
    //倒计时
    timeElapse()
    //数组初始化
    initGame()
    distractorCreate(mount: 10)
    differenceCreate(mount: 8)
    displarArrayGraphButtonTips()
}

@IBAction Func onNext(_ sends : UIButton) {
    GameOver = true
    TipsFlag = falas
    let myView1 = self.view.viewWithTag(2001) as! UIImageView
    let myView2 = self.view.viewWithTag(2002) as! UIImageView
    CurrentBackground += 1
    if CurrentBackground > 4 {
        CurrentBackground = 1
    }
    let image = UIImage(named: "back0\(CurrentBackground)")!
    myView1.image = image
    myView2.image = image
    removeAllSubViews(view: myView1)
    removeAllSubViews(view: myView2)
}
适当美化
ContentView.swift
LoginSiftUI
Created by Zhifeng Chen on 2020/8/1.
Copyright c 2020 Zhifeng Chen.All rights reserved.
import swiftUI
struct ContentView : View{
    @state var userName : String=""
    @state var passWord : String=""
    var body: some View{
        VStack{
            Text("欢迎使用找不同")
            .font(.title)//字体大小为标题
            .padding()//四周间隔
            Divider()
            .background(Color(.brown))//背景色为brown
            Image(systemName:"person")//系统图像person
            .resizable()//允许改变图像尺寸
            .frame(width : 150,height: 150)//尺寸改为150*150
            .cornerRadius(50)//圆角半径50
            VStack{
                TextField("请输入用户名",Text:$userName)
                .padding(.leading,10)//前方间隔10
                .background(Color(.lightGray))//背景色
                .cornerRadius(15)//圆角半径15
            }
            .padding()//四周默认间隔
            Button(action:{
                print("被点击了...")
            },label: {Text("登录")})
            .padding()
            Spacer()
        }
    }
}
struct ContentView_previews: previewProvider{
    static var previews: some View{
        ContentView()
    }
}
自定义颜色
import SwifyUI

styout ContentView : View {

    @Stste vsr userName : String = ""
    @Stste vsr password : String = ""  

    var body: some View {
        VStack {
            Text("欢迎使用找不同")
                .font(.title)//字体大小为标题
                .padding()//四周间隔
            Divider()
                .background(Color(.barown))//背景色为brown
            Image(systemName:"person")//系统图像person
                .resizable()//允许改变图像尺寸
                .frame(width: 150, height: 150)//尺寸改为150*150
                .cornerRadius(50)//圆角半径50

            VStack {
                TextField("请输入用户名",text: $userName)
                   .padding()//四周默认间隔
                   .padding(.leading,10)//前方间隔10
                   .background(Color(.lightGray))//背景色
                   .cornerRadius(15)//圆角半径15
                TextField("请输入密码", text: $passWord)
                   .padding()//四周默认间隔
                   .padding(.leading,10)//前方间隔10
                   .background(lightGrayColor)//背景色
                   .cornerRadius(15)//圆角半径15

            }
            .padding()//四周默认间隔

             Button(action: {
                if self.userName=="Zfchen" &&self.passWord =="123"{
                    self.alertFlag=ture
                    self.alertMsg ="登录成功"
                }
                else {
                    self.alertFlag = ture
                    self.alertMsg ="登陆失败"
                }
            },  label: {
                Text("登录")
                .font(.headline)
                .frogroundColor(.white)
                .frame(width: 220, height: 60)
                .background(Color.green)
                .cornerRadius(15.0)
            })
            .padding()
            Spacer()
        }
        .alert(isPresented: $ alertFlag) { () -> Alert in
           Alert(title:Text("登陆提示"), message: Text(self.alertMsg),dismissButton: .default(Text("确定")))
           }
    }
}

struct ContentView_PreviewProvider{
    static var previews : some View{
        ContentView()
    }
}