iOS 小遊戲項目——你話我猜升級版

級別: ★☆☆☆☆
標籤:「iOS」「小遊戲項目」「你話我猜」
做者: MrLiuQ
審校: QiShare團隊php

前言:最近公司部門在組織團建,須要準備兩個團建小遊戲, 分別是「數字速算升級版」和「你話我猜升級版」。git

小編琢磨了一下,發現這個兩個小項目很適合iOS入門學習,故這篇文章誕生了。 本篇將介紹iOS 小遊戲項目——你話我猜升級版。 但願經過這篇文章,幫助對iOS感興趣的同窗快速入門iOS。github

咱們先來看看效果圖:算法

效果圖

1、項目需求:

  1. UI層面: 比較基礎,上面三個Label顯示數據(分別是:錯誤數、倒計時、正確數),中間的一個大Label顯示所猜詞條,下面三個Button分別對應(答錯、開始/復位、答對)。

圖解: 數組

UI

  1. 邏輯層面:bash

    • 點擊對/錯按鈕,對應的Label的數字要+1
    • 作一個計時器,遊戲時長定爲300秒,時間到0時,結束遊戲,對/錯按鈕禁止點擊。
    • 點擊開始、對/錯按鈕,中間的詞條都須要更新。
    • 點擊開始按鈕,出現一個彈窗,點擊肯定,開始倒計時。
  2. 詞庫搭建:微信

    • 詞庫難度分爲5個等級,等級越高,抽到的機率越小。
    • 詞庫去重處理,抽到的詞條再也不顯示。
    • 機率算法。

2、實現思路:

1. UI層面:dom

  • 方式一:storyboard(拖控件、加約束)。
  • 方式二:純代碼。

項目中,我選擇的storyboard。獨立開發時,使用storyboard比較高效。工具

@property (weak, nonatomic) IBOutlet UILabel *wordLabel;//!< 猜題Label
@property (weak, nonatomic) IBOutlet UILabel *secondsLabel;//!< 計時Label
@property (weak, nonatomic) IBOutlet UILabel *correctLabel;//!< 成功計數Label
@property (weak, nonatomic) IBOutlet UILabel *wrongLabel;//!< 失敗計數Label
@property (weak, nonatomic) IBOutlet UIButton *correctButton;//!< 成功按鈕
@property (weak, nonatomic) IBOutlet UIButton *wrongButton;//!< 失敗按鈕
@property (weak, nonatomic) IBOutlet UIButton *startButton;//!< 開始按鈕
複製代碼

2. 業務邏輯:學習

  • 所要保存的屬性:
@property (nonatomic, assign) NSUInteger seconds;//!< 剩餘時間
@property (nonatomic, assign) NSInteger correctCount;//!< 答對題數
@property (nonatomic, assign) NSInteger wrongCount;//!< 答錯題數

@property (nonatomic, strong) QiGuessWords *guessWords;//!< 詞條(題目)
@property (nonatomic, strong) NSTimer *timer;//!< 計時器
複製代碼
  • 開始按鈕業務邏輯:
//! 開始按鈕點擊事件
- (IBAction)startButtonClicked:(UIButton *)sender {
    
    NSString *message = [NSString stringWithFormat:@"肯定要 %@ 嗎?", sender.currentTitle];
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:sender.currentTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        sender.selected = !sender.selected;
    
        self.correctButton.enabled = !self.correctButton.enabled;
        self.wrongButton.enabled = !self.wrongButton.enabled;
        
        if (sender.selected) {
            self.wordLabel.text = self.guessWords.randomWord;
            [self startTimer];
        } else {
            [self resetElements];
        }
    }];
    [alertController addAction:cancelAction];
    [alertController addAction:confirmAction];
    
    [self.navigationController presentViewController:alertController animated:YES completion:nil];
}
複製代碼
  • 成功/失敗按鈕業務邏輯:
//! 成功按鈕點擊事件
- (IBAction)correctButtonClicked:(id)sender {
    
    _correctLabel.text = [NSString stringWithFormat:@"%li",(long)++_correctCount];
    _wordLabel.text = _guessWords.randomWord;
}

//! 失敗按鈕點擊事件
- (IBAction)wrongButtonClicked:(id)sender {
    
    _wrongLabel.text = [NSString stringWithFormat:@"%li",(long)++_wrongCount];
    _wordLabel.text = _guessWords.randomWord;
}
複製代碼
  • 定時器相關代碼:
#pragma mark - Private functions

- (void)startTimer {
    
    [self stopTimer];
    
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
}

- (void)stopTimer {
    
    [_timer invalidate];
    _timer = nil;
}

- (void)countDown {

    _secondsLabel.text = [NSString stringWithFormat:@"%li", (long)--_seconds];
    
    if (_seconds <= 0) {
        [self stopTimer];
        _correctButton.enabled = NO;
        _wrongButton.enabled = NO;
    }
    else if (_seconds < 30) {
        _secondsLabel.textColor = [UIColor redColor];
    }
}
複製代碼
  • 重置元素邏輯:
- (void)resetElements {
    
    _wordLabel.text = @"";
    
    _seconds = 300;
    _wrongCount = 0;
    _correctCount = 0;
    _secondsLabel.text = [NSString stringWithFormat:@"%li", (long)_seconds];
    _correctLabel.text = [NSString stringWithFormat:@"%li", (long)_correctCount];
    _wrongLabel.text = [NSString stringWithFormat:@"%li", (long)_wrongCount];
    _correctButton.enabled = NO;
    _wrongButton.enabled = NO;
    _startButton.enabled = YES;
    
    [self stopTimer];
}
複製代碼

3、難點:詞庫工具

詞庫的難點在於:去重、分級、按機率抽題。

QiGuessWords.h中,

  1. 先定義一個枚舉:表示題的難度係數
typedef NS_ENUM(NSUInteger, QiGuessWordsType) {
    QiGuessWordsTypePrimary,
    QiGuessWordsTypeMiddle,
    QiGuessWordsTypeSenior,
    QiGuessWordsTypeComplex,
    QiGuessWordsTypeCustom
};
複製代碼
  1. 暴露一個屬性,直接出隨機詞條。並暴露了一個方法,直接返回一個指定「難度」、「數量」的隨機的詞條數組。
@property (nonatomic, copy) NSString *randomWord;

- (NSArray<NSString *> *)randomWordsWithType:(QiGuessWordsType)type count:(NSUInteger)count;
複製代碼

QiGuessWords.m中,

  1. init方法
- (instancetype)init {
    
    self = [super init];
    
    if (self) {
        
        NSString *primaryWords = @"螃蟹,口紅...";
        NSString *middleWords = @"班主任,放風箏...";
        NSString *seniorWords = @"乘人之危,七上八下...";
        NSString *complexWords = @"低頭思故鄉,到處聞啼鳥...";
        NSString *customWords = @"TCP,360殺毒...";
        
        _primaryWords = [primaryWords componentsSeparatedByString:@","].mutableCopy;
        _middleWords = [middleWords componentsSeparatedByString:@","].mutableCopy;
        _seniorWords = [seniorWords componentsSeparatedByString:@","].mutableCopy;
        _complexWords = [complexWords componentsSeparatedByString:@","].mutableCopy;
        _customWords = [customWords componentsSeparatedByString:@","].mutableCopy;
        
        _allWords = @[_primaryWords, _middleWords, _seniorWords, _complexWords, _customWords];
    }
    
    return self;
}
複製代碼
  1. Getter方法: 注意這裏三元表達式的運用。

思想:系統算出一個0~9的隨機數,

隨機數 詞條類型 機率
0,1 primaryWords(初級) 20%
2,3 middleWords(中等) 20%
4,5 seniorWords(高級) 20%
6 complexWords(複雜) 10%
7,8,9 customWords(自定義) 30%
#pragma mark - Getters

- (NSString *)randomWord {
    
    NSUInteger r = arc4random() % 10;
    NSUInteger i = r < 2? 0: r < 4? 1: r < 6? 2: r < 7? 3: 4;
    
    NSMutableArray<NSString *> *words = _allWords[i];
    
    if (words.count == 0) {
        return self.randomWord;
    } //!< 全部數據取完後會形成死循環
    
    NSUInteger index = arc4random() % words.count;
    NSString *randomWord = words[index];
    [words removeObject:randomWord];
    
    return randomWord;
}
複製代碼

最後,遊戲工程源碼:遊戲源碼


關注咱們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公衆號)

推薦文章:
iOS 文件操做簡介
iOS 關鍵幀動畫
iOS 編寫高質量Objective-C代碼(七)
奇舞週刊

相關文章
相關標籤/搜索