无故事王国
2024-06-07 7b57c2ab04da74514d75ab722088a039e257fef5
提交fix
12个文件已修改
473 ■■■■ 已修改文件
DolphinEnglishLearnStudent/Models/CommonModel.swift 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_Pocket_CCell.swift 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift 119 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.swift 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Services/Services.swift 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DolphinEnglishLearnStudent/Models/CommonModel.swift
@@ -258,9 +258,28 @@
                var updateBy: String = ""
                var updateTime: String = ""
                var week: Int = 0
                var answerCount = 0
                var answerIntegral = 0
                var answerTime = 0
                var time = 0
                var count = 0
}
class Listen1SubModel:HandyJSON{
class Listen1SubModel:HandyJSON,Hashable{
                static func == (lhs: Listen1SubModel, rhs: Listen1SubModel) -> Bool {
                                return lhs.id == rhs.id
                }
//                var hashValue: Int{
//                                return id
//                }
                func hash(into hasher: inout Hasher) {
                }
                required init() {}
@@ -277,6 +296,10 @@
                var type: String = ""
                var updateBy: String = ""
                var updateTime: String = ""
                //游戏类型2专用
                var isOpen:Bool = false
}
struct Listen4Model:HandyJSON{
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.swift
@@ -12,6 +12,7 @@
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var view_top: UIView!
                @IBOutlet weak var img_state: UIImageView!
                @IBOutlet weak var img_cover: UIImageView!
                
                override func awakeFromNib() {
        super.awakeFromNib()
@@ -39,6 +40,10 @@
                                }
                }
                func setModel(_ m:Listen1SubModel){
                                img_cover.sd_setImage(with: URL(string: m.img))
                }
                override func layoutSubviews() {
                                super.layoutSubviews()
                                view_top.jq_addCorners(corner: [.topLeft,.topRight], radius: 8)
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_CCell.xib
@@ -27,7 +27,7 @@
                                    <constraint firstAttribute="height" constant="40" id="E9b-fE-KSJ"/>
                                </constraints>
                            </view>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qVZ-4r-nXX">
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qVZ-4r-nXX">
                                <rect key="frame" x="0.0" y="40" width="155" height="160"/>
                            </imageView>
                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NUh-6J-pQi">
@@ -69,6 +69,7 @@
            </constraints>
            <size key="customSize" width="165" height="210"/>
            <connections>
                <outlet property="img_cover" destination="qVZ-4r-nXX" id="fI2-K0-BPL"/>
                <outlet property="img_state" destination="dMD-2P-QwE" id="asa-h2-2Ut"/>
                <outlet property="view_container" destination="YTs-C9-W1k" id="SRu-Wj-Ued"/>
                <outlet property="view_top" destination="Mmn-Bf-5Vy" id="Pdc-oD-g5f"/>
DolphinEnglishLearnStudent/Moudle/Home/Listen/CCell/ListenFight_Game_Pocket_CCell.swift
@@ -9,17 +9,27 @@
class ListenFight_Game_Pocket_CCell: UICollectionViewCell {
                private lazy var mask_img:UIImageView = {
                lazy var mask_img:UIImageView = {
                                let image = UIImageView(image: UIImage(named: "bg_card"))
                                return image
                }()
                private lazy var answer_img:UIImageView = {
                lazy var answer_img:UIImageView = {
                                let image = UIImageView()
                                image.jq_cornerRadius  = 10
                                image.backgroundColor = .red
                                return image
                }()
                lazy var voice_view:UIView = {
                                                let voiceView = UIView()
                                voiceView.backgroundColor = UIColor(hexString: "#41A2EB")
                                voiceView.jq_cornerRadius = 10
                                return voiceView
                }()
                private var model:Listen1SubModel!
                override init(frame: CGRect) {
@@ -34,14 +44,60 @@
                                                make.edges.equalToSuperview()
                                }
                                let mask_tap = UITapGestureRecognizer(target: self, action: #selector(toFromAction))
                                mask_img.addGestureRecognizer(mask_tap)
                                mask_img.isUserInteractionEnabled = true
                                addSubview(voice_view)
                                voice_view.snp.makeConstraints { make in
                                                make.edges.equalToSuperview()
                                }
                                let answer_tap = UITapGestureRecognizer(target: self, action: #selector(toBackAction))
                                answer_img.addGestureRecognizer(answer_tap)
                                answer_img.isUserInteractionEnabled = true
                                let contentVoiceView = UIView()
                                contentVoiceView.backgroundColor = .white
                                contentVoiceView.jq_cornerRadius = 8
                                voice_view.addSubview(contentVoiceView)
                                contentVoiceView.snp.makeConstraints { make in
                                                make.left.equalTo(40)
                                                make.right.equalTo(-40)
                                                make.top.equalTo(55)
                                                make.bottom.equalTo(-55)
                                }
                                let img1 = UIImageView(image: UIImage(named: "icon_play_1"))
                                contentVoiceView.addSubview(img1)
                                img1.snp.makeConstraints { make in
                                                make.left.equalTo(23)
                                                make.width.height.equalTo(32)
                                                make.centerY.equalToSuperview()
                                }
                                let playBtn = UIButton(type: .custom)
                                playBtn.addTarget(self, action: #selector(playAction), for: .touchUpInside)
                                playBtn.setImage(UIImage(named: "icon_play"), for: .normal)
                                contentVoiceView.addSubview(playBtn)
                                playBtn.snp.makeConstraints { make in
                                                make.right.equalTo(-23)
                                                make.width.height.equalTo(32)
                                                make.centerY.equalToSuperview()
                                }
//                                let mask_tap = UITapGestureRecognizer(target: self, action: #selector(toFromAction))
//                                mask_img.addGestureRecognizer(mask_tap)
//                                mask_img.isUserInteractionEnabled = true
//
//                                let answer_tap = UITapGestureRecognizer(target: self, action: #selector(toBackAction))
//                                answer_img.addGestureRecognizer(answer_tap)
//                                answer_img.isUserInteractionEnabled = true
                }
                @objc func playAction(){
                                VoicePlayer.share().playerEnd()
                                VoicePlayer.share().playerAt(url: model.correct)
                }
                func setModel(_ model:Listen1SubModel){
                                self.model = model
                                answer_img.sd_setImage(with: URL(string: model.img))
                }
                required init?(coder: NSCoder) {
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenFightVC.swift
@@ -44,6 +44,11 @@
                var maxPage = BehaviorRelay<Int>(value: 5)
                var listenType = BehaviorRelay<ListenType>(value:.lesson1)
                var times:Int = 0
                var quarter = BehaviorRelay<Int?>(value: 0)
                var week = BehaviorRelay<Int?>(value: 0)
                //游戏专属,游戏等级
                var gameLevel = BehaviorRelay<Int>(value:0)
                //回答错误数量
                var correctNum:Int = 0{
@@ -120,9 +125,15 @@
                private var timer:Timer!
                init(listenType:ListenType) {
                init(listenType:ListenType,quarter:Int? = nil,week:Int? = nil) {
                                super.init(nibName: nil, bundle: nil)
                                self.viewModel.listenType.accept(listenType)
                                self.viewModel.week.accept(week)
                                self.viewModel.quarter.accept(quarter)
                                if listenType == .game1 || listenType == .game2{
                                                self.viewModel.maxPage.accept(1)
                                }
                }
                
                required init?(coder: NSCoder) {
@@ -136,8 +147,6 @@
                                                self?.quitAction()
                                }
                                pageVC.reloadData()
                                btn_exit.addTarget(self, action: #selector(quitAction), for: .touchUpInside)
                                btn_forward.addTarget(self, action: #selector(beforeAction), for: .touchUpInside)
@@ -145,6 +154,12 @@
                                if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                                                btn_forward.isHidden = true
                                                label_pageNum.isHidden = true
                                                if viewModel.listenType.value == .game1{
                                                                showGameLevel()
                                                }
                                }else{
                                                pageVC.reloadData()
                                }
                                timer = Timer(fire: .distantPast, interval: 1.0, repeats: true, block: {[weak self] _ in
@@ -169,6 +184,23 @@
                                                }else{
                                                                make.bottom.equalTo(self.label_pageNum.snp.top).offset(-32)
                                                }
                                }
                }
                private func showGameLevel(){
                                ChooseLevelView.show {[weak self] level in
                                                guard let weakSelf = self else { return }
                                                weakSelf.viewModel.gameLevel.accept(level)
                                                Services.gameHearing(difficulty: level, quarter: weakSelf.viewModel.quarter.value!, week: weakSelf.viewModel.week.value!).subscribe(onNext: {result in
                                                                GameBeginTipView.show {
                                                                                if let data = result.data{
                                                                                                weakSelf.data = data
                                                                                                weakSelf.pageVC.reloadData()
                                                                                }
                                                                }
                                                },onError: { _ in
                                                                weakSelf.showGameLevel()
                                                }).disposed(by: weakSelf.disposeBag)
                                }
                }
@@ -213,24 +245,16 @@
                                                //完成
                                                if nextPage >= weakSelf.viewModel.maxPage.value{
                                                                var toalIntegral:Int = 0
                                                                var ids = [Int]()
                                                                for v in weakSelf.viewModel.answerItems.values{
                                                                                if let v =  v as? Listen1Model{
                                                                                                toalIntegral += v.data?.integral ?? 0
                                                                                                ids.append(v.data?.studyId ?? 0)
                                                                                }
                                                                switch weakSelf.viewModel.listenType.value {
                                                                                case .game1,.game2:
                                                                                                if let dict = noti.object as? Dictionary<String,Any>{
                                                                                                                weakSelf.gamesComplete(gameId: dict["gameId"] as! Int,integral: dict["gameIntegral"] as! Int)
                                                                                                }
                                                                                case .lesson1,.lesson2,.lesson3,.lesson4,.lesson5:
                                                                                                weakSelf.studyComplete()
                                                                                case .story1,.story2:break
                                                                }
                                                                Services.completeLearing(type: weakSelf.viewModel.listenType.value.rawValue, studyTime: weakSelf.viewModel.times, studyIds: ids, isComplete: false).subscribe(onNext: {data in
                                                                }).disposed(by: weakSelf.disposeBag)
                                                                weakSelf.timer.invalidate()
                                                                let vc = HomeStudyCompleteVC(correctNum: weakSelf.viewModel.correctNum, errorNum: weakSelf.viewModel.errorNum, totalCoin: toalIntegral)
                                                                vc.title = weakSelf.viewModel.listenType.value.rawTitle
                                                                                weakSelf.push(vc: vc)
                                                                return
                                                }
@@ -243,6 +267,50 @@
                                                self?.btn_forward.isHidden = currentPage <= 0
                                                self?.label_pageNum.text = "已完成:\(weakSelf.viewModel.currentPage.value + 1)/\(weakSelf.viewModel.maxPage.value)"
                                }).disposed(by: disposeBag)
                }
                //学习类完成
                private func studyComplete(){
                                var toalIntegral:Int = 0
                                var ids = [Int]()
                                for v in viewModel.answerItems.values{
                                                if let v =  v as? Listen1Model{
                                                                toalIntegral += v.data?.integral ?? 0
                                                                ids.append(v.data?.studyId ?? 0)
                                                }
                                }
                                Services.completeLearing(type: viewModel.listenType.value.rawValue, studyTime: viewModel.times, studyIds: ids, isComplete: false).subscribe(onNext: {data in
                                }).disposed(by: disposeBag)
                                timer.invalidate()
                                let vc = HomeStudyCompleteVC(correctNum: viewModel.correctNum, errorNum: viewModel.errorNum, totalCoin: toalIntegral)
                                vc.title = viewModel.listenType.value.rawTitle
                                push(vc: vc)
                }
                private func gamesComplete(gameId:Int,integral:Int){
                                var name = ""
                                if viewModel.listenType.value == .game1{
                                                name = "超级听力"
                                }else{
                                                name = "超级记忆"
                                }
                                let accuracy = Int(Double(viewModel.correctNum) / Double(viewModel.correctNum + viewModel.errorNum) * 100)
                                Services.completeGames(gameId: gameId, gameName: name, difficulty: viewModel.gameLevel.value, accuracy: accuracy, useTime: viewModel.times).subscribe(onNext: {data in
                                }).disposed(by: disposeBag)
                                timer.invalidate()
                                let vc = HomeStudyCompleteVC(correctNum: viewModel.correctNum, errorNum: viewModel.errorNum, totalCoin: integral)
                                vc.title = viewModel.listenType.value.rawTitle
                                push(vc: vc)
                }
                deinit{
@@ -264,6 +332,11 @@
extension HomeListenFightVC:FFPageViewControllerDelegate{
                func totalPagesOfpageViewController(_ pageViewConteoller: FFPageViewController) -> UInt {
                                //超级听力,只有一页
                                if viewModel.listenType.value == .game1 || viewModel.listenType.value == .game2{
                                                return 1
                                }
                                return UInt(viewModel.maxPage.value)
                }
@@ -304,12 +377,15 @@
                                }
                                if viewModel.listenType.value == .game1{
                                                let vc = HomeListenGame_1_VC()
                                                if data == nil{return UIViewController()}
                                                let vc = HomeListenGame_1_VC(listen1Model: data as! Listen1Model)
                                                vc.rootViewModel = viewModel
                                                return vc
                                }
                                if viewModel.listenType.value == .game2{
                                                let vc = HomeListenGame_2_VC()
                                                let vc = HomeListenGame_2_VC(listen1Model: data as! Listen1Model)
                                                vc.rootViewModel = viewModel
                                                return vc
                                }
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_1_VC.swift
@@ -7,9 +7,16 @@
import UIKit
let Games_1_Refresh_Noti = Notification.Name.init("Games_1_Refresh_Noti")
class HomeListenGame_1_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                private var listen1Model:Listen1Model!
                var rootViewModel:HomeListenFightViewModel!
                private var totalCount:Int = 1 //游戏的总数量
                private lazy var label_class:UILabel = {
                                let label = UILabel()
@@ -26,6 +33,7 @@
                                label.textColor = UIColor(hexStr: "#EE1111")
                                label.text = "请在10s内选择答案!"
                                label.textAlignment = .center
                                label.isHidden = true
                                label.font = .systemFont(ofSize: 14, weight: .medium)
                                return label
                }()
@@ -50,15 +58,42 @@
                }()
                private var timer:Timer?
                private var times:Int = 10
                private var times:Int = 60
                private var answerSet = Set<Listen1SubModel>()
                private var currentAnswer:Listen1SubModel?{
                                didSet{
                                                if let v = currentAnswer{
                                                                view_studyHandleView.vioceSoundUrl = v.correct
                                                                view_studyHandleView.voicePlayer.playerAt(url: v.correct)
                                                }
                                }
                }
                required init(listen1Model:Listen1Model){
                                super.init(nibName: nil, bundle: nil)
                                self.listen1Model = listen1Model
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
    override func viewDidLoad() {
        super.viewDidLoad()
                                ChooseLevelView.show { level in
                                                GameBeginTipView.show {
                                                                self.startTimer()
                                if  listen1Model != nil{
                                                times = listen1Model?.data?.time ?? 10
                                                collectionView.reloadData()
                                                label_hint.isHidden = false
                                                label_hint.text = "\(totalCount)"
                                                if timer == nil{startTimer()}
                                                for v in listen1Model?.subjectList ?? []{
                                                                answerSet.insert(v)
                                                }
                                                print("--->开始答题:剩余:\(answerSet.count)")
                                                currentAnswer = answerSet.randomElement() //随机
                                }
    }
@@ -77,6 +112,7 @@
                                }
                                view_class_title.addSubview(label_class)
                                label_class.text = "\(totalCount)"
                                label_class.snp.makeConstraints { make in
                                                make.left.equalTo(11)
                                                make.right.equalTo(-12)
@@ -114,7 +150,8 @@
                                view.layoutIfNeeded()
                }
                private func startTimer(){
                func startTimer(){
                                if timer == nil{
                                                timer = Timer(timeInterval: 1.0, target: self, selector: #selector(runloopTime), userInfo: nil, repeats: true)
                                }
@@ -128,27 +165,37 @@
                                if times == 0{
                                                timer?.fireDate = .distantFuture
                                                DispatchQueue.main.asyncAfter(deadline: .now()+3) {
                                                                self.times = 10
                                                                self.timer?.fireDate = .distantPast
                                                if let c = currentAnswer{
                                                                answerSet.remove(c)
                                                }
                                                                currentAnswer = answerSet.randomElement() //随机
                                                            times = listen1Model?.data?.time ?? 0
                                                            timer?.fireDate = .distantPast
                                                            totalCount += 1
                                                            label_class.text = "\(totalCount)"
                                                //答题完成
                                                if self.answerSet.count == 0{completeQuestion()}
                                }
                }
                private func nextQuesAction(){
                }
                private func answerQuestion(){
                                view.layoutIfNeeded()
                                var answerType:Fight_lessonType = .none
                                answerType = .success
                                guard let row = viewModel.selectIndex.value?.row else { alertError(msg: "请选择");return  }
                                var answerType:Fight_lessonType = .none
                                if currentAnswer?.id == listen1Model?.subjectList[row].id{
                                                answerType = .success
                                }else{
                                                answerType = .fail
                                }
                                switch answerType {
                                                case .success:
                                                                viewModel.answerType.accept(.success)
                                                                collectionView.reloadData()
                                                                rootViewModel.correctNum += 1
                                                                if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_Game_CCell", for: viewModel.selectIndex.value!) as? ListenFight_Game_CCell{
                                                                                let newRect = cell.contentView.convert(cell.bounds, from: self.collectionView)
                                                                                let x = abs(newRect.origin.x) + self.collectionView.contentInset.left + 5
@@ -164,49 +211,65 @@
                                                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
                                                                                                                self.viewModel.answerType.accept(.none)
                                                                                                                self.collectionView.reloadData()
                                                                                                                self.times = 11
                                                                                                                self.nextQuesAction()
                                                                                                                self.times = self.listen1Model?.data?.time ?? 10
                                                                                                                self.totalCount += 1
                                                                                                                self.label_class.text = "\(self.totalCount)"
                                                                                                                self.answerSet.remove(self.currentAnswer!)
                                                                                                                self.currentAnswer = self.answerSet.randomElement()
                                                                                                                print("--->下一题:\(self.currentAnswer?.id ?? 0) 剩余\(self.answerSet.count)  计数:\(self.totalCount)")
                                                                                                                //答题完成
                                                                                                                if self.answerSet.count == 0{
                                                                                                                                self.completeQuestion()
                                                                                                                }
                                                                                                }
                                                                                }
                                                                }
                                                case .fail:
                                                                rootViewModel.errorNum += 1
                                                                viewModel.answerType.accept(.fail)
                                                                collectionView.reloadData()
                                                                DispatchQueue.main.asyncAfter(wallDeadline: .now()+2.5) {
                                                                                self.viewModel.answerType.accept(.none)
                                                                                self.collectionView.reloadData()
                                                                                self.times = 11
                                                                                self.nextQuesAction()
                                                                }
                                                case .none:
                                                                break
                                }
                }
                private func completeQuestion(){
                                print("答题完成")
                                self.label_hint.text = "答题完成"
                                self.timer?.invalidate()
                                self.rootViewModel.answerItems[0] = self.listen1Model
                                NotificationCenter.default.post(name: NextLession_Noti, object: ["gameId":listen1Model.data!.id,"gameIntegral":listen1Model.data!.integral])
                }
}
extension HomeListenGame_1_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                                answerQuestion()
                                let model = listen1Model!.subjectList[indexPath.row]
                                if answerSet.contains(model){
                                                viewModel.selectIndex.accept(indexPath)
                                                answerQuestion()
                                }
                }
}
extension HomeListenGame_1_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let model = listen1Model!.subjectList[indexPath.row]
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_Game_CCell", for: indexPath) as! ListenFight_Game_CCell
                                if viewModel.selectIndex.value == indexPath{
                                                cell.setState(state: viewModel.answerType.value)
                                }else{
                                                cell.setState(state: .none)
                                }
                                cell.setModel(model)
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 12
                                return listen1Model?.subjectList.count ?? 0
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenGame_2_VC.swift
@@ -7,10 +7,17 @@
import UIKit
struct Game_2_SelectModel:Hashable{
                var indexPath:IndexPath!
                var model:Listen1SubModel!
}
class HomeListenGame_2_VC: BaseVC {
                private var viewModel = FightAnswerViewModel()
                var rootViewModel:HomeListenFightViewModel!
                private var listen1Model:Listen1Model!
                private var selectModels = [Game_2_SelectModel]()
                private lazy var label_time:UILabel = {
                                let label = UILabel()
@@ -23,7 +30,7 @@
                private lazy var collectionView:UICollectionView = {
                                let flowLayout = UICollectionViewFlowLayout()
                                let w = (JQ_ScreenW - 40 * 2 - 30) / 4.0
                                let w = (JQ_ScreenW - 40 * 2 - 50) / 5.0
                                flowLayout.itemSize = CGSize(width: w, height: w * 0.675)
                                flowLayout.minimumInteritemSpacing = 10
@@ -37,6 +44,16 @@
                private var timer:Timer?
                private var times:Int = 600
                required init(listen1Model:Listen1Model){
                                super.init(nibName: nil, bundle: nil)
                                self.listen1Model = listen1Model
                                self.listen1Model.subjectList.shuffle()
                }
                required init?(coder: NSCoder) {
                                fatalError("init(coder:) has not been implemented")
                }
                override func viewDidLoad() {
                                super.viewDidLoad()
@@ -65,6 +82,7 @@
                                                make.centerY.equalTo(label_surplusTitle)
                                                make.height.equalTo(44)
                                }
                                collectionView.delegate = self
                                collectionView.dataSource = self
@@ -131,22 +149,69 @@
extension HomeListenGame_2_VC:UICollectionViewDelegate{
                func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                                viewModel.selectIndex.accept(indexPath)
                                _ = self.collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_Game_Pocket_CCell", for: indexPath) as! ListenFight_Game_Pocket_CCell
                                if selectModels.last?.indexPath == indexPath{
                                                print("重复点击");return
                                }
                                let model = listen1Model.subjectList[indexPath.row]
                                if selectModels.count >= 2{
                                                selectModels.removeFirst()
                                }
                                selectModels.append(Game_2_SelectModel(indexPath: indexPath, model: model))
                                print(selectModels.map({"\($0.indexPath.row)"}).joined(separator: "——"))
                                if selectModels.count == 1{
                                                let cell = self.collectionView.cellForItem(at: indexPath) as! ListenFight_Game_Pocket_CCell
                                                cell.toFromAction()
                                }
                                if selectModels.count == 2{
                                                let cell = self.collectionView.cellForItem(at: indexPath) as! ListenFight_Game_Pocket_CCell
                                                cell.toFromAction()
                                                let firstM = selectModels.first
                                                let lastM = selectModels.last
                                                if firstM != nil && lastM != nil{
                                                                if firstM!.model.id == lastM!.model.id{
                                                                                firstM!.model.isOpen = true
                                                                                lastM?.model.isOpen = true
                                                                                selectModels.removeAll()
                                                                                print("相同")
                                                                }else{
                                                                                print("不相同")
                                                                                let firstIndex = firstM!.indexPath
                                                                                let secondIndex = lastM!.indexPath
                                                                                let firstIndexCell = self.collectionView.cellForItem(at: firstIndex!) as! ListenFight_Game_Pocket_CCell
                                                                                let secondIndexCell = self.collectionView.cellForItem(at: secondIndex!) as! ListenFight_Game_Pocket_CCell
                                                                                DispatchQueue.main.asyncAfter(deadline: .now()+0.5){
                                                                                                firstIndexCell.toBackAction()
                                                                                                secondIndexCell.toBackAction()
                                                                                                self.selectModels.removeAll()
                                                                                }
                                                                }
                                                }
                                }
                }
}
extension HomeListenGame_2_VC:UICollectionViewDataSource{
                func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
                                let model = listen1Model.subjectList[indexPath.row]
                                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "_ListenFight_Game_Pocket_CCell", for: indexPath) as! ListenFight_Game_Pocket_CCell
                                cell.setModel(model)
                                cell.voice_view.isHidden = !model.correct.isEmpty
                                return cell
                }
                func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
                                return 12
                                return listen1Model.subjectList.count
                }
}
DolphinEnglishLearnStudent/Moudle/Home/Listen/VC/HomeListenSubVC.swift
@@ -117,10 +117,19 @@
                                //自主游戏
                                if page == 5{
                                                if indexPath.row == 0{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game1))
                                                                                let fightVC = HomeListenFightVC(listenType: .game1,quarter: quarter,week: week)
                                                                fightVC.title = ListenType.game1.rawTitle
                                                                JQ_currentViewController().jq_push(vc:fightVC)
                                                }
                                                if indexPath.row == 1{
                                                                JQ_currentViewController().jq_push(vc: HomeListenFightVC(listenType: .game2))
                                                                Services.gameMemory(quarter: quarter, week: week).subscribe(onNext: {result in
                                                                                if let data = result.data{
                                                                                                let fightVC = HomeListenFightVC(listenType: .game2)
                                                                                                fightVC.title = ListenType.game2.rawTitle
                                                                                                fightVC.data = data
                                                                                                JQ_currentViewController().jq_push(vc: fightVC)
                                                                                }
                                                                }).disposed(by: disposeBag)
                                                }
                                }
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/ChooseLevelView.swift
@@ -15,7 +15,7 @@
                @IBOutlet weak var tackView_level: UIStackView!
                private var clouseLevel:((Int)->Void)!
                private var level:Int = 1
                private var level:Int = 0
                override func awakeFromNib() {
                                super.awakeFromNib()
DolphinEnglishLearnStudent/Moudle/Home/Listen/View/GameBeginTipView.swift
@@ -13,7 +13,8 @@
                @IBOutlet weak var view_container: UIView!
                @IBOutlet weak var label_time: UILabel!
                private var timer:Timer?
                private var completeClouse:(()->Void)!
                override func awakeFromNib() {
                                super.awakeFromNib()
@@ -34,7 +35,7 @@
                                } completion: { _ in
                                                levelView.layoutIfNeeded()
                                                var time:Int = 5
                                                Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
                                                levelView.timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
                                                                time -= 1
                                                                levelView.label_time.text = "\(time)"
                                                                levelView.animation()
@@ -65,6 +66,7 @@
                }
                @IBAction func completeAction(_ sender: UIButton) {
                                timer?.invalidate()
                                UIView.animate(withDuration: 0.4) {
                                                self.transform = .init(scaleX: 0.1, y: 0.1)
                                                self.alpha = 0
DolphinEnglishLearnStudent/Other/UIView/StudyHandleView.swift
@@ -21,7 +21,7 @@
                private var playComplete:(()->Void)?
                private var playAtClouse:((Int)->Void)?
                private var voicePlayer = VoicePlayer.share()
                var voicePlayer = VoicePlayer.share()
                var vioceSoundUrl:String?
                override func awakeFromNib() {
DolphinEnglishLearnStudent/Services/Services.swift
@@ -91,6 +91,35 @@
                                                .append(key: "isComplete", value: isComplete)
                                return NetworkRequest.request(params: params, method: .post,encoding: JSONEncoding.default, progress: true)
                }
                /// 完成游戏
                class func completeGames(gameId:Int,gameName:String,difficulty:Int,accuracy:Int,useTime:Int)->Observable<BaseResponse<SimpleModel>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/study/base/study/gameAchievement")
                                                .append(key: "gameId", value: gameId)
                                                .append(key: "accuracy", value: accuracy)
                                                .append(key: "difficulty", value: difficulty)
                                                .append(key: "useTime", value: useTime)
                                                .append(key: "gameName", value: gameName)
                                return NetworkRequest.request(params: params, method: .post,encoding: JSONEncoding.default, progress: true)
                }
                class func gameHearing(difficulty:Int,quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/study/base/study/gameHearing")
                                params.append(key: "quarter", value: quarter)
                                params.append(key: "difficulty", value: difficulty)
                                params.append(key: "week", value: week)
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
                class func gameMemory(quarter:Int,week:Int)->Observable<BaseResponse<Listen1Model>>{
                                let params = ParamsAppender.build(url: All_Url)
                                params.interface(url: "/study/base/study/gameMemory")
                                params.append(key: "quarter", value: quarter)
                                params.append(key: "week", value: week)
                                return NetworkRequest.request(params: params, method: .get, progress: true)
                }
}
// MARK: -- 登录部分