Android華容道之一步一步實現-5-圖像塊移動算法實現

首先祝賀一下,完成這一步,0.1版的圖像華容道就實現了,就是能夠自己可以自由玩耍了。

不要着急一次成型,要使用Agile的思想,每天一次更新,但是每天都是可用的,一個可用的軟件比別的都重要。

優化啊,界面啊,性能啊,重構啊,別急,慢慢來。

在上一篇文章中提到了具體的算法思想,這次就是具體的實現,主要就這個一個函數,根據手指觸摸的位置來對所有的圖像塊進行重新排序,但是實際上每次最多三塊圖像的位置發生變化,其他的圖像塊的位置都不會發生變化。

protected void switch_pos(int xpos,int ypos) {
        if(!is_in_puzzles(xpos,ypos))
            return;
        
    
        row = (ypos - offset_y )/ bitmap_height;
        col =(xpos- offset_x)/ bitmap_width;

        int pos = row * 4 + col;
        if(puzzles[pos].is_blank)
            return;
        
        //blank in row
        int blank_col = -1;
        for(int i=0;i<4;i++){
            pos = row * 4 + i;
            if(puzzles[pos].is_blank){
                blank_col = i;
                break;
            }
        }
        if(blank_col != -1){
            pos = row * 4 + blank_col;
            img_puzzle blank_puzzle = puzzles[pos];
            if(blank_col < col){
                
                for(int j=blank_col;j <col;j++){
                    pos = row * 4 +j;
                    puzzles[pos] = puzzles[pos+1];                    
                }
                
            }
            else{
                for(int j=blank_col ;j >col;j--){
                    pos = row * 4 + j;
                    puzzles[pos]=puzzles[pos - 1];
                }
                
            }
            puzzles[row * 4 + col] = blank_puzzle;
            return;                
        }
        //blank in col
        int blank_row = -1;
        for (int i = 0; i < 4; i++) {
            pos = i * 4 + col;
            if (puzzles[pos].is_blank) {
                blank_row = i;
                break;
            }
        }
        if (blank_row != -1) {
            pos = blank_row * 4 + col;
            img_puzzle blank_puzzle = puzzles[pos];
            if (blank_row < row) {
                for (int i = blank_row; i < row; i++) {
                    int pos1 = i * 4 + col;
                    int pos2 = (i+1)*4 + col;
                    puzzles[pos1]=puzzles[pos2];
                }
                
            }
            else{
                for(int i=blank_row;i>row;i--){
                    int pos1 = i*4+col;
                    int pos2 = (i-1)*4 + col;
                    puzzles[pos1]=puzzles[pos2];
                }
            }
            puzzles[row * 4 + col]=blank_puzzle;
            return;
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章