精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在iOS平臺上開發猜數游戲

移動開發 iOS 移動應用
本文將把《猜數游戲》作為例子,為大家講述在iOS平臺上開發猜數游戲。裁判從1到100以內隨機選擇一個整數,然后讓玩家猜測選擇的是什么數。每次猜測后,如果猜錯了,裁判會告訴玩家是猜大了還是猜小了,直到玩家猜出來。大家可以看看作者代碼如何。

這些天終于戒掉了星際爭霸2,開始學習iOS開發了。雖然還只是一知半解,但學了幾天后,覺得單視圖的iOS應用開發起來太輕松了,就忍不住想自己動手做點小玩意。

我也沒有什么好的創意,只是偶然看到猜數的游戲,覺得用選取器這個控件很適合,就決定做了。

雖然這個游戲大多數人都玩過,不過我還是介紹下規則吧:裁判從1到100以內隨機選擇一個整數,然后讓玩家猜測選擇的是什么數。每次猜測后,如果猜錯了,裁判會告訴玩家是猜大了還是猜小了,直到玩家猜出來。當然,用的次數越少就越好。如果用二分法的話,7次以內肯定能猜出來的。

而我要做的這個游戲中,裁判將由應用本身來擔當。玩家只要在選取器里選定一個數,然后點擊選擇按鈕,就會得知猜測的情況;同時選取器也自動更新,刪除不符合的數據,避免玩家選擇錯誤的數據。

接下來考慮界面。

它需要一個選取器來選數,需要一個選擇按鈕來確定所選的數,還需要一個重玩按鈕來重置游戲。而在通知方面,我覺得猜錯時可以直接用標簽來告知玩家,而在猜中時則彈出一個確認對話框比較好。

于是就開工了,運行Xcode,創建一個GuessNumber項目,在GuessNumberViewController.h里聲明控件變量。

  1. @interface GuessNumberViewController : UIViewController { 
  2.     UILabel *label; 
  3.     UIPickerView *picker; 
  4.  
  5. @property (nonatomic, retain) IBOutlet UILabel *label; 
  6. @property (nonatomic, retain) IBOutlet UIPickerView *picker; 
  7.  
  8. - (IBAction)chooseButtonPressed; 
  9. - (IBAction)resetButtonPressed; 
  10.  
  11. @end 

然后用Interface Builder畫出這樣一個界面出來,并與控件變量和行為連接起來:

再打開GuessNumberViewController.m,加上如下代碼,準備工作就做完了:

  1. @implementation GuessNumberViewController 
  2.  
  3. @synthesize label; 
  4. @synthesize picker; 
  5.  
  6. - (void)viewDidUnload { 
  7.     self.label = nil; 
  8.     self.picker = nil; 
  9.  
  10. - (void)dealloc { 
  11.     [label release]; 
  12.     [picker release]; 
  13.     [super dealloc]; 
  14.  
  15. @end 

不過這個程序還只是個空殼,還得為它寫實現邏輯。先看UIPickerView。翻看SDK文檔,發現它并不能直接設置和顯示數據,而是用UIPickerViewDelegate和UIPickerViewDataSource這2個協議來完成的。簡化起見,我就沒創建一個模型類了,而是直接讓GuessNumberViewController來實現了:

  1. @interface GuessNumberViewController : UIViewController 
  2. <UIPickerViewDelegate, UIPickerViewDataSource> 

UIPickerViewDelegate主要需要實現這2個方法中的一個:

◆pickerView:titleForRow:forComponent:

◆pickerView:viewForRow:forComponent:reusingView:

前者是直接讓每行顯示一個字符串,而后者是每行顯示一個視圖,那自然是前者更方便了。

可是每行究竟要顯示什么數據呢?看上去可以用一個數組來保存現有的數,然后直接將行號作為數組的索引來獲取即可。

可讓我詫異的是創建數組時,居然沒有Python里range這樣方便的函數,于是得自己寫個方法來實現了:

  1. + (NSMutableArray *)makeArrayFrom:(NSInteger)begin to:(NSInteger)end { 
  2.     NSMutableArray *array = [[[NSMutableArray alloc]initWithCapacity:end - begin + 1]autorelease]; 
  3.     for (NSInteger i = begin; i <= end; ++i) { 
  4.         [array addObject:[NSString stringWithFormat:@"%d", i]]; 
  5.     } 
  6.     return array; 

這樣的實現讓我很擔心性能,覺得還不如C的數組好用。而且NSMutableArray為什么是NSArray的子類啊,有可能接收到一個NSArray對象,以為它是不變的,結果使用時卻莫名其妙地變了啊!有木有!難道接收到后每次都copy一份不影響性能嗎?可這貨畢竟是標準庫里的,你得逼自己接受它…(好戲還在后頭)

考慮到這樣創建很成問題,于是決定事先創建好一個完整的數組,然后每次要用時就copy一份。便給GuessNumberViewController加上2個私有變量NSMutableArray *pickerData和NSMutableArray *totalData,并在viewDidLoad方法中初始化它們。

  1. #define MAX_NUMBER 100 
  2.  
  3. - (void)viewDidLoad { 
  4.     self.totalData = [GuessNumberViewController makeArrayFrom:1 to:MAX_NUMBER]; 
  5.     [self resetGame]; 
  6.     [super viewDidLoad]; 
  7.  
  8. - (void)resetGame { 
  9.     NSMutableArray *totalDataCopy = [totalData mutableCopy]; 
  10.     self.pickerData = totalDataCopy; 
  11.     [totalDataCopy release]; 
  12.  
  13. - (void)viewDidUnload { 
  14.     self.label = nil; 
  15.     self.picker = nil; 
  16.     self.pickerData = nil; 
  17.     self.totalData = nil; 
  18.  
  19. - (void)dealloc { 
  20.     [label release]; 
  21.     [picker release]; 
  22.     [pickerData release]; 
  23.     [totalData release]; 
  24.     [super dealloc]; 

數據準備好后,就可以實現– pickerView:titleForRow:forComponent:了:

  1. - (NSString *)pickerView:(UIPickerView *)pickerView 
  2.            titleForRow:(NSInteger)row 
  3.           forComponent:(NSInteger)component { 
  4.     return [pickerData objectAtIndex:row]; 

再來看看UIPickerViewDataSource,這個協議也有2個方法:

◆numberOfComponentsInPickerView:

◆pickerView:numberOfRowsInComponent:

前者返回這個選擇器由幾個部分組成,這里我只需要一組即可;后者返回每個部分有多少行,其實也就是pickerData的長度而已:

  1. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
  2.     return 1; 
  3.  
  4. - (NSInteger)pickerView:(UIPickerView *)pickerView 
  5. numberOfRowsInComponent:(NSInteger)component { 
  6.     return [pickerData count]; 

這時候NSArray又囧到我了。那個count方法說明了count不是個屬性,因此數組的長度并沒有用變量來保存。事后我也查了下,發現是以nil來判斷數組結尾的,這效率對長數組來說絕對是個災難。

現在選擇器的邏輯已經實現了,此時測試應該可以看到一個包含1~100的選擇器了,不過游戲的邏輯還并沒實現。

于是再給GuessNumberViewController加上NSInteger guessedTimes和NSInteger secretNumber,分別用于保存玩家猜的數和隨機數。

接著修改resetGame的邏輯來初始化它們:

  1. - (void)resetGame { 
  2.     guessedTimes = 0; 
  3.     secretNumber = arc4random() % MAX_NUMBER + 1; 
  4.     NSMutableArray *totalDataCopy = [totalData mutableCopy]; 
  5.     self.pickerData = totalDataCopy; 
  6.     [totalDataCopy release]; 
  7.     [picker reloadComponent:0]; 

然后就是重點的chooseButtonPressed方法了,這個方法中需要刪除NSMutableArray的一部分,而且肯定是在頭或尾部刪除。查了下SDK文檔,適合這種批量刪除的方法有:

◆removeObjectsAtIndexes:

◆removeObjectsInArray:

◆removeObjectsInRange:

◆removeObjectsFromIndices:numIndices:

看上去很多是吧,別急,一個一個來看。

◆ removeObjectsAtIndexes:這個方法接收一個NSIndexSet參數。而NSIndexSet的創建和NSMutableArray差不多,也就是得循環生成,放棄。

◆removeObjectsInArray:就更直接了,直接接收一個NSArray參數。為了刪除一個數組的一部分而去創建另一個數組,有病啊?放棄。

◆removeObjectsInRange:接收一個NSRange參數。NSRange是一個結構,包括location和length這2個字段,看上去這就是我想要的。它實際上是用removeObjectAtIndex:來刪除對象的,所以自己寫循環來刪除會更快。

◆removeObjectsFromIndices:numIndices:已經被deprecated了,放棄。考慮到自己寫循環太麻煩,所以還是將就著使用– removeObjectsInRange:了,實現的算法我就不解釋了:

  1. - (void)alertWithMessage:(NSString *)message { 
  2.     UIAlertView *alert = [[UIAlertView alloc] 
  3.                           initWithTitle:nil 
  4.                           message:message 
  5.                           delegate:nil 
  6.                           cancelButtonTitle:@"確定" 
  7.                           otherButtonTitles:nil]; 
  8.     [alert show]; 
  9.     [alert release]; 
  10.  
  11. - (IBAction)chooseButtonPressed { 
  12.     ++guessedTimes; 
  13.     NSInteger row = [picker selectedRowInComponent:0]; 
  14.     NSString *selected = [pickerData objectAtIndex:row]; 
  15.     NSInteger selectedNumber = [selected integerValue]; 
  16.     NSInteger cutIndex; 
  17.      
  18.     if (selectedNumber == secretNumber) { 
  19.         [self alertWithMessage:[NSString stringWithFormat:@"你猜中了!"]]; 
  20.         [self resetGame]; 
  21.     } else { 
  22.         cutIndex = [pickerData indexOfObject:[NSString stringWithFormat:@"%d", selectedNumber]]; 
  23.         if (selectedNumber > secretNumber) { 
  24.             label.text = [NSString stringWithFormat:@"第%d次猜數,你猜得太大了。", guessedTimes]; 
  25.             [pickerData removeObjectsInRange:NSMakeRange(cutIndex, [pickerData count] - cutIndex)]; 
  26.         } else { 
  27.             label.text = [NSString stringWithFormat:@"第%d次猜數,你猜得太小了。", guessedTimes]; 
  28.             [pickerData removeObjectsInRange:NSMakeRange(0, cutIndex + 1)]; 
  29.         } 
  30.     } 
  31.     [picker reloadComponent:0]; 

***別忘了resetButtonPressed,它只是調用resetGame方法而已:

  1. - (IBAction)resetButtonPressed { 
  2.     [self resetGame]; 

現在就可以開玩了,效果如下:

看上去iOS開發的確很簡單,只是Objective-C惡心了一點而已。

不過別高興得太早,這篇文章還沒完成一半呢。玩了一會后我就立刻感到不爽了:從100個數里找到想要選擇的數太難了。

如果把選取器拆成2個部分,分別選擇十位和個位就會方便多了。不過這樣一來就不能猜1~100了,而應該猜0~99;MAX_NUMBER這個名字也不再合適,應該改成TOTAL_NUMBERS。

除此之外,如果繼續用數組實現的話,我得保存1個十位的數組和10個個位的數組,這樣維護起來太頭疼了。好在數據和UIPickerView并沒有綁定起來,可以自己實現取數邏輯,所以干脆保存當前最小和***的數,然后計算出十位和個位得了。

于是再給GuessNumberViewController加上NSInteger beginNumber和NSInteger endNumber這2個私有變量,然后開始修改取數邏輯:

  1. - (NSString *)pickerView:(UIPickerView *)pickerView 
  2.              titleForRow:(NSInteger)row 
  3.             forComponent:(NSInteger)component { 
  4.     if (component == 0) { 
  5.         return [NSString stringWithFormat:@"%d", beginNumber / 10 + row]; 
  6.     } 
  7.      
  8.     if ([picker selectedRowInComponent:0] == 0) { 
  9.         return [NSString stringWithFormat:@"%d", beginNumber % 10 + row]; 
  10.     } 
  11.      
  12.     return [NSString stringWithFormat:@"%d", row]; 
  13.  } 
  14.  
  15. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
  16.     return 2; 
  17.  
  18. - (NSInteger)pickerView:(UIPickerView *)pickerView 
  19. numberOfRowsInComponent:(NSInteger)component { 
  20.     NSInteger unitsDigitOfBeginNumber = beginNumber % 10; 
  21.     NSInteger unitsDigitOfEndNumber = endNumber % 10; 
  22.     NSInteger tenthsDigitOfBeginNumber = beginNumber / 10; 
  23.     NSInteger tenthsDigitOfEndNumber = endNumber / 10; 
  24.     NSInteger differenceBetweenTenthsDigits = tenthsDigitOfEndNumber - tenthsDigitOfBeginNumber; 
  25.     NSInteger rowOfTenthsPlace; 
  26.      
  27.     if (component == 0) { 
  28.         return differenceBetweenTenthsDigits + 1; 
  29.     } 
  30.      
  31.     rowOfTenthsPlace = [picker selectedRowInComponent:0]; 
  32.     if (rowOfTenthsPlace == 0) { 
  33.         if (differenceBetweenTenthsDigits == 0) { 
  34.             return unitsDigitOfEndNumber - unitsDigitOfBeginNumber + 1; 
  35.         } 
  36.         return 10 - unitsDigitOfBeginNumber; 
  37.     } 
  38.      
  39.     if (rowOfTenthsPlace == differenceBetweenTenthsDigits) { 
  40.         return unitsDigitOfEndNumber + 1; 
  41.     } 
  42.      
  43.     return 10; 

這里的邏輯比剛才復雜多了,不過慢慢看應該能看懂的,我也就不解釋了。接下來就是chooseButtonPressed的邏輯了,這次它只要更改beginNumber和endNumber,不需要維護數組了。

  1. - (IBAction)chooseButtonPressed { 
  2.     ++guessedTimes; 
  3.      
  4.     NSInteger tenthsPlaceRow = [picker selectedRowInComponent:0]; 
  5.     NSInteger unitsPlaceRow = [picker selectedRowInComponent:1]; 
  6.      
  7.     NSString *tenthsDigitString = [self pickerView:picker titleForRow:tenthsPlaceRow forComponent:0]; 
  8.     NSString *unitsDigitString = [self pickerView:picker titleForRow:unitsPlaceRow forComponent:1]; 
  9.      
  10.     NSInteger tenthsDigit = [tenthsDigitString integerValue]; 
  11.     NSInteger unitsDigit = [unitsDigitString integerValue]; 
  12.      
  13.     NSInteger selectedNumber = tenthsDigit * 10 + unitsDigit; 
  14.      
  15.     if (selectedNumber == secretNumber) { 
  16.         [self alertWithMessage:[NSString stringWithFormat:@"你猜中了!"]]; 
  17.         [self resetGame]; 
  18.     } else if (selectedNumber > secretNumber) { 
  19.         statusLabel.text = [NSString stringWithFormat:@"第%d次猜數,你猜得太大了。", guessedTimes]; 
  20.         endNumber = selectedNumber - 1; 
  21.     } else { 
  22.         statusLabel.text = [NSString stringWithFormat:@"第%d次猜數,你猜得太小了。", guessedTimes]; 
  23.         beginNumber = selectedNumber + 1; 
  24.     } 
  25.     [picker reloadAllComponents]; 

而重置的代碼也得改改:

  1. - (void)resetGame { 
  2.     guessedTimes = 0; 
  3.     secretNumber = arc4random() % TOTAL_NUMBERS; 
  4.     beginNumber = 0; 
  5.     endNumber = TOTAL_NUMBERS - 1; 
  6.     label.text = @""
  7.     [picker reloadAllComponents]; 

現在再運行一下,會發現一堆bug。最嚴重的一個就是選擇的十位數改變時,個位不會相應地改變。好在UIPickerViewDelegate協議提供了pickerView:didSelectRow:inComponent:方法,只要在十位改變時,重新載入個位的數據即可:

  1. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
  2.     if (component == 0) { 
  3.         [picker reloadComponent:1]; 
  4.     } 

此外就是按了選擇按鈕后,個位數有時候會超過9。調試了一番后我發現是[picker reloadAllComponents]這行代碼的問題,它會先reload部件1,再reload部件0,而我的代碼邏輯中,部件1的數據(個位)是依賴于部件0(十位)的,于是就出錯了。解決辦法很簡單,依次reload即可:

  1. [picker reloadComponent:0]; 
  2. [picker reloadComponent:1]; 

現在bug是搞定了,可是有個問題不太爽:游戲結束時彈出確認對話框,我還沒點確定,游戲就已經重置了,有點不符合習慣。好在UIAlertView有個delegate屬性,它的– alertView:didDismissWithButtonIndex:方法就可以延緩重置時機了。于是老辦法,給GuessNumberViewController實現UIAlertViewDelegate協議,然后進行如下修改:

  1. - (void)alertWithMessage:(NSString *)message { 
  2.     UIAlertView *alert = [[UIAlertView alloc] 
  3.                           initWithTitle:nil 
  4.                           message:message 
  5.                           delegate:self 
  6.                           cancelButtonTitle:@"再玩一次" 
  7.                           otherButtonTitles:nil]; 
  8.     [alert show]; 
  9.     [alert release]; 
  10.  
  11. - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
  12.     [self resetGame]; 

再把調用alertWithMessage下一行的[self resetGame]刪掉即可。接下來還有什么問題呢?結束時的提示太無聊了,沒動力繼續玩下去,于是再改改chooseButtonPressed:

  1. if (selectedNumber == secretNumber) { 
  2.     if (guessedTimes < 4) { 
  3.         [self alertWithMessage:[NSString stringWithFormat:@"哼,人家才不告訴你%d次就猜中是很稀罕的呢!", guessedTimes]]; 
  4.     } else if (guessedTimes < 8) { 
  5.         [self alertWithMessage:[NSString stringWithFormat:@"別多想啦,%d次猜中是很正常的啦,繼續加油吧!", guessedTimes]]; 
  6.     } else { 
  7.         [self alertWithMessage:[NSString stringWithFormat:@"笨蛋,%d次才猜中,你有沒有用心在猜啊!", guessedTimes]]; 
  8.     } 

現在如何呢?還有個很大的問題——數字是左對齊的,應該弄成居中對齊的啊!可是翻了一遍文檔,確實沒找到哪里可以設置對齊屬性。在網上搜了一陣,發現需要自己創建UILabel作為每行的視圖,然后設置UILabel的對齊屬性:

  1. - (UIView *)pickerView:(UIPickerView *)pickerView 
  2.             viewForRow:(NSInteger)row 
  3.           forComponent:(NSInteger)component 
  4.            reusingView:(UIView *)view { 
  5.     UILabel *digitLabel; 
  6.     if (view) { 
  7.         digitLabel = (PickerViewLabel *)view; 
  8.     } else { 
  9.         digitLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)] autorelease]; 
  10.     } 
  11.      
  12.     NSString *title; 
  13.     if (component == 0) { 
  14.         title = [NSString stringWithFormat:@"%d", beginNumber / 10 + row]; 
  15.     } else if ([picker selectedRowInComponent:0] == 0) { 
  16.         title = [NSString stringWithFormat:@"%d", beginNumber % 10 + row]; 
  17.     } else { 
  18.         title = [NSString stringWithFormat:@"%d", row]; 
  19.     } 
  20.  
  21.     digitLabel.text = title; 
  22.     digitLabel.textAlignment = UITextAlignmentCenter; 
  23.     return digitLabel; 

這樣一來就有很多label了,所以原來的label就改名為statusLabel以作區分吧。而chooseButtonPressed中也需要更改數值的獲取方法

  1. NSString *tenthsDigitString = ((UILabel *)[picker viewForRow:tenthsPlaceRow forComponent:0]).text; 
  2. NSString *unitsDigitString = ((UILabel *)[picker viewForRow:unitsPlaceRow forComponent:1]).text; 

改完后立刻發現背景不對勁,變成白色的了。于是去掉digitLabel的背景色,順便將文本設為粗體:

  1. digitLabel.backgroundColor = [UIColor clearColor]; 
  2. digitLabel.font = [UIFont boldSystemFontOfSize:24.0]; 

現在是否OK了呢?不,你會發現點擊一行時,還會出現藍色的高亮背景。這現象是怎么產生的呢?原來UIPickerView是用UITableView實現的,而UITableCell在選中時默認會高亮。

簡單的解決辦法就是設置digitLabel.userInteractionEnabled = YES,這樣一來digitLabel就攔截了點擊事件,不會傳遞給UITableCell了。

可是這個辦法仍然有問題:默認的UIPickerView在點擊一行時,會滾動定位到這行;而攔截了事件后,自動滾動的功能也就沒了。

于是更好的辦法就是在點擊時獲取這個UITableCell,將它設為不高亮。然而坑爹的是UITableCell屬于私有API,SDK文檔里找不到資料,調用它的方法得使用performSelector方法。

為此需要自定義一個PickerViewLabel類:

  1. @interface PickerViewLabel : UILabel { 
  2.  
  3.  
  4. @end 
  5.  
  6. @implementation PickerViewLabel 
  7.  
  8. - (void)didMoveToSuperview { 
  9.     UIView *superview = [self superview]; 
  10.     if ([superview respondsToSelector:@selector(setShowSelection:)]) { 
  11.         [superview performSelector:@selector(setShowSelection:) withObject:NO]; 
  12.     } 
  13.  
  14. @end 

這個didMoveToSuperview方法的名字很囧,它其實是在父視圖改變時被調用的。

因為高亮也是改變的一種,所以它就會被調用了。拿到父視圖后并不能判斷它是否是UITableCell類的對象,因為我們沒有UITableCell的聲明頭文件。于是通過respondsToSelector判斷它是否能調用setShowSelection:,再通過performSelector調用這個方法。

現在總該可以了吧?不,還有個問題:重新載入UIPickerView的組件時,有時會停在莫名其妙的一行上。于是在resetGame的末尾加上:

  1. [picker selectRow:0 inComponent:0 animated:NO]; 
  2. [picker selectRow:0 inComponent:1 animated:NO]; 

同時也加在chooseButtonPressed的第三種里:

  1. // ... 
  2. else { 
  3.     statusLabel.text = [NSString stringWithFormat:@"第%d次猜數,你猜得太小了。", guessedTimes]; 
  4.     beginNumber = selectedNumber + 1; 
  5.     [picker selectRow:0 inComponent:0 animated:NO]; 
  6.     [picker selectRow:0 inComponent:1 animated:NO]; 

好了,最終效果如下:

雖然按鈕的樣式還能改改,不過必須用到背景圖,我就懶得找圖了。至于還能改進的地方,我覺得就是太不耐玩了。如果加入聯機對戰模式或許就大不一樣了,2個玩家可以比拼誰先猜出來,就可以獲得更多樂趣了。當然,這玩意犯不著搞那么復雜的東東出來,反正也就自己做著玩而已。***想說的是,iOS開發難在細節。它看上去很簡單,但很多細枝末節的方面若想精益求精,就不得不耗費苦心。一是標準庫并不好用,二是SDK設計得并不周到,三是你不得不用到私有API。

 

責任編輯:佚名 來源: keakon的涂鴉館
相關推薦

2011-03-25 14:41:52

MMO游戲iOS

2017-03-20 17:20:35

iOSTensorFlow

2022-01-21 10:35:03

Windows 11微軟安卓

2010-06-09 17:46:53

2012-07-10 13:17:33

iOS收入

2011-12-12 13:58:11

TinyCoiOSAndroid

2013-08-27 10:31:05

Headless模式Java SE設計模式

2012-04-25 14:27:03

JavaScala

2010-05-19 16:53:31

MySQL代碼

2015-03-24 19:48:24

2011-04-08 09:13:13

游戲跨平臺iOS

2017-01-12 14:26:12

青雀開發小程序

2011-08-23 09:16:19

Python

2012-04-25 14:12:12

JavaScala

2019-06-19 16:05:51

AppImageFlathubLinux

2020-02-18 09:45:44

云計算云平臺IT

2013-03-04 09:51:35

2013-08-01 10:28:52

移動通訊應用KikHTML5游戲

2013-12-10 09:39:01

Windows平臺Linux開發

2023-02-23 14:30:27

游戲Tcl
點贊
收藏

51CTO技術棧公眾號

日本在线一二三区| 韩国一区二区三区美女美女秀 | 日韩成人三级视频| 人妻无码中文字幕免费视频蜜桃| 国产一区二区精品| 中文字幕亚洲无线码a| 夜夜爽久久精品91| 中文字幕这里只有精品| 综合久久久久久久| 精品国产中文字幕| 一区二区三区免费在线| 亚洲精品欧美| 日韩三级成人av网| 久久无码人妻精品一区二区三区 | 91美女福利视频高清| 日韩污视频在线观看| 日韩欧美视频| 亚洲激情 国产| 久国产精品视频| 日产福利视频在线观看| 亚洲女人****多毛耸耸8| 久久影院理伦片| av加勒比在线| 秋霞成人午夜伦在线观看| 欧美劲爆第一页| 色偷偷www8888| 国产精品免费不| 日韩亚洲欧美成人一区| 激情综合网俺也去| 麻豆国产在线| 亚洲一区在线观看视频| 艳色歌舞团一区二区三区| 青春草在线观看| 国内久久精品视频| 国产精品久久久久久影视| 日韩精品视频免费播放| 欧美精品一卡| www.欧美精品一二三区| 黄色av免费播放| 要久久爱电视剧全集完整观看| 日韩久久免费av| 小早川怜子一区二区三区| 91国内外精品自在线播放| 欧美日韩国产专区| 精品人妻大屁股白浆无码| 秋霞成人影院| 中文成人av在线| 日韩精品一区二区三区色偷偷| 手机福利小视频在线播放| 成人深夜福利app| av成人午夜| 丰满少妇一级片| 国产精品一区二区三区99| 91午夜在线播放| 国产伦精品一区二区三区视频痴汉| 日韩电影在线免费观看| 国产不卡视频在线| 亚洲精品视频在线观看免费视频| 黄色av成人| 久久久久久久久久久人体| 免费在线观看黄色av| 欧美精品三区| 91av视频导航| 国产福利久久久| 亚洲专区在线| 国产精品成av人在线视午夜片| 国产又粗又猛又爽又| 青青草一区二区三区| 国产精品亚洲激情| 国产精品怡红院| 国产91丝袜在线18| 北条麻妃高清一区| 亚洲欧洲国产综合| 日本一区二区在线不卡| 伊人久久大香线蕉av一区| 黄视频在线观看网站| 亚洲精品高清在线观看| 每日在线观看av| 美女福利一区二区三区| 欧美影院午夜播放| 亚洲欧美日韩网站| 黑人久久a级毛片免费观看| 亚洲精品videossex少妇| 欧美黄色一级生活片| 99精品在线| 欧美精品18videosex性欧美| 天码人妻一区二区三区在线看| 六月天综合网| 91爱视频在线| 亚洲视频 欧美视频| 精品一区二区影视| 91成人理论电影| 视频污在线观看| 国产亚洲欧美在线| 亚洲一区二区三区精品动漫| av免费网站在线| 欧美日韩午夜激情| 欧美视频第三页| 欧美黑粗硬大| 欧美一区永久视频免费观看| 大桥未久恸哭の女教师| 超碰成人在线观看| 日韩激情视频在线播放| 美国美女黄色片| 国内精品99| 国产91九色视频| 国产精品综合在线| 99久久精品免费看| 亚洲一区美女| 97人澡人人添人人爽欧美| 欧日韩精品视频| 中文字幕亚洲日本| 国产剧情在线观看一区| 美女福利视频一区| 男人午夜免费视频| 麻豆精品国产91久久久久久| 国产精品国产一区二区| 黄色av网站在线| 亚洲永久免费av| 中文字幕第80页| 精品视频在线你懂得| 日韩视频在线免费观看| 日韩精品视频播放| 国产乱码精品一区二区三区五月婷 | 久久久精品一区二区涩爱| 蜜桃伊人久久| 超碰97国产在线| 成人欧美亚洲| 精品久久久久久亚洲精品| 污网站免费在线| 农村少妇一区二区三区四区五区 | 亚洲激情图片网| 国产一区二区你懂的| 亚洲资源在线看| 国产福利在线视频| 欧美日韩一区免费| 久久久久国产免费| 色综合咪咪久久网| 欧美最猛性xxxxx(亚洲精品)| 精品二区在线观看| 亚洲国产激情av| 一本久道综合色婷婷五月| 成人av婷婷| 久久综合色88| 91极品身材尤物theporn| 欧美国产日本视频| 欧美日韩中文在线视频| 日本一区二区三区播放| 在线观看亚洲区| www.色国产| 91亚洲精品一区二区乱码| 国产一区二区三区小说| 色妞ww精品视频7777| 欧美成人黄色小视频| 国产美女主播在线观看| 国产精品久久久久久久久果冻传媒 | 99国产高清| 国产视频中文字幕在线观看| 欧美日本在线观看| 欧美aaa级片| 日韩高清在线一区| 久热国产精品视频一区二区三区| 伊人成综合网站| 亚洲欧美国产精品专区久久| 国产精品自拍99| 91在线云播放| 日韩网址在线观看| 精品国产一区二区三区久久久樱花| 青青精品视频播放| 国产视频福利在线| 欧美三片在线视频观看| 丰满的亚洲女人毛茸茸| 久久精品国产一区二区三区免费看| 欧美综合77777色婷婷| 精品欧美一区二区三区在线观看 | 国产xxxx视频| 亚洲综合不卡| 欧美尤物一区| 91久久久久久白丝白浆欲热蜜臀| 在线观看久久久久久| 一级特黄aaa大片在线观看| 亚洲欧洲国产日韩| 中文在线字幕观看| 在线精品亚洲| 国产一区二区中文字幕免费看| 都市激情亚洲一区| 最新91在线视频| av网站免费播放| 亚洲福利一二三区| www.av欧美| 精品写真视频在线观看| 黄色网址在线免费看| 欧美美女在线直播| 国产精品日韩在线播放| 中文字幕有码在线视频| 日韩成人激情在线| 在线观看日韩一区二区| 亚洲午夜电影在线| 能免费看av的网站| 精品在线观看视频| 成人网站免费观看入口| 国语产色综合| 亚洲xxx大片| free欧美| 久久久综合av| 日韩伦理在线观看| 亚洲成人精品视频在线观看| 潘金莲一级淫片aaaaaa播放| 亚洲男同性视频| 国产福利在线观看视频| 久久福利资源站| 亚洲五月天综合| 狠狠噜噜久久| 在线播放 亚洲| 午夜a一级毛片亚洲欧洲| 成人国内精品久久久久一区| 漫画在线观看av| 亚洲欧美一区二区精品久久久| www.av导航| 欧美色图免费看| 免费看日韩毛片| 亚洲美女偷拍久久| 成人在线观看免费高清| av不卡在线观看| 女女调教被c哭捆绑喷水百合| 日韩国产欧美三级| 天堂…中文在线最新版在线| 国产精品久久久久久久| 欧美激情第一页在线观看| 日韩一区二区三区色| 国产日本欧美一区二区三区| 亚洲国产福利| 久久久日本电影| 直接在线观看的三级网址| 正在播放欧美视频| 噜噜噜噜噜在线视频| 日韩精品在线视频观看| 懂色av一区二区三区四区| 欧美女孩性生活视频| 青青草视频在线观看免费| 欧美日韩视频免费播放| 一级aaa毛片| 亚洲国产精品久久一线不卡| 人妻久久一区二区| 国产精品国产馆在线真实露脸| 特级西西人体wwwww| 不卡av电影在线播放| www.黄色网| 国产精品综合一区二区三区| 亚洲一二区在线观看| 蜜桃久久精品一区二区| 在线观看高清免费视频| 丝袜诱惑亚洲看片| 亚洲乱码中文字幕久久孕妇黑人| 黄色成人精品网站| 自拍日韩亚洲一区在线| 亚洲国产清纯| 日韩一级性生活片| 欧美日本不卡高清| av 日韩 人妻 黑人 综合 无码| 国产成人三级| 亚洲欧洲日韩综合二区| 欧美va久久久噜噜噜久久| 亚洲最新在线| 久久久久国产精品| 日本三级中文字幕在线观看| 亚洲v在线看| 国产3p露脸普通话对白| 亚洲久久一区| 国产视频一视频二| 国产精品丝袜xxxxxxx| 亚洲精品高清无码视频| 日韩精品五月天| 日韩在线不卡一区| 黑人巨大精品欧美一区| 下面一进一出好爽视频| 成人毛片老司机大片| 稀缺小u女呦精品呦| 久久久久九九视频| 成年人看的免费视频| 国产精品久久久久久亚洲伦| 欧美一级片在线视频| 亚洲最新视频在线观看| 日本va欧美va国产激情| 欧美私模裸体表演在线观看| 91 中文字幕| 日韩女优av电影| 欧洲免费在线视频| 色婷婷av一区二区三区在线观看| av片在线观看| 91精品成人久久| 成人午夜毛片| aaa级精品久久久国产片| 欧美交a欧美精品喷水| 日本免费高清不卡| 综合久久99| 凹凸国产熟女精品视频| 日本欧美一区二区在线观看| 天天操夜夜操很很操| aaa亚洲精品一二三区| 乱老熟女一区二区三区| 亚洲高清视频中文字幕| 日本精品入口免费视频| 欧美一区二区三区视频免费播放 | 久久免费美女视频| 国产不卡在线观看视频| 亚洲图片欧美视频| 亚洲精品毛片一区二区三区| 日韩一区二区视频在线观看| 日韩免费在线播放| 黄色免费在线观看网站| 午夜精品一区二区三区在线视频| 国产盗摄——sm在线视频| 国产精品一区二区久久国产| 欧美日韩破处| www.黄色网址.com| 噜噜噜在线观看免费视频日韩| 免费不卡av网站| 国产欧美1区2区3区| 天天操中文字幕| 欧美一区二区三区日韩| 黄色小视频在线观看| 久久久久久久激情视频| av日韩一区| 亚洲欧美综合一区| 亚洲欧美清纯在线制服| 免费黄色a级片| 亚洲欧美综合在线精品| 久久精品人妻一区二区三区| 欧美一级理论性理论a| 91精彩在线视频| 欧美有码在线观看视频| 成人爽a毛片| 亚洲一卡二卡三卡| 日韩电影在线一区二区| 三级黄色片网站| 婷婷丁香久久五月婷婷| 亚洲男人天堂久久| 欧美乱大交xxxxx另类电影| 免费视频成人| 日韩欧美在线一区二区| 一区二区三区四区五区在线| 最新国产精品自拍| 一区二区三区精品视频| 国产精品日韩无码| 久久精品91久久香蕉加勒比| 黄色日韩网站| 婷婷精品国产一区二区三区日韩 | 久久久久久久久久久久久久国产| 成人黄色av电影| 久久这里只有精品国产| 91精品国产免费| 成人片在线看| 4444kk亚洲人成电影在线| 一区二区三区在线电影| 日韩av片免费观看| **欧美大码日韩| www.亚洲黄色| 欧美激情视频在线免费观看 欧美视频免费一 | 免费看成人人体视频| 国产真人做爰毛片视频直播| 99精品久久久久久| 天天操中文字幕| 亚洲人成77777在线观看网| 成人爱爱网址| 免费观看成人在线| 久久国产福利| 一级片久久久久| 欧美日韩国产一区| 国产美女av在线| 国产日韩欧美综合精品| 一区二区精品| 久久久久亚洲av成人无码电影| 91精品久久久久久综合五月天 | 欧美人与性动交a欧美精品| 日韩在线观看一区二区三区| 国产夫妻自拍一区| 99久久婷婷国产综合精品电影| 少妇一级淫片免费放中国| 在线观看精品自拍私拍| 动漫一区二区三区| 老司机激情视频| 91一区在线观看| 天天爱天天做天天爽| 中文字幕v亚洲ⅴv天堂| 亚洲欧美专区| 亚洲人精品午夜射精日韩| 成人污视频在线观看| 中文字幕视频二区| 九色精品免费永久在线| 五月激激激综合网色播| xx欧美撒尿嘘撒尿xx| 亚洲人成网站在线| 图片区 小说区 区 亚洲五月| 欧美中文在线观看| 久久中文视频| 999热精品视频| 一本久久a久久精品亚洲| 国产一区久久精品| 国产综合色一区二区三区|