日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[2017BUAA软工]结对项目:数独扩展

發布時間:2024/4/17 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [2017BUAA软工]结对项目:数独扩展 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結對項目:數獨擴展


1. Github項目地址

https://github.com/Slontia/Sudoku2

2. PSP估計表格

3. 關于Information Hiding, Interface Design, Loose Coupling的設計

  首先,在王辰昱同學的提醒下,我們將一開始的代碼按照功能分為若干個.cpp文件,每一個.cpp只處理一件事,如create_puzzle.cpp文件負責生成數獨,而solve.cpp文件負責解決數獨,在一定程度上保證了代碼的低耦合性。
  我認為在實際編碼中,最能體現這個思想的是dig函數和Rank類。首先來看一下dig函數在代碼中的調用情況:

int lower, int upper) { if (lower > upper || lower < 0 || upper > SIZE * SIZE) {return 0; } int all_freebox_num = (rand() % (upper - lower + 1)) + lower; int cleaned_num = dig(sudoku, puzzle, all_freebox_num);int freebox_num = all_freebox_num - cleaned_num; if (freebox_num == 0) {return all_freebox_num; }

  這是create_puzzle函數的開頭部分,整個程序中只有這個地方用到了這個函數,其功能在于盡可能地清除一個數獨中的數字,并保證其單解性。這個函數在清除數字的時候會依靠推理,因此挖起來非常快。這是保證代碼速度的一個很重要的部分。但是如果不看dig.cpp文件,我們并不清楚其具體的實現過程,或是用了什么高端的算法,只知道“這是一個挖數非常快的函數”,我認為這是最能體現Information Hiding的部分。
  
  除此之外,GUI項目中還有一個排行榜功能,這個功能位于Rank類中。我們在實現這個類之前,先考慮了一下可能的需要的功能,如清除記錄、插入到排行榜、寫入文件、讀取文件、加密等等。有了這些想法,我們便提供了相應的接口,之后再實現,我認為遵循了Interface Design。下面是rank.h中定義的部分函數:

bool record(int mode, double time, char * name); // 保存記錄(難度,用時,姓名) bool fetch_rank(int mode, int r, char * name, double & time); // 獲取 mode 難度排名為 r 的姓名和時間, 1-indexed bool clear(); // 清空排行榜 bool fetch_last_record(char * name, double & time); // 獲得上次錄入的姓名和時間 bool encrypt_flush(bool encrypt); // 加密并保存 void load_db(bool encrypt); // 從文件中加載 void init_db(); // 初始化數據庫 void init_board(); // 初始化 board bool fetch_free(int mode, int & index); // 拿走一個空的 entry bool insert_after(int mode, int tg_id, int new_id); // 在空間中id為tg_entry的位置后面插入new_entry bool show(int mode);

4. 計算模塊接口的設計與實現過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?說明你的算法的關鍵(不必列出源代碼),以及獨到之處。(7')

主要有三個模塊:

1. create 模塊

  這次作業雖然指定不允許出現等價數獨,但我們還是可以通過模板變換快速生成1000000個數獨。首先,我們需要保證數獨的等價性,我們的做法是不對第一個宮進行任何操作(隨機性貌似在-c不做要求?)。我們沿用了劉暢同學在個人項目中使用的3-3-3位置輪換方法成功生成了一個數獨終盤。在個人項目中,模板的變化主要體現在R4~R6、R7~R9的行變換,但其實,對于3-3-3位置輪換方法生成的終盤,部分行的變換也是可行的。
  我們先來想一個問題,在一個3*3的宮中填入1~3三個數字各三次,保證行、列中沒有重復的數字,共有幾種填法呢?通過窮舉,我們可以發現有12種解,如下圖:

  

  現在,我們將這個問題向數獨上靠攏,在生成的數獨上,我們標出圖中所示的紅、綠、藍數字:
  

  由上面的結論我們可以得出,通過變換紅、綠、藍共九個數字,可以得到12種不同排列。由于第一個宮我們不能動,只能動R4~R9,因此共可以找到6組類似的9個數字,而這6組的排列又相互獨立,因此共可以產生12^6=2985984種排列。

2. solve 模塊

  solve模塊的實現和個人項目相同,只是做了一下封裝。

據之前的思路,我設計了三個類:數獨類(Subject_sudoku)、組類(Group)、方格類(Box)。
數獨類包含三個組數組,名字分別為rows[9]、columns[9]和blocks[9],分別代表思路中描述的三種組。每個組包括指向9個Box的指針和記錄以確定數字的二進制數hasvalue。
在初始化數組之后,首先找到未確定值得Box中可能取值最少的那個,依次對它的值進行猜測。在每次猜測之前,通過拷貝構造將Subject_sudoku備份下來,在新的數獨中將該方格的值確定,再繼續尋找可能取值最少的Box,對它的值進行猜測,直到所有的Box的值都被確定,或嘗試完某個Box的所有可能性(無解)。
基本流程描述如下:

  • 初始化數獨;
  • 找到可能取值最少的Box;
  • 依次假定它所有的可能取值;
  • 重復2、3,直到所有Box都被確定,或嘗試完某Box所有可能性。
    對象之間的關系構成網狀結構,便于Box和Group之間的信息傳遞
  • 3. puzzle 模塊

      

    獨到之處:

      1. 選擇最有效的隨機方式。我們在隨機挖空的時候,發現純粹隨機的效果并不好,特別是要求生成55個空的獨解數獨時,會比較慢。但是如果在各個宮內部進行比較平均的挖空,得出來的空會分布得比較均勻,就容易產生單解數獨。

      2. 結合邏輯推導。反向使用行列宮擯除法,可以挖掉當前局面來看具有邏輯必然性的數字(比如說第一行是 1 2 3 4 5 6 7 8 9,那么 1 可以被挖掉,因為 1 的存在是被其他 8 個數決定的),這樣,這部分的挖空可以不用交給隨機挖空來解決,降低了算法的時間復雜度。

    5. UML圖顯示計算模塊部分各個實體之間的關系

    6. 計算模塊接口部分的性能改進。記錄在改進計算模塊性能上所花費的時間,描述你改進的思路,并展示一張性能分析圖(由VS 2015/2017的性能分析工具自動生成),并展示你程序中消耗最大的函數。(3')

    1. puzzle 模塊

  • 測試指令 -n 10000 -r 20~35 -u
      

  • 測試指令 -n 10000 -r 36~50 -u
      

  • 測試指令 -n 10000 -r 51~55 -u  
      
        

  •   可見,FgMap::outside_lock 是最耗時間的函數,編寫之前已經考慮到了這個問題,因此采用了位運算等加速方法,實際上很難再優化了。

    2. create 模塊

      
        

      create 采用的是行列交換的方法生成不等價的數獨,因此很快,瓶頸在 io,但這里采用了緩存一次性輸出的方式,最大限度利用了 block 讀寫的功能,因此也無法再優化了。

    3. solve 模塊

      

    7. 看Design by Contract, Code Contract的內容:

    http://en.wikipedia.org/wiki/Design_by_contract
    http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
    描述這些做法的優缺點, 說明你是如何把它們融入結對作業中的。(5')

    優點:

  • 在開發過程中可能會忘記一個函數本身的含義,而契約設計可以時刻提醒設計者這個函數本身的功能,不至于偏離原本的需求;
  • 在調用函數時可以了解到需要保證的條件和可能帶來的后果,增加了開發的安全性。
  • 缺點:

  • 契約設計的前置條件和后置條件可能有很多,如果一定嚴格按照語法規則描述,則閱讀起來比較困難;而如果改為用自然語言描述,又會出現描述模糊的情況,這一點在上學期《面向對象課程設計》中有所體會;
  • 保證契約的正確性會帶來更多的開發成本。
  •   在本次結對作業中,我們通過定義了dig函數和rank類的需求,近似地實現了契約設計。dig函數負責將傳入的數獨盡可能地挖空,而rank類提供了各種對排行榜操作的接口。預先定義了這些需求再開始實際的代碼編寫,讓后期的代碼銜接更加簡單。

    8. 計算模塊部分單元測試展示。展示出項目部分單元測試代碼,并說明測試的函數,構造測試數據的思路。并將單元測試得到的測試覆蓋率截圖,發表在博客中。要求總體覆蓋率到90%以上,否則單元測試部分視作無效。(6')

    覆蓋率截圖:

    單元測試

    在編寫測試代碼之前,首先明確一下單元測試要實現的功能:

  • 合法性檢測
  • 等價性檢測(是更嚴格的重復性檢測)
  • 單解性檢測
  • 對于-c,需要檢測1、2;
    對于-s,需要檢測1;
    對于-n,需要檢測1、2,如果有-u,還需要檢測3。

    合法性檢測

    依然使用二進制數存儲法判斷合法性,這一點和個人項目完全相同,優點是速度快、代碼簡潔,代碼如下:

    for (int i = 0; i < number; i++) {sudoku = new string();int* sudoku_ptr = result[i];for (int j = 0; j < SIZE; j++) {for (int k = 0; k < SIZE; k++) {int digit;digit = sudoku_ptr[GET_POS(j, k)];(*sudoku) += digit + '0';bit = (1 << (digit - 1));row_record[j] |= bit;column_record[k] |= bit;block_record[(j / 3) * 3 + k / 3] |= bit;}}// judge & initialfor (int i = 0; i < 9; i++) {Assert::AreEqual(511, row_record[i]);Assert::AreEqual(511, column_record[i]);Assert::AreEqual(511, block_record[i]);row_record[i] = 0;column_record[i] = 0;block_record[i] = 0;} }

    等價性檢測

    沿用了個人項目中的字典樹,代碼變更如下:

    typedef struct node {bool isbottom;int depth;string* sudoku;struct node* ptrs[9];}Treenode;Treenode* create_treenode(int depth, string* sudoku) {Treenode* p = (Treenode*)malloc(sizeof(Treenode));p->isbottom = true;p->depth = depth;p->sudoku = sudoku;for (int i = 0; i < 9; i++) {p->ptrs[i] = NULL;}return p;}void add_sudoku_to_tree(int depth, Treenode** p, string* sudoku) {if ((*p) == NULL) {(*p) = create_treenode(depth, sudoku);}else {if ((*((*p)->sudoku)).length() > 0) {if ((*sudoku).compare(*((*p)->sudoku)) == 0) {fclose(fout);}Assert::AreNotEqual(*sudoku, *((*p)->sudoku));add_sudoku_to_tree(depth + 1, &((*p)->ptrs[(*((*p)->sudoku))[depth + 1] - '1']), ((*p)->sudoku));(*p)->sudoku = new string("");}add_sudoku_to_tree(depth + 1, &((*p)->ptrs[(*sudoku)[depth + 1] - '1']), sudoku);}}

    其中,這一行

    (*p)->sudoku = new string("");

    是變動后的代碼,之前的代碼為

    *((*p)->sudoku) = "";

      
    這段代碼的情境是本身位于這個節點的字符串遇見了新加入的字符串,于是他們需要根據自己接下來的字符,從該節點引申出兩個屬于它們的新節點,那里是他們的歸宿。可以看出之前的代碼是有問題的,sudoku是字典樹節點中儲存的字符串指針,舊代碼中為了清空節點,清空的是指針指向的值,導致字典樹中很多字符串都被清空了,所幸被測試的代碼沒有問題,不然后果很嚴重……新的代碼修改的是指針本身,不影響存入的字符串,是正確的處理方式。
      
    除此之外,我們沿用了個人項目中的字典樹重復性判斷,這次新添了檢測等價性的功能。我們選取第一個宮,對里面的數字分別和1~9進行映射,之后將整個數獨根據映射刷新,再放入字典樹中進行判斷。映射的代碼如下:

    char digit_map[SIZE]; for (int i = 0; i < SIZE; i++) {digit_map[i] = (*sudoku)[i]; // build map } /* change to equivalence */ for (int i = 0; i < SIZE * SIZE; i++) {(*sudoku)[i] = digit_map[(*sudoku)[i] - '1']; }

    單解性測試

    其實在生成數獨題目的時候已經檢查過單解性了,這里引用的是那里的代碼:

    bool generator_fill_sudoku(Subject_sudoku* sudoku, int &solution_counter) { /* -- succeed(true) or failed(false) */Box* box;//cout << sudoku->to_string() << endl;box = sudoku->get_minpos_box();if (box == NULL) {solution_counter++;if (solution_counter > SOLUTION_MAX) {return false;}return true;}return generator_guess_value(box, sudoku, solution_counter); }

    這個函數是對求解函數的修改,原來是找到解立刻輸出答案,現在是找到一個解繼續運行,直到找到的解的個數超過SOLUTION_MAX為止。這里SOLUTION_MAX的值為1。

    9. 計算模塊部分異常處理說明。在博客中詳細介紹每種異常的設計目標。每種異常都要選擇一個單元測試樣例發布在博客中,并指明錯誤對應的場景。(5')

      InvalidCommandException 錯誤的指令;

    TEST_METHOD(command_exception1) {bool test_result = false;int argc = 4;char* argv[10] = {"sudoku.exe","-s","100","-c"};try {read_command(argc, argv);}catch (InvalidCommandException*) {test_result = true;}Assert::IsTrue(test_result); }

      CannotOpenFileException 無法打開文件;

    TEST_METHOD(cannot_open) {bool test_result = false;Core core;try {core.input_file("puz.txt", result_solve);}catch (CannotOpenFileException* e) {test_result = true;}Assert::IsTrue(test_result); }

      BadFileException 文件異常或損壞;

    TEST_METHOD(incompleted_sudoku) {FILE* ftest;int erno = fopen_s(&ftest, "puzzle.txt", "w");if (ftest == NULL) {cout << erno << endl;Assert::Fail();}Core core;fputs("4 1 7 2 3 8 6 5 9\n\3 2 6 4 9 5 8 1 7\n\9 5 8 7 1 6 3 2 4\n\6 9 1 8 5 2 7 4 3\n\8 4 2 9 7 3 1 6 5\n\7 3 5 6 4 1 9 8 2\n\1 8 3 5 2 7 4 9 6\n\2 7 9 1 6 4 5 3 8\n\5 6 4 3 8 9 2 7 b", ftest);fclose(ftest);bool test_result = false;try {core.input_file("puzzle.txt", result_solve);}catch (BadFileException* e) {test_result = true;}Assert::IsTrue(test_result); }

      InvalidPuzzleException 數獨謎題本身不符合規則(并非指全部無解謎題):

    int index = 0; int digit; QPushButton* btn; for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {int digit = puzzle[index++];btn = buttons[i][j];if (digit == 0) { // free gridbtn->setText("");btn->setEnabled(true);btn->setStyleSheet(UNCERTAIN_GRID_STYLE);numbers[i][j] = 0;}else {char num[2] = { '0' + digit, '\0' };btn->setText(num);btn->setEnabled(false);btn->setStyleSheet(CERTAIN_GRID_STYLE);numbers[i][j] = digit;}} }

      以上樣例全部測試通過。

    10. 界面模塊的詳細設計過程。在博客中詳細介紹界面模塊是如何設計的,并寫一些必要的代碼說明解釋實現過程。(5')

      我們主要的GUI界面只有一個,其它的還包括排行榜界面和成績寫入界面。

      GUI的布局使用代碼生成,沒有使用.ui文件,原因是覺得.ui文件自動生成的代碼很臃腫,而自己寫的話可以建立數組管理各個組件(大概是我們沒有找到正確的方法?)。舉例來說的話,下面是生成數獨9*9個方格的代碼:

    void SudokuGUI::create_grids() {QSignalMapper* mapper = new QSignalMapper(this);for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {numbers[i][j] = 0;buttons[i][j] = new QPushButton("", this);QPushButton* btn = buttons[i][j];btn->setGeometry((j + 1) * BOX_SIZE + (j / 3) * 10 - 20,(i + 1) * BOX_SIZE + (i / 3) * 10,BOX_SIZE,BOX_SIZE); // set positionbtn->setEnabled(false);btn->setFont(QFont("Times", 18, QFont::Bold)); // set fondbtn->setStyleSheet(CERTAIN_GRID_STYLE); // set colorbtn->setFont(GRID_FONT);QObject::connect(btn, SIGNAL(clicked()), mapper, SLOT(map()));mapper->setMapping(btn, GET_GRIDNO(i, j));}}QObject::connect(mapper, SIGNAL(mapped(int)), this, SLOT(record_button(int))); }

      利用類似的for循環來初始化各個元件,他們的StyleSheet用預定義表示:

    #define FUNCTION_FONT QFont("Consolas", 16, QFont::Normal) #define REMAINING_FONT QFont("Consolas", 14, QFont::Normal) #define GRID_FONT QFont("Consolas", 18, QFont::Normal) #define UNCERTAIN_GRID_STYLE "QPushButton:hover{\background-color:#AFEEEE;\ }"\ "QPushButton{\background-color:#66CCFF;\ }" #define CERTAIN_GRID_STYLE "QPushButton{\color:#1C2460;\background-color:#99CCFF;\ }" #define TIP_GRID_STYLE "QPushButton{\color:#1E90FF;\background-color:#99CCFF;\ }" #define WRONG_GRID_STYLE "QPushButton{\background-color:#DC143C;\ }" #define MARK_GRID_STYLE "QPushButton{\background-color:#DC143C;\ }" #define CURRENT_GRID_STYLE "QPushButton{\background-color:#FFFF66;\ }" #define INPUT_BOTTON_STYLE "QPushButton{\background-color:#FF69B4;\ }" #define FUNCTION_BUTTON_STYLE "QPushButton{\color:#000000;\background-color:#FFFF66;\ }" #define ENABLE_BUTTON_STYLE "QPushButton{\background-color:#DC143C;\ }" #define DISABLE_INPUT_BUTTON_STYLE "QPushButton{\background-color:#FFE4E1;\ }" #define DISABLE_FUNCTION_STYLE "QPushButton{\background-color:#fcf8ab;\ }" #define WINDOW_SYTLE ""

      下面是一些界面變化部分,首先是新游戲的開始,這里根據Core的generate接口處理數獨界面,將未被挖空的數獨對應按鈕置為Disable:

    int index = 0; int digit; QPushButton* btn; for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {int digit = puzzle[index++];btn = buttons[i][j];if (digit == 0) { // free gridbtn->setText("");btn->setEnabled(true);btn->setStyleSheet(UNCERTAIN_GRID_STYLE);numbers[i][j] = 0;}else {char num[2] = { '0' + digit, '\0' };btn->setText(num);btn->setEnabled(false);btn->setStyleSheet(CERTAIN_GRID_STYLE);numbers[i][j] = digit;}} }

      這次我們實現的功能有四個,除了要求的check和tip外,我們還附加了filter和track功能。filter是在當前格子內切換所有滿足填入規則的值,而track是將某種數字標紅便于查看。

      check的設計思路是建立三個數組,分別對應行、列、組,并將每一個格子的數字分別存儲于這三個數組中,假如某個數組儲存的某種數字的數量大于1,說明出現了數字的重復,將重復的數字標紅:

    int row_digit_counter[SIZE][SIZE] = { 0 }; int column_digit_counter[SIZE][SIZE] = { 0 }; int block_digit_counter[SIZE][SIZE] = { 0 };bool pass = true;// store box for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {int value = numbers[i][j];if (value != 0) {row_digit_counter[i][value - 1]++;column_digit_counter[j][value - 1]++;block_digit_counter[GET_BLOCKNO(i, j)][value - 1]++;}else {pass = false;}} }// judge & initial for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {int value = numbers[i][j];if (value != 0 && (row_digit_counter[i][value - 1] > 1 ||column_digit_counter[j][value - 1] > 1 ||block_digit_counter[GET_BLOCKNO(i, j)][value - 1] > 1)) {buttons[i][j]->setStyleSheet(WRONG_GRID_STYLE);pass = false;}else {RESTORE_GRID_STYLE(buttons[i][j]);}} }

      tip的實現非常簡單,就是將終局數獨對應的數字填入就好,這里就不細說了。tracker的實現也很簡單,就是找到對應的數字并涂紅就好,這里簡要說一下filter的實現:

      我采用了二進制存儲的方法,將當前選中格子所在行、列、宮中出現的所有數字進行記錄,得到所有可取的值。但是由于filter所填入的數字是需要不斷輪換的,所以我要從當前填入的數字開始進行for循環,保證下一個出現的數字是在當前填入數字之后的。但是假如沒有可以填入的數字,我們就將這個格子清空(填入CLEAN)。

    if (curbtn != NULL) {GO_THROUGH_BLOCKS(GET_BLOCKNO(this->cur_rowno, this->cur_colno)) {int digit = numbers[i][j];if (digit != 0 && (i != this->cur_rowno || j != this->cur_colno)){binary_recorder |= (bit << (digit - 1));}}for (int i = 0; i < SIZE; i++) {int digit;digit = numbers[i][this->cur_colno];if (digit != 0 && i != this->cur_rowno) {binary_recorder |= (bit << (digit - 1));}digit = numbers[this->cur_rowno][i];if (digit != 0 && i != this->cur_colno) {binary_recorder |= (bit << (digit - 1));}}int cur_digit = numbers[this->cur_rowno][this->cur_colno];for (int digit = cur_digit + 1; digit <= SIZE; digit++) {if ((binary_recorder & (bit << (digit - 1))) == 0) {set_number(digit);return;}}for (int digit = 1; digit <= cur_digit; digit++) {if ((binary_recorder & (bit << (digit - 1))) == 0) {set_number(digit);return;}}set_number(CLEAN);

      計時器采用QLCDNumber元件,利用槽函數,每1ms調用一次timeout_handle函數:

    void Timer::timeout_handle() {*time = time->addMSecs(TIMEOUT_MILL);time_lcd->display(time->toString("hh:mm:ss.zzz")); }

    11. 界面模塊與計算模塊的對接。詳細地描述UI模塊的設計與兩個模塊的對接,并在博客中截圖實現的功能。(4')

    代碼對接

      對接很簡單,利用core的生成難度謎題功能和求解功能(用于提示功能),將謎題和解儲存在數獨中。

    FILE* fout; this->mode = difficulty - 1;this->unfilled_grid_count = 0; int puzzle_receiver[1][SIZE*SIZE]; core->generate(1, difficulty, puzzle_receiver);for (int i = 0; i < SIZE; i++) {for (int j = 0; j < SIZE; j++) {int gridno = GET_GRIDNO(i, j);this->puzzle[gridno] = puzzle_receiver[0][gridno];if (puzzle[gridno] == 0) {unfilled_grid_count++;}} }char unfilled_grid_count_str[3]; sprintf(unfilled_grid_count_str, "%d", unfilled_grid_count); grid_count->setText(REMAINING_TEXT + unfilled_grid_count_str);core->solve(puzzle_receiver[0], this->sudoku);

    功能實現

    主界面

    點擊Game->New Game可以選擇難度,隨即開始游戲。操作流程為點擊某方格,并點擊右側鍵盤上的數字進行填入,點擊Erase可以消除方格上填入的數字。

    功能一:Check

    點擊Check按鈕可以檢查填入的正確性,沖突部分會標紅,如果全部方格都被填入且正確,游戲結束。

    功能二:Tip

    點擊某一可填入方格,此時可選擇Tip,Tip可以告訴你方格的正確答案,但代價是本次成績將不會被計入排名。

    功能三:Track

    點擊Track后,Track會變紅,此時為追蹤數字狀態,點擊右側數字鍵盤,可以顯示數獨中該數字所有出現的位置,便于求解。(此功能只限于Normal和Hard難度)

    功能四:Filter

    點擊某一可填入方格,此時點擊Filter可以循環填入該方格的所有可行數值,便于求解。(此功能只限于Hard難度)

    功能五:計時

    游戲開始時,計時器會開始計時,精確到毫秒,游戲結束后計時器暫停,視成績決定是否計入排名。

    功能六:排名

    如果成績良好,在游戲結束后會彈出窗口供玩家輸入姓名,并存儲在排行榜中。排行榜位于Game->LeaderBoard中。

    細節一:填入最后一個格子自動觸發Check

    玩家填入最后一個格子即標志著數獨的完成,此時應當立即結束游戲,或者告知玩家哪里填入有問題。

    細節二:告知剩余方格數

    玩家可以了解到當前的游戲進度。

    細節三:功能隨難度進行調整,保證游戲性

    對于Easy模式,Filter太過強大,以至于無腦Filter就可以結束游戲,成了純粹比拼手速的游戲。我們認為Easy象征著初學者難度,一些基礎的猜數方法要由玩家在此階段掌握,不能讓新玩家過于依賴Filter和Track功能。隨著難度的遞增,玩家的水平也逐漸遞增,此時給予玩家這些功能可以為高端玩家提供便利,這是我們設計的初衷。

    細節四:Tip不可隨便使用

    Tip的存在是把雙刃劍——它會讓玩家喪失思考的樂趣,破壞游戲性,但同時也能給予玩家幫助,讓實在想不出答案的玩家可以睡個安穩覺。為了權衡利弊,我們綜合了Rank功能,讓使用過Tip的玩家不能將成績計入Rank,保證了游戲的公平性,同時還鼓勵玩家盡可能減少Tip的次數,專注于提高解題能力。

    細節五:關閉主窗口,其它窗口隨即關閉

    如果主窗口都關了,剩下的小窗口存在的意義是什么呢?還要勞煩用戶一個一個去關嗎?

    12. 描述結對的過程,提供非擺拍的兩人在討論的結對照片。(1')

    我們屬于是兩個落單的人,于是就結對了……結對的時候使用的是我的個人項目代碼,GUI部分由我編寫,-c生成算法也主要由我想出來的,而核心代碼中生成數獨謎題部分的算法則是由王辰昱提出的,實際運行效率非常高。在本次結對編程過程中,我學到了很多東西,包括編程能力和溝通能力,收益匪淺。

    13. 結對編程的優點和缺點

    結對編程

    優點:

  • 減少代碼編寫過程中出現問題的幾率
  • 在出現問題的時候,兩個人的思路更加廣闊,更利于解決問題
  • 在代碼設計過程中,兩個人經過討論可以使代碼設計更加完美
  • 兩個人取長補短,結對過程也是相互學習的過程
  • 缺點:

  • 對空閑時間要求較大,兩個人的空閑時間必須有很多交集
  • 隊友

    優點:

  • 代碼能力超強,封裝性很好,代碼風格很贊
  • 學習能力很強,可以通過學習掌握一些算法,提高代碼運行效率
  • 用戶體驗部分理解比我要深刻,GUI的優化部分幫了不少忙
  • 肯下工夫,愿意花費時間對代碼進行雕琢(很肝)
  • 缺點:

  • 感覺有些缺乏計劃性,導致最后時間很緊張……
  • 自己

    優點:

  • debug能力感覺還可以,小技巧有很多,de掉了一些比較玄的bug
  • 肯下工夫,愿意花費時間對代碼進行雕琢(也很肝)
  • 感覺溝通能力較差,很多時候不能表達出自己的觀點
  • 缺點:

  • 代碼風格不好,比較粗心大意,造成很多bug
  • 14. 在你實現完程序之后,在附錄提供的PSP表格記錄下你在程序的各個模塊上實際花費的時間。(0.5')

    附加題4

    交換小組:

    王子銘 15231058
    索一奇 15061180

    合并情況

      合并的時候出現了一些問題,主要原因是我們兩組的core接口不同,前者傳入的是一個二維指針,而我們傳入的是一個二維數組(助教博客中寫的是int[][] result,這是java中的用法,根據不同人理解不同,我認為無論傳入指針還是數組都是正確的),導致最終通過修改代碼才能進行合并。
      要想使用交換小組的dll新建游戲,必須要調用set_play(bool)函數,這個函數十分簡單:

    void Core::set_play(bool a) {play = a; }

      其目的是為了調整生成puzzle的策略,如果play是false,說明是命令行模式下運行,使用回溯法保證了數獨生成的不等價性;如果play是true,說明是在GUI中運行,更加側重隨機性。這種做法的優點在于生成數獨更加靈活,但同時為dll的交換造成了一定影響,因為set_play并不是約定的接口,導致只有通過修改代碼才能確保數獨游戲的正確生成。 因此我的個人觀點是,core中多余的函數會影響dll的靈活性,盡量不去添加沒有約定好的接口是比較好的設計方式。
      除此之外的一個小缺陷是任意打開兩次游戲的第N局游戲都是相同的,我認為可以通過srand(time(0))根據系統時間改變隨機數種子,從而解決問題~

    合并后的游戲界面

      我normal模式下挖45個空,對方是挖47個空:

    Bug修復

    經交換小組提示,目前Exception類已提供dll接口,調用者可以自行調用所有的異常類。

    附加題5

    正在收集反饋,部分反饋結果如下:

    某舍友A君
    亮點在于:細節做得非常好,比如使用tip之后不算成績、難度的遞增會有伴隨功能的出現、排行榜的可以自行清除;check、filter和track的功能做得很新穎,也很實用,比如check可以隨時點擊隨時檢查,track和filter能夠使得游戲過程的真實性更強。
    不足在于:未開放的按鈕可以不顯示;說明性的文字過少,影響用戶上手時的體驗。

    某舍友B君
    優點:增加了filter功能,提升了游戲體驗,數獨填寫完成后自動觸發check功能,不必手動點擊check按鈕。排行榜信息豐富,用戶體驗良好。
    缺少必要的用戶提示。直接進入游戲頁面感覺很突兀。按鈕太方方正正了。

    某好友C君
    感覺很方便啊,感覺可以改進一下,不用點數字,鍵盤輸入數字更爽。

    某舍友D君
    優點:

  • check功能標注了同行或同列相同數字。
  • 增加filter功能,可提示當前數字框接受數字。
  • 有track功能,可以顯示當前數獨游戲中某數字所在位置。
  • help功能是一個亮點,包含各個按鈕使用規則,顯得逼格很高的樣子。
  • 缺點:

  • 被提示之后不能消除,不利于小伙伴之間的互動。
  • 使用界面不友善。建議可以將按鈕變換形狀增添界面趣味性
  • 某基友E君

    這個成功提示顯示不全啊,話說這也太簡單了,hard8分多不用試數就做出來了= =
    (不好意思,是你太強了)

    相關改進

    B君說得很有道理,于是我們添加了help功能,在About->Help可以調出幫助:

    解釋了相關的功能用法,同時該內容也在README中寫入了。
    E君提出的問題暫時無法解決,這和計算機自定義的文本大小有關,經測試,該同學的文本大小大約為1.5x,而在1.0x和1.25x上顯示正常。

    感想

    我是個強迫癥,覺得界面可以不精美,但用起來一定要舒服,因此在顏色搭配、布局等方面花了一點時間,包括使用七段數碼管提供毫秒級的計時功能,營造緊張感;所有窗口的一鍵關閉;創造新紀錄后立刻調出排行榜等等……感覺至少對用戶習慣有了一點思考,這是我結對編程主要的收獲之一,當然這部分也離不開同伴的幫助和支持,后面關于tip的配色問題都是他進行改良的hhh,總體來講最終效果還說得過去。其實我一開始是想向“掃雷”看齊的,系統自帶的掃雷沒有特別花哨的配色,界面十分簡潔樸素,但是用起來也很舒服,我感覺能做到這種程度就很不錯了。
    但是內部的代碼實現其實在個人復審的時候感覺還是挺糟糕的,至少應該建幾個QPushButton的子類代表不同類型的按鈕,主要是一開始的界面還是在個人階段一晚上搞出來的,沒有考慮太多,導致GUI內部元件的封裝性特別差。這一部分以后還是要注意的。

    轉載于:https://www.cnblogs.com/slontia/p/7669797.html

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的[2017BUAA软工]结对项目:数独扩展的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩精品一区二区免费视频 | 欧美另类v | 色吊丝在线永久观看最新版本 | 国产成人精品在线播放 | 日韩色中色 | 精品高清视频 | 最近中文字幕高清字幕在线视频 | 亚洲成人影音 | 亚洲三区在线 | 日韩在线电影一区二区 | 国产精品18久久久久久久久久久久 | 国产精品毛片一区二区三区 | 国产精品一区在线观看你懂的 | 国产成人香蕉 | 久久不射网站 | 麻豆影视在线观看 | 三级av片 | 日韩字幕 | 又爽又黄又无遮挡网站动态图 | 在线韩国电影免费观影完整版 | 九色91在线视频 | 亚洲精品国产精品国自产观看 | 久久久免费精品 | 婷色| 久久伊99综合婷婷久久伊 | 97天堂 | 成人一级片在线观看 | 在线 成人 | 婷婷精品国产一区二区三区日韩 | 狠狠色丁香久久婷婷综合_中 | 国产精品乱码高清在线看 | 午夜精品久久久久久久久久久 | 美女啪啪图片 | 热精品 | 亚洲精品国产品国语在线 | 国产精品9区 | 久久久免费网站 | 国产精品久久一区二区无卡 | 欧美日韩二区三区 | 久久天天躁夜夜躁狠狠85麻豆 | 手机在线免费av | 日日躁你夜夜躁你av蜜 | www欧美日韩| 免费网站色 | 国产精品黄色 | 天天操天天草 | 99产精品成人啪免费网站 | 激情深爱| 免费高清看电视网站 | 在线 国产 亚洲 欧美 | 日韩欧美在线观看一区 | 高清av在线免费观看 | 日韩二区三区在线观看 | 深夜视频久久 | 人人干干人人 | 国产精品网站一区二区三区 | 一区二区三区视频网站 | 日韩免费在线观看视频 | 国产h片在线观看 | 精品久久一区二区 | 激情一区二区三区欧美 | 欧美网址在线观看 | 一区二区三区在线观看免费 | 色狠狠久久av五月综合 | 激情综合色播五月 | 91九色蝌蚪视频在线 | 在线不卡中文字幕播放 | 美女黄频在线观看 | 国产精品一区二区在线看 | 欧美日韩国产一区二区三区在线观看 | 日韩中文字幕免费在线播放 | 国产91全国探花系列在线播放 | 99精品视频免费观看视频 | 久久久久久毛片 | 久久免费福利视频 | 粉嫩aⅴ一区二区三区 | 日韩国产在线观看 | 五月婷婷综合在线视频 | 色激情在线 | 久久精品免费观看 | 中文字幕黄色 | 日韩一区二区三区免费电影 | 日韩在线观看三区 | 国产精品1000| 日韩免费在线观看视频 | 久久免费a | 波多野结衣精品 | 人人爱人人做人人爽 | 成人久久免费 | 精品一区二区在线免费观看 | 美女福利视频在线 | 久久久久久久久免费视频 | 国产精品中文字幕在线观看 | 欧美黑人性爽 | 久久无码av一区二区三区电影网 | 国产传媒中文字幕 | 日韩久久精品 | 久久一区国产 | 在线观看视频h | 狠狠干天天操 | 天堂av在线网站 | 久久久久久久久久久久久影院 | 日韩欧美久久 | 激情久久一区二区三区 | 日韩a在线 | 亚洲毛片一区二区三区 | 麻豆国产露脸在线观看 | 精品一区二区影视 | 免费在线成人 | 91高清视频在线 | 色国产精品一区在线观看 | 91三级在线观看 | 黄a在线看 | 亚洲精品中文字幕在线 | 91成年人网站 | 国产日韩欧美在线观看视频 | 国产婷婷久久 | 97在线视频免费播放 | 午夜美女福利直播 | 996久久国产精品线观看 | 久热爱| 日韩一区二区免费在线观看 | 免费观看黄色12片一级视频 | 日本中文字幕观看 | 亚洲精品视频网址 | 久久精品7| 免费观看成年人视频 | 午夜视频导航 | 亚洲精品午夜aaa久久久 | 日韩中文字幕在线观看 | 久久一久久 | 国产精品理论片在线观看 | 日本高清免费中文字幕 | 亚洲成aⅴ人片久久青草影院 | www视频在线免费观看 | 成人国产电影在线观看 | 五月天激情婷婷 | 久久国产精品久久国产精品 | 69av视频在线观看 | 久久久久久蜜桃一区二区 | 中文在线免费观看 | 日韩免费观看一区二区 | 国产亚洲欧美精品久久久久久 | 2019免费中文字幕 | 99视频精品免费观看, | 在线一二区 | 日日夜夜免费精品视频 | 99视频精品 | 婷婷五月情 | 日日摸日日爽 | 色婷婷av国产精品 | 国产一区二区在线观看免费 | 亚洲欧美国产精品va在线观看 | 亚洲美女视频在线 | 久久夜色网 | 香蕉在线视频观看 | 天天干,天天射,天天操,天天摸 | 国产三级国产精品国产专区50 | av3级在线 | 黄色片免费在线 | 一级黄色电影网站 | 天天射天天爱天天干 | 日韩资源在线观看 | 精品国产一区二区三区不卡 | 99精品久久久久久久 | 成人av手机在线 | 综合激情网... | 视频一区久久 | 伊人狠狠色丁香婷婷综合 | 日批视频在线播放 | 午夜精品一二三区 | 欧美十八 | 91超在线| 日韩免费电影一区二区三区 | 成片免费观看视频 | 三级免费黄色 | 精品久久久久久国产91 | 顶级bbw搡bbbb搡bbbb | 日日夜夜网 | 蜜臀av麻豆 | 不卡电影免费在线播放一区 | 亚洲成年人在线播放 | 久久久久久久久久网站 | 欧美日韩在线视频一区二区 | 精品一区二区影视 | 视频二区在线视频 | 深爱五月网 | www.色午夜| 成人毛片网 | 精品国内自产拍在线观看视频 | 国产精品久久久久av免费 | 狠狠色伊人亚洲综合网站野外 | 亚洲第一av在线 | 99热99re6国产在线播放 | 亚洲春色综合另类校园电影 | www四虎影院| 午夜久久影视 | 在线观看亚洲电影 | 国产区免费 | 国产精品精品久久久久久 | 日韩三级成人 | 久久精品国产亚洲精品 | 特级黄色一级 | 91视频这里只有精品 | 久久久这里有精品 | 麻豆手机在线 | 97在线视 | 激情丁香综合五月 | 免费观看第二部31集 | 深夜福利视频一区二区 | 国产剧情在线一区 | 国产日产精品一区二区三区四区的观看方式 | 日韩精品一区二区三区高清免费 | 国产成人av网址 | 欧美日韩国产在线精品 | 五月综合激情 | 国产高清视频免费在线观看 | 亚洲国产无 | 在线观看国产福利片 | 国产一区二区不卡视频 | 香蕉视频导航 | 草莓视频在线观看免费观看 | 精品免费视频. | 国产男女爽爽爽免费视频 | x99av成人免费 | 一二三区在线 | 欧美色图另类 | www.色五月.com | 久久精品国产一区二区三 | 日韩中文字幕免费电影 | 激情 一区二区 | 午夜三级影院 | 午夜精品中文字幕 | 在线免费观看视频一区 | 看国产黄色大片 | 亚洲国产日韩在线 | 日韩欧美在线视频一区二区 | 亚洲欧美日韩精品久久奇米一区 | 在线a人片免费观看视频 | 欧美日韩综合在线 | 亚洲清纯国产 | 欧美日韩一区久久 | 国产成人精品一区二区三区 | 午夜久久网站 | 99性视频| 欧美影片| av天天色| 国产视频色| 成人久久毛片 | 色婷婷视频网 | 欧美激情在线网站 | 日日夜操 | 国产精彩视频一区二区 | 欧美高清成人 | 久草资源在线观看 | 色婷婷狠| 国产尤物在线观看 | 色婷婷五 | 在线观看黄网站 | 国产精品毛片一区二区 | 亚洲成人黄色网址 | 久久久久久久久久久久亚洲 | 国产高清日韩欧美 | 久草精品资源 | 草久视频在线观看 | 日韩欧美在线高清 | 日韩成人精品一区二区 | 激情 一区二区 | 日本中文字幕高清 | 一区二区三区国产欧美 | 久久久久久国产精品久久 | 久久精品—区二区三区 | 字幕网在线观看 | 日本在线免费看 | 男女激情免费网站 | 在线免费观看视频你懂的 | 天天操夜夜摸 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 中文字幕乱码日本亚洲一区二区 | 久久狠狠婷婷 | 日韩精品你懂的 | 五月天丁香视频 | 久久综合九色综合欧美就去吻 | 99精品在线免费 | 麻豆免费看片 | av电影一区二区三区 | 在线观看不卡视频 | 午夜视频99 | 久久国产欧美日韩精品 | 久久韩国免费视频 | 99久久精品免费看 | 夜夜看av | 最近中文字幕在线中文高清版 | 在线看av网址 | 特级a毛片| 超碰97中文 | 国产一区视频在线观看免费 | 韩国精品福利一区二区三区 | 97av影院| 久久午夜羞羞影院 | 日韩视频一区二区三区在线播放免费观看 | 久草av在线播放 | 国产精品mv | 天天干天天搞天天射 | 久久99久久99免费视频 | 久久伊人婷婷 | 亚洲国产成人在线观看 | 色99视频| 亚洲成人黄色在线 | 伊人国产在线观看 | 国产精品18久久久久久vr | 黄色av大片| 亚洲国产成人精品电影在线观看 | 日韩精品无 | 国产精品久久久久一区二区国产 | 婷五月激情 | 国产一区二区久久久久 | 97在线免费观看视频 | 一区二区三区精品在线视频 | 深爱激情五月婷婷 | 四虎在线免费视频 | 一本一本久久a久久 | 不卡国产在线 | 中文字幕在线观看的网站 | 国产精品69av | 免费在线激情电影 | 四虎5151久久欧美毛片 | 97超碰在线免费 | 日日爽夜夜爽 | 五月婷婷激情综合 | 九九免费视频 | 久久精品a | 射综合网 | 久久成人麻豆午夜电影 | 国产最顶级的黄色片在线免费观看 | 狠狠狠干狠狠 | 国产精品视频免费观看 | 国产高清视频在线观看 | 日本午夜免费福利视频 | 日韩av在线高清 | 久久久久久久国产精品视频 | 久久99久久久久久 | 欧美另类一二三四区 | 在线视频久 | 日本精品一区二区三区在线播放视频 | 91观看视频 | 亚洲精品h| 人人爽人人爽人人片av免 | 亚洲最新av网站 | 亚洲一一在线 | 精品国产欧美一区二区三区不卡 | 夜夜操天天摸 | 久久特级毛片 | 日韩欧美高清一区二区 | 欧美日韩国内在线 | 美国av大片 | 福利视频 | 国产剧情在线一区 | 国产精彩在线视频 | 精品久久久久久亚洲综合网站 | 国产精品初高中精品久久 | 日日夜操 | 久久久久久国产精品免费 | 成人永久视频 | 色婷婷综合久久久 | 狠狠干天天干 | 天天干天天干天天干天天干天天干天天干 | 欧美色精品天天在线观看视频 | 中文字幕av免费 | 日韩av电影免费观看 | 日韩欧美成 | 在线免费视频 你懂得 | 嫩草av在线 | 久久一区二区三区超碰国产精品 | 成人理论在线观看 | 少妇性bbb搡bbb爽爽爽欧美 | 中文字幕一区二区三区四区久久 | 国产一级特黄毛片在线毛片 | 国产v亚洲v | 五月激情五月激情 | 在线观看视频亚洲 | 在线国产视频一区 | 一区二区三区在线看 | 在线免费黄色av | 麻豆va一区二区三区久久浪 | 欧美在线你懂的 | 天天操天天操天天操天天操 | 97超碰精品 | 最近中文字幕完整视频高清1 | 日韩一区二区三区观看 | 亚洲高清av | 91爱爱中文字幕 | www.888.av| 国产精品免费一区二区三区 | 国产精品一区久久久久 | 中文字幕在线观看日本 | 国精产品999国精产品视频 | 欧美日韩在线观看不卡 | www.97色.com | 成人黄色在线 | 色片网站在线观看 | 日韩成人xxxx| 国产亚洲精品久久19p | 日韩成人精品一区二区三区 | 人人爽人人爱 | 国产成人99久久亚洲综合精品 | 欧美在线视频一区二区三区 | 狠狠做深爱婷婷综合一区 | 99久热在线精品视频观看 | 久久黄色免费视频 | 亚洲国产中文字幕 | 国产在线日韩 | 日本精品视频免费观看 | 香蕉视频4aa | 99国产视频 | 99精品国产在热久久 | 国产精品福利无圣光在线一区 | 国产一区二区免费在线观看 | 丁香五香天综合情 | 精选久久| 在线电影 一区 | 日韩三级中文字幕 | 91精品国产麻豆国产自产影视 | 日韩精品视频免费专区在线播放 | 日韩av快播电影网 | 最新中文字幕 | 国产精品区免费视频 | h视频日本 | 91av片| 国产一区成人在线 | 久久精品国产美女 | 国产黄色特级片 | 国产精品自产拍在线观看蜜 | 狠狠地操| 亚洲区视频在线观看 | 久草视频观看 | 成 人 黄 色视频免费播放 | 国产一区二区在线观看视频 | 国产亚洲精品久久久久久移动网络 | 天天综合婷婷 | 夜夜操狠狠干 | 免费精品国产 | 免费在线观看黄网站 | 色999在线| 中文字幕网站视频在线 | 中文字幕高清 | 高清av免费看 | 国产在线久久久 | 日韩在线观看你懂的 | 欧洲精品二区 | 99国产一区| 中日韩三级视频 | 欧美日韩激情视频8区 | 香蕉手机在线 | 99精品免费 | 91av福利视频 | 婷婷久久综合九色综合 | 国产精品免费久久久久 | 国产99久久久精品 | 国产精品永久久久久久久久久 | 69久久久 | 91麻豆精品国产91久久久久久 | 日韩av电影免费观看 | 久久免费视频网 | 成人黄色免费观看 | 亚洲91在线 | 岛国片在线 | 在线免费成人 | 亚洲精品久久久久久久蜜桃 | 在线精品亚洲 | 91在线视频在线观看 | 成人av免费在线播放 | 中文字幕频道 | 免费看片在线观看 | 日日摸日日添夜夜爽97 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久精品国产精品亚洲精品 | 九九日韩 | 精品国产成人av在线免 | 日黄网站| 91九色视频观看 | 国产精品毛片久久久 | 美女一级毛片视频 | 国产91小视频 | 久久久久成人精品 | 色婷婷视频在线 | 精品国产亚洲一区二区麻豆 | 最近在线中文字幕 | 韩国av一区二区 | 国产成人综合精品 | 久久最新 | 国产成人1区 | 美女网站在线免费观看 | 国产精品久免费的黄网站 | 国产特黄色片 | 国产亚州精品视频 | 久久都是精品 | 久久国产免费视频 | 特级a老妇做爰全过程 | 99精品国产aⅴ | 91色九色 | 久久伊人免费视频 | 亚洲高清网站 | 蜜桃av观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久tv视频| 免费视频 你懂的 | 国产91九色蝌蚪 | 精品久久久久久久久久国产 | 欧美视频xxx | 欧美日韩午夜在线 | 国产日产欧美在线观看 | 成人一区二区三区在线观看 | 国产黄色片免费 | 免费在线观看日韩 | 国产精品人人做人人爽人人添 | 亚洲欧洲精品一区 | 少妇性xxx| 91中文视频| 中文字幕视频三区 | 国产欧美精品在线观看 | 亚洲午夜久久久综合37日本 | 国产一级片网站 | 日韩高清免费在线观看 | 午夜国产在线 | 日韩av不卡在线观看 | 婷婷成人在线 | 五月激情五月激情 | 久久精品人人做人人综合老师 | 久久久久免费网站 | 97超碰免费 | 日韩视频中文字幕在线观看 | 日韩动态视频 | 亚洲精品乱码久久久久久 | 九九九在线| 国内久久精品视频 | 美女免费黄视频网站 | 国产夫妻av在线 | 综合网成人 | 91视频在线观看下载 | www黄在线| 亚洲精品视频免费在线观看 | 五月婷婷综合激情网 | 麻豆视频在线免费 | 99色精品视频 | 四虎在线免费观看 | 在线电影 一区 | 国产高清视频免费在线观看 | 国产黄色大全 | 亚洲欧美在线观看视频 | 欧美激情精品久久久久久 | 视频在线在亚洲 | 久久国产成人午夜av影院潦草 | 成人在线视频免费观看 | 天天射天天射 | 成人免费视频网站 | 精品美女在线视频 | 在线观看成人网 | 99精品国产一区二区三区麻豆 | 西西4444www大胆视频 | 在线观看免费中文字幕 | 久久成人国产精品入口 | 国产亚洲精品久久久久久久久久 | 中文字幕在线观看视频一区二区三区 | 香蕉影视在线观看 | 综合伊人久久 | av黄色av | 国产欧美日韩视频 | 欧美日韩国产一区二 | 国产成人精品久久 | 丁香婷婷综合激情五月色 | 亚洲国产小视频在线观看 | 久久久精品在线观看 | 婷婷中文在线 | 精品96久久久久久中文字幕无 | 亚洲视频专区在线 | 美女免费av| 97精品国自产拍在线观看 | 日韩免费区 | 中文字幕 国产视频 | 一二三四精品 | 国产免费视频一区二区裸体 | 国产黄色片在线免费观看 | 国产美女被啪进深处喷白浆视频 | 欧美日韩亚洲第一页 | 天天操天天射天天添 | 国产精品黄 | 久久手机精品视频 | 国产精品九九热 | 岛国av在线不卡 | 久久精品www人人爽人人 | 人人爽人人爽人人片 | 国产精品自拍av | 一级欧美黄 | 久久久网| 国产精品乱码久久久久久1区2区 | 在线视频99 | 中文字幕视频网站 | 黄色a级片在线观看 | 毛片网免费 | 日韩欧美成人网 | 99午夜| 婷婷六月天丁香 | 久久伊人五月天 | 一区二区视频播放 | 亚洲视频免费在线 | 免费观看成年人视频 | 日韩国产在线观看 | 视频在线观看99 | 久久精品79国产精品 | 国产精品黄色影片导航在线观看 | h网站免费在线观看 | 亚洲aⅴ免费在线观看 | 97免费中文视频在线观看 | 亚洲欧美国产精品久久久久 | 国产精品久久久久久婷婷天堂 | 极品美女被弄高潮视频网站 | 日韩大片在线免费观看 | 日韩av电影网站在线观看 | 国产成人精品一区二区在线观看 | 久久国产高清视频 | 粉嫩av一区二区三区四区在线观看 | 日韩高清在线看 | 蜜桃视频日本 | 中文在线字幕免 | 天天射天天射天天 | 国产123区在线观看 国产精品麻豆91 | 亚洲精品一区二区久 | 亚洲视频一区二区三区在线观看 | 开心激情综合网 | 综合网久久 | 99久久久久成人国产免费 | 亚洲成人一二三 | 日韩在线观看精品 | 欧美aaa视频 | 在线观看日本高清mv视频 | 久久九九国产视频 | 精品久久久久久久久久久久久 | aaa毛片视频 | 国产在线不卡视频 | 草久电影 | 久久久毛片 | 亚洲高清视频在线观看免费 | 久久免费试看 | 97超碰人人模人人人爽人人爱 | www.久久久| 欧美在线观看视频 | 精品在线一区二区三区 | 中文字幕日韩免费视频 | 91理论片午午伦夜理片久久 | 97国产视频| 成人黄色电影在线播放 | av免费网站在线观看 | 狠狠色丁香久久婷婷综合五月 | 国产视频不卡 | 草久在线| 91在线超碰| 亚洲综合色网站 | 九九热在线观看视频 | 国产一级免费观看 | 人人搞人人爽 | 最新av免费在线 | 久久艹久久| 96久久欧美麻豆网站 | 激情网五月 | 天天艹天天操 | 成人国产综合 | 日韩在线视频在线观看 | 六月丁香在线观看 | 免费精品久久久 | 日韩精品免费一线在线观看 | 超碰在线中文字幕 | 一级片黄色片网站 | 欧美日韩xxx| 91porny九色在线播放 | 成年人免费电影在线观看 | 欧美日韩在线观看一区二区 | 色婷在线 | 婷婷五天天在线视频 | 九色自拍视频 | 麻豆久久精品 | 国产精品久久麻豆 | 亚洲精品在线观看视频 | 日韩精品一区二区三区中文字幕 | 成人丁香花 | 色综合天天综合在线视频 | 免费日韩一区二区 | av性在线| 精品91视频 | www.色的 | 免费福利片 | 久草视频资源 | 久久久久久久看片 | 伊甸园永久入口www 99热 精品在线 | 97色婷婷成人综合在线观看 | 欧美了一区在线观看 | 成年人电影免费在线观看 | www视频免费在线观看 | 99视频黄| 不卡的av在线播放 | 麻豆视频在线观看免费 | 亚洲精品中文字幕在线 | 日韩黄色在线观看 | 欧美极品少妇xbxb性爽爽视频 | 国产精品午夜av | 99在线免费观看视频 | 看av免费网站 | www.午夜视频 | 九九视频在线播放 | 国内精品久久久久影院一蜜桃 | 欧美一级在线 | 成人av在线网址 | 日韩剧| 国产香蕉久久精品综合网 | 五月婷婷国产 | 激情中文字幕 | 欧美成人h版电影 | 久草精品视频在线观看 | 97超碰人人 | av免费网| 国产久草在线 | 欧美性做爰猛烈叫床潮 | 国产欧美中文字幕 | 黄色网址中文字幕 | 亚洲视频999 | 在线免费黄色 | 精品国偷自产在线 | 欧美一区二区三区四区夜夜大片 | 日本黄色大片免费 | 国产免费成人 | 六月激情丁香 | 天天曰夜夜爽 | 日韩黄色在线观看 | 色偷偷88888欧美精品久久 | 日韩一区二区三区观看 | 免费在线黄色av | 一区二区精品久久 | 五月婷婷激情综合 | av色一区 | 91在线免费观看国产 | 激情小说网站亚洲综合网 | 乱子伦av | 久久电影国产免费久久电影 | 亚洲最新毛片 | 一本—道久久a久久精品蜜桃 | 91av欧美 | 免费a级黄色毛片 | 亚洲午夜精品电影 | 国产精品免费一区二区三区 | 国产精品 中文字幕 亚洲 欧美 | 久久国产福利 | 久草在线视频免费资源观看 | 国产精品久久久精品 | 91传媒在线看 | 2021国产视频 | 久久不卡视频 | av资源免费看 | 在线综合色 | 欧美一级艳片视频免费观看 | 最新av在线网址 | 美女网站色免费 | 激情视频免费在线观看 | 婷婷去俺也去六月色 | 美女视频黄免费的 | 亚洲午夜久久久影院 | 国产精品免费观看网站 | 国产在线不卡一区 | 婷婷激情五月 | 午夜视频免费 | 亚洲污视频 | 亚欧日韩成人h片 | 久久黄色片 | 99精品久久久久 | 久久综合9988久久爱 | 色婷婷久久一区二区 | 狠狠做深爱婷婷综合一区 | 国产在线91精品 | 久久一级片| 国产精品一区二区在线播放 | 久久成| 91久久丝袜国产露脸动漫 | 五月天六月丁香 | 国产电影黄色av | 亚洲开心激情 | 久久久久电影网站 | 久久精品在线 | 日本中文字幕在线免费观看 | 黄视频网站大全 | 国产va饥渴难耐女保洁员在线观看 | 亚洲婷婷伊人 | 91精品国产福利在线观看 | 日韩精品高清视频 | jizz999| 美女久久一区 | 麻豆av一区二区三区在线观看 | 粉嫩高清一区二区三区 | 久久桃花网 | 97夜夜澡人人双人人人喊 | 99久久久国产精品免费99 | 日韩在线观看的 | 一区二区三区在线免费 | 91插插插网站 | 欧美日韩视频观看 | 亚洲专区 国产精品 | 国产精品免费久久久久久久久久中文 | 国产精品美女久久久久久久网站 | 国产福利在线免费观看 | 香蕉视频在线免费看 | 国产99爱 | 午夜久久久精品 | 亚州av免费 | 精品一二三区视频 | 国产黄色观看 | 国产精品美女久久久久久久 | 天天射综合 | 国产精品久久久久久久久久尿 | 欧美性大战久久久久 | www.久久免费视频 | 在线观看日本韩国电影 | 在线观看一级视频 | 一色av | 深夜成人av| 一级黄色片毛片 | 久久蜜臀一区二区三区av | www.在线看片.com| 婷婷四房综合激情五月 | 久久香蕉电影网 | 国产91精品一区二区麻豆亚洲 | 欧美日韩精品在线播放 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 在线观看成人av | 在线看av的网址 | 91视频91自拍 | 韩国一区二区av | 天天色成人网 | 激情婷婷 | 黄网av在线 | 午夜国产一区二区 | 精品婷婷| 国产精品一区二区美女视频免费看 | 最近中文字幕在线播放 | 日本福利视频在线 | 懂色av一区二区三区蜜臀 | 粉嫩av一区二区三区四区五区 | 精品资源在线 | 激情综合网五月婷婷 | 四虎影视成人精品 | 一区二区免费不卡在线 | 欧美有色 | 美女免费黄视频网站 | 草久久久久久 | 麻豆视频免费播放 | 韩日成人av | 久久黄色小说 | 激情欧美xxxx | 国产1区在线观看 | 日日射天天射 | a天堂免费 | 成人av午夜| 免费黄色特级片 | 中文字幕一区av | 欧美另类sm图片 | 久久久精品 | 精品国内自产拍在线观看视频 | 亚洲综合在线五月 | 欧美日韩视频一区二区三区 | av资源免费在线观看 | 成片免费 | 九九九九九九精品任你躁 | 波多野结衣在线播放视频 | 中文字幕在线免费97 | 青青河边草免费视频 | 麻豆影视在线观看 | 在线看一区 | 国产精品毛片一区二区三区 | 99国产免费网址 | 欧美日韩国语 | 欧美另类交在线观看 | 国产一级在线观看 | 午夜在线免费视频 | 欧美精品视 | 丰满少妇在线观看网站 | 天天摸天天操天天舔 | 亚洲,国产成人av | 最新在线你懂的 | 成人黄色小视频 | 亚洲理论影院 | 欧美综合久久久 | 国产一区精品在线观看 | 一区二区三区免费看 | 久久影视中文字幕 | 国产色在线 | 人人精品久久 | 一区二区视频网站 | 日韩素人在线观看 | 色婷婷播放| 欧美成人亚洲 | 国产青春久久久国产毛片 | 麻豆综合网 | 在线看片中文字幕 | 中文字幕在线观看第三页 | 亚洲永久精品国产 | 亚洲精品无| 久久久精品欧美一区二区免费 | 欧美激情视频一区二区三区免费 | 99精品欧美一区二区三区 | 色婷五月| 美女黄视频免费 | 在线看小早川怜子av | 精品不卡av | 日本精品一区二区三区在线播放视频 | 亚洲综合在线播放 | 国产高清一 | 九色视频网| 午夜精品一区二区国产 | 国产精品扒开做爽爽的视频 | 亚洲黄色免费观看 | 国产精品av一区二区 | 五月开心六月伊人色婷婷 | 国产视频18 | 中文av一区二区 | 亚洲视频在线免费看 | 午夜12点 | 欧美激情精品久久久久久免费印度 | 久久婷婷色| 91中文字幕在线观看 | 国产精品免费一区二区三区 | 69国产盗摄一区二区三区五区 | 在线国产一区二区三区 | 天天插日日插 | 久久久精品午夜 | 久久激五月天综合精品 | 日日干av| 国产一区二区视频在线播放 | 97**国产露脸精品国产 | 黄色小说免费观看 | 91禁在线看 | 精品黄色片 | 亚洲天天在线日亚洲洲精 | 色婷婷狠狠18 | 国产不卡av在线播放 | 婷婷激情5月天 | 国产高潮久久 | 国产精品免费观看在线 | www99久久| 国内精品久久久久久久97牛牛 | 一 级 黄 色 片免费看的 | 欧美极度另类性三渗透 | 久久久这里有精品 | 九九热视频在线播放 | 亚洲高清视频在线观看免费 | 九九久久精品视频 | 日韩电影久久 | 亚洲精品乱码久久久一二三 | 国产精品久久久久久久久久了 | 2018亚洲男人天堂 | 精品国产一区二区三区在线 | 久久久久久久国产精品 | 天天色天天色天天色 | 97在线视频免费观看 | 国产精品久久久一区二区三区网站 | 在线观看国产高清视频 | 超碰在线官网 | 国产大片黄色 | 99精品欧美一区二区三区 | 国产午夜精品一区 | 欧美人交a欧美精品 | 四虎成人av| 国产成人精品av | 欧美黑人性爽 | 五月天亚洲激情 | 91成人欧美 | 热re99久久精品国产66热 | 中文在线www | 国产专区在线视频 | 国产精品露脸在线 | 丝袜美腿在线播放 | 天天综合亚洲 | 91传媒视频在线观看 | 成人av电影在线观看 | 福利一区二区 | 欧美91精品| 在线视频观看你懂的 | 久久久网页| 亚洲乱码国产乱码精品天美传媒 | 久久成人精品电影 | 久久综合久久鬼 | 中文字幕传媒 | 日韩r级在线 | 国产69久久精品成人看 | 超碰免费公开 | 亚洲精品女人久久久 | 日韩精选在线 | 久久精品99久久久久久 | 综合色中色 | 午夜视频欧美 | 超碰99人人| 18国产精品白浆在线观看免费 |