#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;
}