iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑
一、游戏界面涉及到的功能点
1)数独格子的建模
(1)绘制数独格子要考虑到标记功能
所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作Storyboard时每一个修改都要等待至少20s)
(2)数独格子内部的Tag标记
为了方便编程时获取相应格子的View,需要把每个格子打上Tag
(3)数独格子的初始化
模型初始化包括背景色、填数操作 和 边框粗细的调整
2)“选数视图”与“选标记视图”以及“其他按钮”的建模
3)填数的游戏游戏规则的实现
(1)判断一个格子能填什么数
(2)判断游戏是否成功结束
二、具体实现
1)9*9=81个数独格子的创建。
(0)我们先在Storyboard中建一个viewcontroller,取名为Game。再在xcode左边新建一个Swift类,取名GameViewController,继承ViewController。将Storyboard中的Game属性中的父类设置成刚刚创建的GameViewController。
(1)我们称一个可以填数独数字的格子为UnitCell
涉及的代码:
1: import Foundation
2: import UIKit
3: class UnitCell: UIButton {
4: var numberAvailable = true
5: var superDelegate:SNNUnit?
6: // MARK: - 隐藏所有标记
7: func hideAllMarks(){
8: for view:UILabel in self.subviews as [UILabel]{
9: view.hidden=true
10: }
11: }
12: // MARK: - 添加标记
13: func addNumberMark(i:Int){
14: hideNumberBig()
15: for view:UILabel in self.subviews as [UILabel]{
16: if view.text == String(i){
17: if view.hidden {
18: view.hidden = false
19: }
20: // else{
21: // view.hidden = true
22: // }
23: break
24: }
25: }
26: }
27: // MARK: - 锁定单元格
28: func lockUnit(){
29: self.enabled = false
30: self.backgroundColor = UIColor.yellowColor()
31: }
32: // MARK: - 设置特定的数字
33: func setCertainNumberBig(v:Int){
34: hideAllMarks()
35: self.setTitle(String(v), forState: UIControlState.Normal)
36: self.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
37: }
38: // MARK: - 隐藏数字
39: func hideNumberBig(){
40: self.setTitle("", forState: UIControlState.Normal)
41: }
42: // MARK: - 初始化单元格
43: func initCells(){
44: hideAllMarks()
45: hideNumberBig()
46: self.enabled=true
47: self.layer.borderWidth=1
48: self.backgroundColor = UIColor.whiteColor()
49: self.titleLabel?.text = ""
50: self.titleLabel?.font = UIFont.systemFontOfSize(UIFont.systemFontSize()+25.0)
51: }
52:
53: }
在xib或storyboard中绘制格子,设置父类为UnitCell
具体结构为一个UnitCell内部包含9个label,一个子label Size10*21,UnitCell长宽 60*60。
然后创建点击这个UnitCell时执行的动作,
如图,选择中间那个两个圈圈的视图,右击我们刚刚创建好的UnitCell,将该UnitCell的TouchUpInside指向GameViewController中的空白处,如图
松开后弹出对话框,为事件取名,我们把他取名为onUnitCellTouch
具体里面写什么现在不着急,后面才会用到。之所以现在就设置,是因为一会要复制这个UnitCell,复制新的UnitCell,你创建的点击事件关系也会一起复制过去。避免麻烦。
(2)我们称能同时显示9个格子的单元格为S9Unit,
1: //
2: // S9Unit.swift
3: // sudoku-v02
4: //
5: // Created by 张泽阳 on 2/14/15.
6: // Copyright (c) 2015 张泽阳. All rights reserved.
7: //
8:
9: import Foundation
10: import UIKit
11: /**
12: 包含9个单元格(UnitCell)的九宫格
13: */
14: class S9Unit: UIView {
15: // MARK: - 初始化单元格
16: func initAllCells(){
17: // self.layer.borderWidth=2
18: for unit:UnitCell in self.subviews as [UnitCell]{
19: // println("S9's subviews:\(unit.description)\n\(unit.tag)")
20: unit.initCells()
21: }
22: self.layer.borderWidth=2
23: }
24: // MARK: - 取得指定tag单元格
25: func getTheUnit(j:Int) ->UnitCell{
26: for view:UnitCell in self.subviews as [UnitCell]{
27: if view.tag==j{
28: return view
29: }
30: }
31: println("Impossible!!!!!!!!!")
32: return UnitCell()
33: }
34: }
同理,在Storyboard中复制9份UnitCell,如图设置父类
每个UnitCell要设置 Tag,方便编程时获取,我们这里把第一个tag设置为0……第9个设置为8
到这里Xcode就开始有点卡了,建议建一个临时的xib文件进行设置,确定设置好了再拖到storyboard中。
(2)我们称能同时显示9个S9Unit格子的单元格为SNNUnit,
1: //
2: // S99Unit.swift
3: // sudoku-v02
4: //
5: // Created by 张泽阳 on 2/14/15.
6: // Copyright (c) 2015 张泽阳. All rights reserved.
7: //
8:
9: import Foundation
10: import UIKit
11: /**
12: 包含9个九宫格(S9Unit)的九宫格
13: */
14: class SNNUnit: UIView {
15: // MARK: - 初始化单元格
16: func initAllCells(){
17: // self.layer.borderWidth=3
18: self.hidden = false
19: for s9view:S9Unit in self.subviews as [S9Unit]{
20: // println("S99's subviews:\(s9view.description)\n\(s9view.tag)")
21: s9view.initAllCells()
22: }
23: self.layer.borderWidth=4
24: }
25: // MARK: - 取得指定tag单元格 i,j:i大格j小格
26: func getTheUnitCell(i:Int,j:Int) -> UnitCell{
27: for s9view:S9Unit in self.subviews as [S9Unit]{
28: // println("S99's subviews:\(s9view.description)\n\(s9view.tag)")
29: if s9view.tag==(90+i){
30:
31: return s9view.getTheUnit(j)
32:
33:
34: }
35: }
36:
37: println("Impossible!!!\(i) \(j)")
38: return UnitCell()
39: }
40:
41: }
界面设置如图
长宽540*540
2)数字选择视图(NumberPickerView)的创建
(1)数字选择视图如图右下角,
功能是在点击左侧的UnitCell后,点击右边的NumberPickerView中的一个数字,就可以把数字填进左侧所选空格中。
(2)首先建立196*196的View,取名NumberPickerView,内部存有9个数字Button,每个数字长宽60*60。
每个Button也设置一个TouchUpInside事件,我们取名为onTouchNumberPicker,并加上outlet方便调取。
3)设置标记视图(MarkerPickerView)
如图
196*196,每个格子是一个UnitCell,设置颜色如图,这里的UnitCell注意要重新设置TouchUpInside事件,我们取名为onTouchMarkerUnitCell,并加上outlet方便调取。
4)设置取消按钮
添加如图Button,背景设置为网上找的一张图片。设置TouchUpInside事件名称为onTouchCancelButton,并加上outlet方便调取。
5)设置看答案Button和返回Button
右上角加上这两个Button,设置TouchUpInside名称分别为 onAnswerAsked 和 onExitTouched。
3)构建游戏界面逻辑代码,备注什么的我尽量写详细了。判断游戏是否有错的方法为checkTotalAgain
注意由上一个选关界面转到游戏界面后,推出时应调用的代码为onExitTouched方法中的dismissViewControllerAnimated
由segue向下一个看答案界面传递数据时用prepareForSegue方法中的代码。
1: //
2: // ViewController.swift
3: // sudoku-v02
4: //
5: // Created by 张泽阳 on 2/13/15.
6: // Copyright (c) 2015 张泽阳. All rights reserved.
7: //
8:
9: import UIKit
10: class ViewController: UIViewController,remainProtocol,UIAlertViewDelegate {
11: // MARK: - 变量
12: // var pickedNumberArray = Array <Array <Int>> ()
13: // var pickedMarkerArray = Array <Array <String>> ()
14: var currentPickingUnitCell:UnitCell? = nil
15: var prePass = pass(mytitle: "", isPassed: false, prob: "", solves: [""])
16: // var cellTemp:UITableViewCell?
17: // var preInitials:Array <Array <Int>> = Array <Array <Int>>()
18: var remainCells = 81
19: var isSucc = false
20: var notErr = true
21: var remainCellsCounter:RemainCellsCounter? = nil
22: // var unavailableNums = Array <Bool> ()//标记每次不可选的数字 如果选的话就错了
23: // var errPosition = Array<(Int,Int)>()
24: // MARK: - 实现代理方法,处理成功时的方法
25: func remainZero() {
26: if notErr {succ()}
27: }
28: func succ(){
29: savePassedByMD5(prePass.problem)
30: isSucc = true
31: UIAlertView(title: "祝贺你", message: "成功解决这个数独游戏题!", delegate: self, cancelButtonTitle: "确定").show()
32: }
33: // MARK: - 保存通过关卡的状态
34: func savePassedByMD5(pro:String){
35: var md5 = (pro as NSString).md5()
36: // NSUserDefaults.standardUserDefaults().
37: // println(NSUserDefaults.standardUserDefaults().boolForKey(md5))
38: NSUserDefaults.standardUserDefaults().setBool(true, forKey: md5)
39: NSUserDefaults.standardUserDefaults().synchronize()
40: // boolForKey(md5)
41:
42: }
43: // MARK: - 标记视图的相关操作
44: @IBOutlet weak var myMarkers: UIView!
45:
46: @IBAction func onTouchMarkerUnitCell(sender: UnitCell) {
47:
48: // println("onTouchMarkerPicker")
49: // println("\(sender.tag) curr=\(currentPickingUnitCell?.tag)")
50: currentPickingUnitCell?.addNumberMark(sender.tag)
51: disableMarkerPickerAndNumberPicker()
52: currentPickingUnitCell = nil
53:
54: }
55: func enableCancelButton(){
56: cancelButton.enabled = true
57: }
58: // MARK: - 数字选择视图的相关操作
59: @IBOutlet weak var myNumberPickerView: NumberPickerView!
60: @IBAction func onTouchNumberPicker(sender: UIButton) {
61: // println("touched number picker")
62: // println(" tag = \(sender.tag)")
63: if currentPickingUnitCell?.titleLabel?.text == "" {
64: // --remainCells
65: currentPickingUnitCell?.setCertainNumberBig(sender.tag)
66: disableMarkerPickerAndNumberPicker()
67: checkTotalAgain()
68: remainCellsCounter?.dec()
69: }else{
70: currentPickingUnitCell?.setCertainNumberBig(sender.tag)
71: disableMarkerPickerAndNumberPicker()
72: checkTotalAgain()
73: remainCellsCounter?.notChanged()
74: }
75: // checkNumberAvailable(sender.tag)
76:
77:
78: // println("remainCells\(remainCellsCounter?.count)")
79: }
80: // MARK: - 使标记视图和数字选择视图可以点击
81: func enableMarkerPickerAndNumberPicker(){
82: // cancelButton.enabled = true
83: cancelButton.hidden = false
84: currentPickingUnitCell?.backgroundColor = UIColor.blueColor()
85: for view in myMarkers.subviews as [UnitCell] {
86: view.enabled = true
87: }
88: myMarkers.hidden = false
89: for view in myNumberPickerView.subviews as [UIButton] {
90: view.enabled = true
91: }
92: myNumberPickerView.hidden = false
93: var (i,j) = getIJwithCertainUnitCell(currentPickingUnitCell!)
94: // println("i\(i) j\(j)")
95: // disableCorrespondingButtonWithIJ(i,jj: j)
96: //MARK TODO 参数标记需要优化
97: // makeUnavailableButtonWithIJ(i,jj: j)
98: }
99: // MARK: - 使标记视图和数字选择视图不可以点击
100: func disableMarkerPickerAndNumberPicker(){
101: cancelButton.enabled = false
102: cancelButton.hidden = true
103: currentPickingUnitCell?.backgroundColor = UIColor.whiteColor()
104: for view in myMarkers.subviews as [UnitCell] {
105: view.enabled = false
106: }
107: myMarkers.hidden = true
108: for view in myNumberPickerView.subviews as [UIButton] {
109: view.enabled = false
110: }
111: myNumberPickerView.hidden = true
112: currentPickingUnitCell = nil
113: }
114:
115: func checkTotalAgain(){
116: for i in 0...8 {
117: var t = 0
118: for j in 0...8 {
119: // println("i,j\(i),\(j) \(getTheUnitCell(i, j: j).titleLabel?.text)")
120: if getTheUnitCell(i, j: j).titleLabel!.text!.isEmpty {
121: continue
122: }
123: var k = getTheUnitCell(i, j: j).titleLabel!.text!.toInt()!;
124: var m = t&(1<<k)
125: if m != 0 {
126: notErr = false
127: return
128: }else{
129: t+=1<<k
130: }
131: }
132: }
133: for i in 0...8 {
134: var t = 0
135: for j in 0...8 {
136: if getTheUnitCell(j, j: i).titleLabel!.text!.isEmpty {
137: continue
138: }
139: var k = getTheUnitCell(j, j: i).titleLabel!.text!.toInt()!;
140: var m = t&(1<<k)
141: if m != 0 {
142: notErr = false
143: return
144: }else{
145: t+=1<<k
146: }
147: }
148: }
149: for a in 0...8 {
150: var t = 0
151: for b in 0...8 {
152: var ii = (a/3)*3+b/3
153: var jj = (a%3)*3 + b%3
154: if getTheUnitCell(ii, j: jj).titleLabel!.text!.isEmpty {
155: continue
156: }
157: var k = getTheUnitCell(ii, j: jj).titleLabel!.text!.toInt()!;
158: var m = t&(1<<k)
159: if m != 0 {
160: notErr = false
161: return
162: }else{
163: t+=1<<k
164: }
165: }
166: }
167: notErr = true
168:
169: }
170: // MARK: - (废弃)给定i,j坐标搜索无效的数字并禁止点按
171: func disableCorrespondingButtonWithIJ(ii:Int,jj:Int){
172: for i in 0...8 {
173: if i == ii {continue}
174: var unit = getTheUnitCell(i, j: jj);
175: if unit.titleLabel?.text != "" {
176: // println(unit.titleLabel?.text)
177: clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
178: }
179: }
180: for j in 0...8 {
181: if j == jj {continue}
182: var unit = getTheUnitCell(ii, j: j);
183: if unit.titleLabel?.text != "" {
184: clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
185: }
186: }
187: var si = ii/3*3
188: var sj = jj/3*3
189: for i in si...si+2 {
190: for j in sj...sj+2 {
191: if (i == ii)&&(j == jj) {continue}
192: var unit = getTheUnitCell(i, j: j);
193: if unit.titleLabel?.text != "" {
194: clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
195: }
196: }
197: }
198:
199: }
200: // MARK: - (废弃)使标记视图和数字选择视图的某些数字不可选择
201: func clearMarkerPickerAndNumberPickerWithNumber(i:Int){
202: // println("clear \(i)!!!")
203: for view in myMarkers.subviews as [UnitCell] {
204: // println(view.tag)
205: if view.tag == i {
206: view.enabled = false
207: // println("view enable \(view.enabled)")
208: break
209: }
210: }
211: for view in myNumberPickerView.subviews as [UIButton] {
212: // println(view.tag)
213: if view.tag == i {
214: view.enabled = false
215: // println("view enable \(view.enabled)")
216: break
217: }
218: }
219: }
220: // MARK: - 视图初始化相关操作
221: @IBOutlet weak var s99unit: SNNUnit!
222: @IBOutlet weak var cancelButton: UIButton!
223: override func viewDidLoad() {
224: super.viewDidLoad()
225: // println(prePass.problem)
226: initAllMyCells()
227: // initUnavailableNums()
228: remainCellsCounter = RemainCellsCounter(delegate1: self)
229: //TODO
230: // initArrays()
231: // initArrays
232: initArrays(prePass.problem)
233: // remainCellsCounter?.count = remainCells
234:
235:
236: }
237: // MARK: - 设置点击取消按钮时的操作
238: @IBAction func onTouchCancelButton(sender: UIButton) {
239: currentPickingUnitCell?.initCells()
240: // ++remainCells
241: remainCellsCounter?.inc()
242: disableMarkerPickerAndNumberPicker()
243: checkTotalAgain()
244: }
245:
246:
247:
248: // MARK: - 数组初始化
249:
250: func initArrays(withCertainInitials:Array <Array <Int>>){
251: for i in 0...8 {
252: for j in 0...8{
253: if withCertainInitials[i][j]==0 {
254: continue
255: }else{
256: lockUnitCell(i,j: j)
257: setUnitCellWithNumber(i,j: j,v: withCertainInitials[i][j])
258: }
259: }
260: }
261: }
262: func initArrays(withString:NSString){
263: for i in 0...8 {
264: for j in 0...8{
265: var t:String = withString.substringWithRange(NSMakeRange(i*9+j, 1))
266: var cnum = t.toInt()
267: if cnum == 0 {
268: continue
269: }else{
270: lockUnitCell(i,j: j)
271: setUnitCellWithNumber(i,j: j,v: cnum!)
272:
273: }
274: }
275: }
276: }
277:
278:
279: // MARK: - 单元格相关操作
280: @IBAction func onUnitCellTouch(sender: UnitCell) {
281: // println("touched remainCells\(remainCells)")
282: // println(" tag =\(sender.superview?.tag) \(sender.tag)")
283: if (sender == currentPickingUnitCell) {
284: // println("same!")
285: currentPickingUnitCell = nil
286: sender.backgroundColor = UIColor.whiteColor()
287: disableMarkerPickerAndNumberPicker()
288: return
289: }
290: if currentPickingUnitCell != nil {
291: currentPickingUnitCell?.backgroundColor = UIColor.whiteColor()
292: currentPickingUnitCell = nil
293: }
294:
295: currentPickingUnitCell = sender
296: // clearUnavailableNumber()//每次按下不同的单元格无效数字需清空
297: enableMarkerPickerAndNumberPicker()
298: if currentPickingUnitCell?.titleLabel?.text != "" {
299: enableCancelButton()
300: }
301:
302: }
303:
304: //UnitCell Ops
305: func getTheUnitCell(i:Int, j:Int)->UnitCell{
306: var a = (i/3)*3+j/3
307: var b = (i%3)*3+j%3
308: // println("(\(i),\(j))-> \(a), \(b)")
309: return s99unit.getTheUnitCell(
310: a
311: ,j: b
312: )
313:
314: }
315: func getIJwithCertainUnitCell(unit:UnitCell)->(i:Int,j:Int){
316: var b = unit.tag
317: var a = unit.superview!.tag % 10
318: // println("touch unit a\(a) b\(b)")
319: var ii = (a/3)*3+b/3
320: var jj = (a%3)*3 + b%3
321: return (ii,jj)
322:
323: }
324: func setUnitCellWithNumber(i:Int,j:Int,v:Int){
325: var unit = getTheUnitCell(i,j: j)
326: unit.setCertainNumberBig(v)
327: // --remainCells
328: remainCellsCounter?.dec()
329: }
330: func lockUnitCell(i:Int,j:Int){
331: var unit = getTheUnitCell(i,j: j)
332: unit.lockUnit()
333: }
334: func highlightUnitCell(cell:UnitCell,withColor:UIColor){
335: cell.backgroundColor = withColor
336: }
337: func initAllMyCells(){
338: s99unit.initAllCells()
339: for markerView in myMarkers.subviews as [UnitCell]{
340: markerView.layer.borderWidth=1
341: // markerView.setBackgroundImage(UIImage(named: "banBack"), forState: UIControlState.Disabled)
342: }
343: for numPickerView in myNumberPickerView.subviews as [UIButton]{
344: numPickerView.layer.borderWidth = 1
345: // numPickerView.setBackgroundImage(UIImage(named: "banBack"), forState: UIControlState.Disabled)
346: }
347:
348: disableMarkerPickerAndNumberPicker()
349:
350: }
351: // MARK: - 退出按钮操作
352: @IBAction func onExitTouched(sender: UIButton) {
353: // println("t")
354: // self.navigationController?.popToRootViewControllerAnimated(true)
355: // self.dismissViewControllerAnimated(true, completion:^{
356: //
357: // })
358: self.dismissViewControllerAnimated(true, completion: { () -> Void in
359: if self.isSucc {
360: NSNotificationCenter.defaultCenter().postNotificationName("reload", object: self)
361: }
362: })
363: }
364: // MARK: - 看答案按钮相关操作
365: @IBAction func onAnswerAsked(sender: AnyObject) {
366:
367: // var alert:UIAlertView!
368:
369: if prePass.solves.count>1 {
370: UIAlertView(title: "看答案", message: "确认看答案?", delegate: self, cancelButtonTitle: "取消",otherButtonTitles:"答案一","答案二").show()
371: }else{
372: UIAlertView(title: "看答案", message: "确认看答案?", delegate: self, cancelButtonTitle: "取消",otherButtonTitles:"答案一").show()
373:
374: }
375:
376:
377: }
378: var currentAns = 0
379: // MARK: alertview代理实现
380: func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int){
381: // println("touched \(alertView.title) \(buttonIndex) \(alertView.buttonTitleAtIndex(buttonIndex))")
382: if alertView.title == "看答案" {
383:
384: //
385: if alertView.buttonTitleAtIndex(buttonIndex) != "取消" {
386: currentAns = buttonIndex - 1
387: self.performSegueWithIdentifier("ans", sender: nil)
388:
389: }
390:
391: }
392: }
393:
394:
395: // MARK: 设置看答案时传递的参数
396: override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
397: if segue.identifier == "ans" {
398: var detailViewController:ShowAnswerController! = segue.destinationViewController as ShowAnswerController
399: // var index = self.tableView.indexPathForSelectedRow()
400: detailViewController.ans = prePass.solves[currentAns]
401: // detailViewController.cellTemp = (sender as UITableViewCell)
402:
403: }
404: }
405: override func didReceiveMemoryWarning() {
406: super.didReceiveMemoryWarning()
407: // Dispose of any resources that can be recreated.
408: }
409: // MARK: - 不用的代码以作备用
410: func junks(){
411: // override func targetViewControllerForAction(action: Selector, sender: AnyObject?) -> UIViewController? {
412: // return ShowAnswerController()
413: // }
414: //Initials
415: // func initArrays(){
416: // for i in 0...8
417: // {
418: // pickedNumberArray.append(Array(count:9,repeatedValue:0))
419: // }
420: // for i in 0...8
421: // {
422: // pickedMarkerArray.append(Array(count:9,repeatedValue:""))
423: // }
424: // }
425: /*
426: var boxLength = min(Int(self.view.frame.width)/5,Int(self.view.frame.height)/5)
427: println(boxLength)
428: var i=0,j=0
429: var marginY = (Int(self.view.frame.width) - boxLength*3)/4
430: var marginX = (Int(self.view.frame.height) - boxLength*3)/4
431: // for i in 0...8 {
432: // var sudokuView:UIView = UIView()
433: // sudokuView.backgroundColor = UIColor.redColor()
434: // sudokuView.frame = CGRectMake(
435: // margin*CGFloat(i-1)+CGFloat(boxLength*(i%3))
436: // ,margin*CGFloat(i-1)+CGFloat( boxLength*(i/3))
437: // , CGFloat(boxLength), CGFloat(boxLength))
438: //// sudokuView.
439: // self.view.addSubview(sudokuView)
440: // }
441:
442: for i in 0..<3 {
443: for j in 0..<3 {
444: var sudokuView:UIView = UIView()
445: sudokuView.backgroundColor = UIColor.whiteColor()
446: sudokuView.frame = CGRectMake(
447: CGFloat(boxLength*(i)+(i+1)*marginY)
448: ,CGFloat( boxLength*(j)+(j+1)*marginX)
449: ,CGFloat(boxLength), CGFloat(boxLength)
450: )
451: sudokuView.layer.borderWidth=2
452: sudokuView.layer.borderColor=UIColor.blackColor().CGColor
453: self.view.addSubview(sudokuView)
454: }
455: }*/
456:
457: // println(((self.view.subviews.first) as UIView).description)
458: // println( ((self.view.subviews.first) as S99Unit).isKindOfClass(S99Unit) )
459: // (self.view.subviews.first as S99Unit).initAllCells()
460: // for view in self.view.subviews{
461: // println(view.description)
462: // if view.tag==1000 {
463: //// view.name
464: // println(view.name)
465: // (view as S99Unit).initAllCells()
466: // }
467: // }
468: // println(s99unit .isKindOfClass(SNNUnit))
469: // println(s99unit .isKindOfClass(UIView))
470: // println(s99unit)
471:
472: // myMarkers.layer.borderWidth=2
473: //// myMarkerPickerView.backgroundColor = UIColor.brownColor()
474: // for markerView in myMarkerPickerView.subviews as [UnitCell]{
475: // println("got 1 unit\(markerView.description)")
476: // myMarkerPickerView.bringSubviewToFront(markerView)
477: // markerView.hidden = false
478: // for eachUnit in markerView.subviews as [UILabel]{
479: // eachUnit.hidden = false
480: // eachUnit.layer.borderWidth=2
481: //
482: // }
483: // markerView.backgroundColor = UIColor.blackColor()
484: // markerView.layer.borderWidth=2
485: //// markerView.frame = CGRectMake(CGFloat(715), CGFloat(20), CGFloat(60), CGFloat(60))
486: // }
487: /* // MA_RK: -给定i,j坐标搜索无效的数字并标记
488: func makeUnavailableButtonWithIJ(ii:Int, jj:Int){
489: for i in 0...8 {
490: if i == ii {continue}
491: var unit = getTheUnitCell(i, j: jj);
492: if unit.titleLabel?.text != "" {
493: // println(unit.titleLabel?.text)
494: markNumUnavailable(unit.titleLabel!.text!.toInt()!)
495: // clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
496: }
497: }
498: for j in 0...8 {
499: if j == jj {continue}
500: var unit = getTheUnitCell(ii, j: j);
501: if unit.titleLabel?.text != "" {
502: // clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
503: markNumUnavailable(unit.titleLabel!.text!.toInt()!)
504: }
505: }
506: var si = ii/3*3
507: var sj = jj/3*3
508: for i in si...si+2 {
509: for j in sj...sj+2 {
510: if (i == ii)&&(j == jj) {continue}
511: var unit = getTheUnitCell(i, j: j);
512: if unit.titleLabel?.text != "" {
513: // clearMarkerPickerAndNumberPickerWithNumber(unit.titleLabel!.text!.toInt()!)
514: markNumUnavailable(unit.titleLabel!.text!.toInt()!)
515: }
516: }
517: }
518:
519: }*/
520: /* // MA_RK: - 标记无效数字
521: func markNumUnavailable(n:Int){
522: // unavailableNum ^= n
523: unavailableNums[n] = true
524: }
525: // MA_RK: 检查所选数字是否有效
526: func checkNumberAvailable(n:Int){
527: // return (unavailableNum&n != 0)
528: if unavailableNums[n] == true {
529: notErr = false
530: }
531: }
532: // MAR_K: 清空无效数字标记
533: func clearUnavailableNumber(){
534: var i = 0
535: for i=0;i<unavailableNums.count;++i {
536: unavailableNums[i] = false
537: }
538: }
539: // MA_RK: 初始化无效数字
540: func initUnavailableNums(){
541: var i = 0
542: for i=0;i<10;++i{
543: unavailableNums.append(false)
544: }
545: }
546: */
547: }
548: }
549:
iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑的更多相关文章
- 基于第二次数独游戏,添加GUI界面
高级软件工程第三次作业:基于第二次数独游戏,添加GUI界面.GUI界面代码如下: package firstGui; import java.awt.*; import java.awt.event. ...
- iOS开发 Swift开发数独游戏(一)
一.前言 我姥姥是一名退休数学老师,一直很喜欢玩数独游戏.我以前答应过她要给她写一个数独游戏.本来计划是写一个Android应用的,但恰好我学了好长时间iOS开发一直没做什么"大项目&quo ...
- iOS开发 Swift开发数独游戏(三) 选关界面
一.选关界面涉及到的功能点 1)需要UITableView以及相应数据代理.协议的实现 2)读取plist文件并转化成模型 3)在单元格点击后进入数独游戏,涉及到把数据经segue在UIViewCon ...
- iOS开发 Swift开发数独游戏(五)显示游戏答案
要点是设置好Tag就好,通过代码找到并初始化即可. 1: // 2: // ShowAnswerController.swift 3: // sudoku-v02 4: // 5: // ...
- iOS开发 Swift开发数独游戏(二)数独题目的生成
一.Plist文件结构设计 由于要预先生成数独题目的文件,我自然而然想到用plist存取. 我用Xcode建了几个plist文件来熟悉这种文件使用的结构后设计了如下结构: 为区分难度(后来了解到挖空数 ...
- IOS系列swift语言之课时四
今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...
- iOS、swift、React Native学习常用的社区、论坛
<!----iOS> <!----Swift>*IOS开发常用社区:http://code4app.com/ *IOS开发常用社区:http://www.cocoachina. ...
- iOS开发Swift篇—(四)运算符
iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...
- 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进
项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...
随机推荐
- corosync.conf
##totem定义集群内各节点间是如何通信的,totem本是一种协议,专用于corosync专用于各节点间的协议,协议是有版本的 totem { ##版本号 version: ##安全认证on|off ...
- Elasticsearch相关度评分_score
相关度评分 _score 的目的 是为了将当前查询的结果进行排序,比较不同查询结果的相关度评分没有太大意义. _score的计算方式 score(q,d) = # score(q,d) 是文档 d 与 ...
- mssql发布订阅事项
在发布订阅过程中遇到2个需求: 1.在原有的发布快照中增加发布内容,追加模式需要在追加的表中设计一个主键,要不然没有办法进行发布的,另外还得注意将这两个字段进行更改: select immediate ...
- Metaspolit
Metaspolit介绍 Metasploit是一款开源的安全漏洞检测工具,安全工作人员常用 Metasploit工具来检测系统的安全性.Metasploit Framework (MSF) 在200 ...
- .net的CLR
搜索:CLR结构图 C#所具有的许多特点都是由CLR提供的,如类型安全(Type Checker).垃圾回收(Garbage Collector).异常处理(Exception Manager).向下 ...
- 多线程 线程组 ThreadGroup
package org.zln.thread; import java.util.Date; /** * Created by sherry on 000024/6/24 22:30. */ publ ...
- 【CF edu 27 G. Shortest Path Problem?】
time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...
- CF10D LCIS (动态规划)
题目链接 Solution 动态规划. 令 \(f_{i,j}\) 表示 \(a\) 数组前 \(i\) 个和 \(b\) 数组前 \(j\) 所得的最长的 LCIS . 转移很好想: \(a_i!= ...
- SqliteDeveloper 破解
方法1: 注册表删除 HKEY_CURRENT_USER\SharpPlus\SqliteDev 下的 StartDate 方法2: 安装完成SQLite Developer后,先不要打开软件,下面 ...
- [LeetCode] Sqrt(x) 二分搜索
Implement int sqrt(int x). Compute and return the square root of x. Hide Tags Math Binary Search ...