zoukankan      html  css  js  c++  java
  • UIKit基础:15-与电脑玩剪刀石头布

    在前面, 我们学会了许多空间, 也利用了控件做了某些事情, 现在我们来用控件和电脑玩个小游戏, 也就是我们以前经常玩的游戏, 剪刀石头布:


    搭建storyboard界面:



    这里有一个注意点, 就是石头剪刀布的下面还有一个按钮:


    记得要添加进去, 添加进去之后, 就把View恢复到第一张图的样子:


    然后我们来关联控件:



    在这里, 我们需要导入两个框架, 一个是AVFoundation, 另一个是AudioToolbox, 下面让我们来看看怎么实现:

    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    #import <AudioToolbox/AudioToolbox.h>
    
    @interface ViewController ()
    {
        NSArray *_imageList;
        AVAudioPlayer *_backMuiscPlayer;
        
        SystemSoundID _winSound;
        SystemSoundID _faildSound;
        SystemSoundID _drewSound;
        SystemSoundID _clickSound;
    }
    @end

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 1.设置数组
        _imageList = @[[UIImage imageNamed:@"石头"],
                           [UIImage imageNamed:@"剪刀"],
                           [UIImage imageNamed:@"布"]
                           ];
        
        // 2.设置图像的动画数组
        [_computerImageView setAnimationImages:_imageList];
        [_playerImageView setAnimationImages:_imageList];
        // 3.设置图像的动画时长
        [_computerImageView setAnimationDuration:1.0f];
        [_playerImageView setAnimationDuration:1.0f];
        // 4.开始动画
        [_computerImageView startAnimating];
        [_playerImageView startAnimating];
        
        _backMuiscPlayer = [self loadPlayer];
        [_backMuiscPlayer setVolume:0.3f];
        [_backMuiscPlayer play];
    
        _winSound = [self loadSound:@"胜利.aiff"];
        _faildSound = [self loadSound:@"失败.aiff"];
        _drewSound = [self loadSound:@"和局.aiff"];
        _clickSound = [self loadSound:@"点击按钮.aiff"];
    
    }

    #pragma mark 初始化播放器
    - (AVAudioPlayer *)loadPlayer
    {
        // 5.初始化音乐播放器
        // 5.1初始化播放器需要指定音乐文件的路径
        NSString *path = [[NSBundle mainBundle] pathForResource:@"背景音乐" ofType:@"caf"];
        // 5.2将路径转换为URL
        NSURL *url = [NSURL fileURLWithPath:path];
        // 5.3初始化音乐播放器
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        
        // 6.设置播放器属性
        // 设置播放次数
        [player setNumberOfLoops:-1];
        [player prepareToPlay];
        [player play];
        return player;
    }
    
    #pragma mark 加载音效
    - (SystemSoundID)loadSound:(NSString *)soundFileName
    {
        // 1.需要指定声音的文件路径.
        NSString *path = [[NSBundle mainBundle] pathForResource:soundFileName ofType:nil];
        
        // 2.将路径字符串转换成URL
        NSURL *url = [NSURL fileURLWithPath:path];
        
        // 3.初始化音效
        SystemSoundID soundID;
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
    
        return soundID;
    }
    

    - (IBAction)resumeGame:(UIButton *)sender {
        [UIView animateWithDuration:0.5f animations:^{
            [_actionView setCenter:CGPointMake(_actionView.center.x, _actionView.center.y - 120)];
        }];
    
        [_computerImageView startAnimating];
        [_playerImageView startAnimating];
    
        [_messageLabel setText:@""];
    }
    
    - (IBAction)playerAction:(UIButton *)sender
    {
        NSLog(@"player tag:%ld", sender.tag);
        
        NSUInteger computerResult = arc4random_uniform(3);
        NSUInteger playerResult = sender.tag;
        
        NSUInteger result = playerResult - computerResult;
        
        NSString *string;
        
        // 判断胜负结果
        if (result == 0) {
            AudioServicesPlaySystemSound(_drewSound);
            string = @"哎哟,平局了";
        } else if (result == -1 || result == 2) {
            AudioServicesPlaySystemSound(_winSound);
            string = @"哦耶,你赢了";
            NSUInteger playerScore = [_playerLabel.text integerValue];
            playerScore++;
            [_playerLabel setText:[NSString stringWithFormat:@"%ld", playerScore]];
        } else {
            AudioServicesPlaySystemSound(_faildSound);
            string = @"太可惜了,再接再厉";
            NSUInteger computerScore = [_computerLabel.text integerValue];
            computerScore++;
            [_computerLabel setText:[NSString stringWithFormat:@"%ld", computerScore]];
        }
        [_messageLabel setText:string];
    
        // 停止动画
        [_computerImageView stopAnimating];
        [_playerImageView stopAnimating];
        
        // 设置图片
        [_computerImageView setImage:_imageList[computerResult]];
        [_playerImageView setImage:_imageList[playerResult]];
        
        [UIView animateWithDuration:0.5f animations:^{
            [_actionView setCenter:CGPointMake(_actionView.center.x, _actionView.center.y + 120)];
        }];
    
    }


    最终的效果就由大家自行去看了, 现在我们来解释一下:

    arc4random_uniform(): 随机函数.

    AVFoundation:音频框架

    AudioToolbox:音频框架


    编程思想:

     1. 让计算机和玩家的图片播放序列帧动画

        提示:序列帧动画的图像顺序,最好和界面上的TAG保持一致

     2. 等待玩家出拳,判定游戏结果

     

     播放声音的顺序

     1. 引入AVFundation框架头文件

     2. 定义声音播放器

     3. 初始化声音播放器

     4. 设置声音播放器属性

     5. 开始播放


  • 相关阅读:
    在wepy里面使用redux
    使用es6的蹦床函数解决递归造成的堆栈溢出
    解决layui下拉选择框只能选择不能手动输入文字
    POJ 2230 Watchcow (欧拉回路)
    POJ 2337 Catenyms (欧拉回路)
    POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
    HDU 3018 Ant Trip (欧拉回路)
    HDU 1023 Train Problem II (大数卡特兰数)
    HDU 2067 小兔的棋盘 (卡特兰数)
    HDU 3584 Cube (三维数状数组)
  • 原文地址:https://www.cnblogs.com/iOSCain/p/4333152.html
Copyright © 2011-2022 走看看