ag.c

#include "ag.h"

BOOL preprocess(char * inArray, char xx, char yy){

    char x, y, m, n, i, j, k, forM = 0;
    char Array[4][5] = {{1, 2, 3, 0, 1},
                        {0},
                        {2, 1, 0, 3, 1},
                        {0, 0, 1, 2, 0}};

    //中間體指針矩陣
    CARD * pCardArray[4][5] = {NULL};

    //類別狀態數組
    //0:未完成,1:完成
    TYPE IndexArray[TYPENUM] = {0};

    printf("原始矩陣:/n");
    for(y = 0; y <= (YMAX - 1); y++){
        for(x = 0; x <= (XMAX -1); x++){
            printf("%d  ", Array[y][x]);
        }
        printf("/n");
    }

    printf("/n開始分析.../n/n");
    for(y = 0; y <= (YMAX - 1); y++){
        for(x = 0; x <= (XMAX -1); x++){
            pCardArray[y][x] = (CARD *)malloc(sizeof(CARD));
            pCardArray[y][x] -> index = Array[y][x];
            pCardArray[y][x] -> directions = 0;
        }
    }

    printf("中間體矩陣:/n");
    for(y = 0; y <= (YMAX -1); y++){
        for(x = 0; x <= (XMAX -1); x++){
            printf("%d  ", pCardArray[y][x] -> index);
        }
        printf("/n");
    }

    printf("/n開始查找.../n");

    //完整矩陣遍歷
    for(y = 0; y <= (YMAX -1); y++){
        for(x = 0; x <= (XMAX -1); x++){

            //牌種類依次分析
            for(k = 1; k <= TYPENUM; k++){

                //如果此牌是當前要處理的排類別
                if(pCardArray[y][x] -> index == k){

                    //如果此類牌未被處理過,則處理
                    if(IndexArray[k - 1].status == 0){

                        //i,j係存放前一個元素坐標之變量
                        //此時為某一類元素之第一個元素
                        pCardArray[y][x] -> posx = x;
                        pCardArray[y][x] -> posy = y;
                       
                        IndexArray[k - 1].posx = x;
                        IndexArray[k - 1].posy = y;
                       
                        i = x;
                        j = y;
               
                        //設置查找起始點
                        //如果還沒到最後一列
                        if(x < (XMAX - 1)){
                            m = x + 1;
                            n = y;
                        }
                        //如果已處於最後一列,則進入下一行並從第一列開始
                        if(x == (XMAX -1)){
                            m = 0;
                            n = y + 1;
                        }
                        //開始往後查找
                        for(n = n; n <= (YMAX - 1); n++){
                            if(forM == 1){
                                m = 0;
                            }//if閉合
                            //從那個元素的後一個元素開始
                            for(m = m; m <= (XMAX - 1); m++){
                                forM = 1;
                                //printf("[%d][%d]/n", m, n);
                                //如果發現下一個元素之index值與之相同
                                //便追加至鏈表中
                                //即修改當前元素之next
                                if(pCardArray[n][m] -> index == k){
                                    pCardArray[j][i] -> next = pCardArray[n][m];
                                    pCardArray[n][m] -> next = NULL;
                                    i = m;
                                    j = n;
                                    printf("Array[%d][%d] == %d/n", m, n, k);
                                }//if(pCardArray[n][m] -> index == k)閉合

                                if(m == XMAX - 1 && n== YMAX - 1){
                                    IndexArray[k - 1].status = 1;
                                    //printf("Status/n");
                                }//if(m&&n)閉合
                           
                            }//for(m)閉合
                        }//for(n)閉合

                    }//if(IndexArray[k - 1] = 0)閉合
                }//if(index == k)閉合
            }//for(k)閉合

        }//for(x)閉合
    }//for(y)閉合
    printf("查找完畢!/n/n");

    printf("相同牌:/n");
   
    /*for(k = 0; k <= TYPENUM; k++){
        while(pCurrent != NULL){
        }
    }*/
    printf("pCardArray[][] = %p/n", pCardArray[0][1] -> next);
    printf("pCardArray[][] = %p/n", &pCardArray[2][0]);

    for(k = 0; k <= TYPENUM - 1; k++){
        printf("IndexArray[%d].status = %d/n", k, IndexArray[k].status);
        printf("IndexArray[%d].posx = %d, posy = %d/n", k,
            IndexArray[k].posx, IndexArray[k].posy);
    }
   
   
   
    //directions處理
    //1-有遮擋,0-無遮擋
    //             上 左 下 右
    //directions = 0  0  0  0b
    for(y = 0; y <= (YMAX - 1); y++){
        for(x = 0; x <= (XMAX - 1); x++){

            //處理右側
            //列終,右置位,1b
            if(x == (XMAX - 1)){
                pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x1;
            }else{
                if(pCardArray[y][x + 1] -> index == 0){
                    //右側無遮擋,清零
                    //0xFE == 1111 1110b
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) & 0xFE;
                }else{
                    //右側有遮擋,置位
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x1;
                }
            }

            //處理下側
            //底行,下置位,10b == 0x2
            if(y == (YMAX - 1)){
                pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x2;
            }else{
                if(pCardArray[y + 1][x] -> index == 0){
                //下側無遮擋,清零
                // 1111 1101b == 0xFD
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) & 0xFD;
                }else{
                    //下側有遮擋,置位
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x2;
                }
            }

            //處理左側
            //列始,左置位,100b == 0x4
            if(x == 0){
                pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x4;
            }else{
                if(pCardArray[y][x - 1] -> index == 0){
                    //左側無遮擋,清零
                    // 1111 1011b = 0xFB
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) & 0xFB;
                }else{
                    //左側有遮擋,置位
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x4;
                }
            }

            //處理上側
            //頂行,上置位,1000b == 0x8
            if(y == 0){
                pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x8;
            }else{
                if(pCardArray[y - 1][x] -> index ==0){
                    //上側無遮擋,清零
                    // 1111 0111b = 0xF7
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) & 0xF7;
                }else{
                    //上側有遮擋,置位
                    pCardArray[y][x] -> directions = (pCardArray[y][x] -> directions) | 0x8;
                }
            }//if(x)閉合
        printf("pCardArray[%d][%d] = %d [0x%X]/n", y, x, pCardArray[y][x] -> index, pCardArray[y][x] ->directions);
        }//for(x)閉合
    }//for(y)閉合
   
   
    printf("完成!/n");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值