首页 > 其他分享 >iOS7应用开发3、Objective-C

iOS7应用开发3、Objective-C

时间:2023-03-27 18:35:54浏览次数:48  
标签:cardButton index self otherCard game iOS7 应用 Objective card


 



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

 

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

iOS7应用开发3、Objective-C_重做

其中的各个文件的具体内容,课程附带的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的思想深刻地贯彻到了工程之中,把数据、规则和界面区分的非常清楚。这样做的好处就是不但程序清晰明了,而且扩展性强,在未来对某个模块进行扩展的时候,可以获得更好的兼容性。

 

标签:cardButton,index,self,otherCard,game,iOS7,应用,Objective,card
From: https://blog.51cto.com/u_8895844/6152837

相关文章

  • iOS7应用开发5、视图控制器View Controller及其生命周期
    1、UITextView:该类与Label类类似,可显示多行,可以编辑内容,可以滚动查看内容;包含属性NSTextStorage*textStorage,该类是NSMutableAttributedString的基类;修改该属性可以自动更......
  • iOS7应用开发4、Foundation框架
    1、动态绑定:id类型的对象,表示指向未知类型对象的指针;指向对象的实际类型在运行时指定。在使用时,注意check该对象是否响应调用的方法(respondsToSelector)。可以将一个静态类型......
  • iOS7应用开发6:UINavigation, UITabbar控制器的多态性
    1、前期所实现的PlayingCard游戏,其ViewController只能适应PlayingCard这一种游戏规则。而将createDeck函数修改为返回一个nil后,整个ViewController与PlayingCard就没有关......
  • 锁屏后应用保持运行怎么设置
    本答案介绍了荣耀50、华为P40两种锁屏后使应用保持后台运行的方法,以下是荣耀50锁屏后使应用保持后台运行的操作步骤:点击电池打开手机设置页面,下拉找到并点击电池。 ......
  • 原生 谷歌地图 应用
    简介谷歌地图(GoogleMap)是Google公司提供的电子地图服务,包括局部详细的卫星照片。它提供了三种视图:一是矢量地图(传统地图),可提供政区和交通以及商业信息;二是不同分辨率的......
  • Deer_GF之SpriteAtlas与AssetBundle应用
    Deer_GF之SpriteAtlas与AssetBundle应用最近做出包性能优化,发现框架出包后UI上引用的图片精灵丢失。于是就想对这个UnityUGUISpriteAtlas一探究竟。接下来我们开始吧。......
  • 微软被狠狠地扇了一巴掌,CloudOn发布MS Office iPad应用
    据国外媒体报道,近日硅谷一家低调的创业公司CloudOn发布了一款同名iPad应用,允许用户通过iPad设备访问和创建MSOffice文档。通过与Dropbox协同合作,CloudOn允许用户在平板......
  • 普通&文艺&二逼的iPhone音乐应用推荐
    音乐是大多数人生活中不可或缺的元素,特别是在闲暇之余许多人都用手机听音乐。还在头疼应该选择哪个音乐应用么,看看我的推荐吧,不管你是普通、文艺还是二逼青年,总会有款适合......
  • Maven高级——多环境配置与应用
    多环境配置与应用 开发步骤定义多环境<!--配置多环境--><profiles><!--开发环境--><profile><id>env_dep</id><properties>......
  • Chris Dixon:四类移动应用具备投资价值
    编者按:本文作者ChrisDixon身兼创业者(Hunch联合创始人、FounderCollective联合创始人)和投资人(多家科技企业,包括Skype、Foursquare、Kickstarter等的早期个人投资者)双重角......