【跟随教授的讲解和演示,并重做了课上的demo之后,惊奇地发现自己写的程序有 bug,界面上12张卡牌出现后,点击任何一个,其他所有卡牌都会变成一块白板……在经历了长时间的调试之后悲催地发现,在最后的updateUI这个函 数中改变背景的函数写错了,setBackgroundImage:写成了setImage:,被这一无脑的失误纠结了这么久,丢人啊……各种bug改完 后,前几次课的代码都已经传到博客的资源中了,可到我的资源页下载。】

这一课中,之前实现的扑克牌翻转被扩展为一个比较完整的卡牌点数和花色比较游戏。程序的xib界面和包含的文件如下图所示:

其中的各个文件的具体内容,课程附带的pdf中均有详细的代码,也可以参照下载资源中我敲进去的代码。界面上的12张卡牌,每一个都与touchCardButton:函数联系,也就是说点击任意一张牌都会调用touchCardButton这个函数。

- (IBAction)touchCardButton:(UIButton *)sender
{int index = [self.cardButtons indexOfObject:sender];[self.game chooseCardAtIndex:index]; [self updateUI];
}

这个函数中只有三条语句,但是背后实现了全部的功能。

第一句:

int index = [self.cardButtons indexOfObject:sender];

从界面上的12张卡牌的按钮中获取选中的索引,也就是点了哪一张牌;

第二句:

[self.game chooseCardAtIndex:index];  

看似简单,背后却包含大量的工作。首先self.game调用了view controller中重载的getter方法:

-(CardMatchingGame *) game
{if (!_game){_game = [[CardMatchingGame alloc] initWithCardCount:[self.cardButtons count] usingDeck:[self createDeck]];}return _game;
}

在这个函数中又调用了createDeck和CardMatchingGame类的initWithCardCount方法,模拟了“发牌”的这个过程。 当self.game这个函数执行完后,可以认为不但已经完成了游戏规则的定义,同时也确定了扣在牌桌上的12张牌是哪些。

随后调用的chooseCardAtIndex是CardMatchingGame类的成员函数,实现了翻牌后对这张牌状态的判断,包括判断牌之前是否被选中、是否处于与其他牌匹配的状态中等等。

- (void)chooseCardAtIndex:(NSUInteger)index
{Card *card = [self cardAtIndex:index];if (!card.isMatched){if (card.isChosen){card.chosen = NO;}else{//与其他比较for (Card *otherCard in self.cards){if (otherCard.isChosen && !otherCard.isMatched){int matchScore = [card match:@[otherCard]];if (matchScore){self.score += matchScore * MATCH_BONUS;card.matched = YES;otherCard.matched = YES;}else{self.score -= MISMATCH_PENALTY;otherCard.chosen = NO;}break;}}self.score -= COST_TO_CHOOSE;card.chosen = YES;}}
}

该函数执行完成后,Model数据(也就是在self.game中的卡牌数据)根据规则发生了变化(主要是卡牌的match和chosen两个属性)。随 后调用的[self updateUI]中将重新遍历这些数据,并根据其变化更新界面,包括显示选定的牌、将处于匹配状态下的牌锁定。

-(void) updateUI
{for (UIButton *cardButton in self.cardButtons){int index = [self.cardButtons indexOfObject:cardButton];Card *card = [self.game cardAtIndex:index];[cardButton setTitle:[self titleForCard:card] forState:UIControlStateNormal];[cardButton setBackgroundImage:[self backgroundImageForCard:card] forState:UIControlStateNormal];cardButton.enabled = !card.isMatched;}self.scoreLabel.text = [NSString stringWithFormat:@"Score: %d",self.game.score];
}

回顾整个工程,教授的确是将之前讲述的MVC的思想深刻地贯彻到了工程之中,把数据、规则和界面区分的非常清楚。这样做的好处就是不但程序清晰明了,而且扩展性强,在未来对某个模块进行扩展的时候,可以获得更好的兼容性。

原文:http://blog.csdn.net/shaqoneal/article/details/14143357

iOS7应用开发3、Objective-C相关推荐

  1. 【iOS 开发】Objective-C 运算符

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41624613 参考文章 : 1.[iOS 开发]Object-C 运算符 2.[iO ...

  2. iOS7应用开发1、菜鸟那点儿事儿

    序:今天开始新开一个坑,作为一个准备了许久却依然摆 脱不了24k纯菜鸟身份的程序员,跟随Stanford的世界未来精英们一起学习iOS7应用开发的相关知识,同时也是为了自己以后的业余项目做准备,提 升 ...

  3. iPhone软件开发编程语言Objective C学习资料

    iPhone软件开发编程语言Objective C学习资料 一.XCode.Objective-C.Cocoa说的是几样东西? 答案:三样东西.   XCode:你可以把它看成是一个开发环境,就好像V ...

  4. 最新IOS7 越狱开发环境搭建

    针对ios7.x版本,使用iOSOpenDev进行开发. 一.Mac端 基础要求: Mac OS X 10.8及以上(推荐Mac OS X 10.9): XCode5.0及以上: Command Li ...

  5. 【iOS 开发】Objective-C 入门 Xcode 环境详解

    作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38424965 一. Xcode 环境安装 与 工程创建 1. ...

  6. iOS7应用开发2、关于新版的IDE:XCode 5

    XCode 5是当前Apple提供给开发者最新版本的开发环境,目前最新的版本为5.0.1,在苹果开发者官网上可以免费下载.网址为:https://developer.apple.com/xcode/. ...

  7. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  8. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  9. 【IOS 开发】Objective - C 语法 之 流程控制

    1. if 条件语句 if 表达式 : 表达式是一个 整型 或者 布尔型, 0 或者 FALSE 为 FALSE, 大于 0 为 TRUE; 代码示例 : /********************* ...

  10. 【iOS 开发】Objective - C 语法 之 类型转换

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...

最新文章

  1. [ZJOI2010]网络扩容
  2. std::shuffle-c++
  3. boost::hana::experimental::type_name用法的测试程序
  4. IJ-java-com-util-common:
  5. 如何让 dotnetcore 在 Linux 上后台运行?
  6. java泛型程序设计——翻译泛型表达式+翻译泛型方法
  7. 多媒体计算机属于哪种教学,多媒体计算机属于哪种教学媒体(???)。
  8. 收藏 | 机器学习特征选择方法总结
  9. .NET Enterprise 4.1.5的工作流引擎
  10. 毕业论文格式大全、排版技巧及常见问题汇总
  11. 博图软件的C语言脚本,wincc v13 博图软件里如何写脚本程序
  12. java.lang.reflect.UndeclaredThrowableException
  13. VS程序中使用ODBC登陆sql数据库的时候出现18456错误
  14. pdps安装oracle12安装,Tecnomatix PDPS安装教程适用于Oracle版本11g
  15. 数据库中间件Mycat诞生记2
  16. 利用python制作转盘
  17. pyqt5中显示web页面(外部web、本地web)
  18. Ubuntu-12.04 OpenStack (Folsom)安装和部署手册
  19. ibm入职测试题太难了_IBM面试经验
  20. PC端五款超级好用的软件 你的电脑不容错过

热门文章

  1. Vigenère密码(信息学奥赛一本通-T1402)
  2. 浮点型数据类型存储空间大小(信息学奥赛一本通-T1017)
  3. python开发视频大全_2019年python开发编程21天快速入门视频教程+书籍大全和面试大礼包...
  4. php 查询数据排序,php如何对查询结果集进行排序
  5. RabbitMQ集群并处理失败
  6. 使用EndNote X9引用参考文献并在Word中修改生成的引文格式(编号、字体大小)GBT7714(numeric)
  7. Bootstrap-CSS-按钮-图片-辅助类-响应式
  8. fastadmin token 验证错误_用签名保护你的隐私(4)--token生成
  9. python自动生成word报告_python自动化生成分析报告,让你的工作效率提升10倍+
  10. 富文本编辑器:Typora(编辑与预览一体化)