#include #include #include #include #define LEFT (75) #define RIGHT (77) #define RETURN (13) typedef enum { empty=0, black=1, white=5 } stone; stone field[7][6]={empty}; stone player=white; stone winner=empty; int prior[7]={0}; short steine[6]={0}; short empty_fields=42; int top(int x) { // Liefert das oberste freie Feld in einer Spalte x int j=0; while (j<6 && field[x][j]!=empty) j++; return(j); } void PrintPrior(char *string, int x, int y, int z, int c) { /*gotoxy(33+x*4,c+1); printf("%d",prior[x]); gotoxy(64,c+1); printf(" %s",string); printf(" %d %d %d",x,y,z); */ // getch(); } int CalcSum(short x, short y, char z) { int k, i=0; switch (z) { case 'h': for (k=0;k<4;k++) i+=field[x+k][y]; break; case 'u': for (k=0;k<4;k++) i+=field[x+k][y+k]; break; case 'd': for (k=0;k<4;k++) i+=field[x+k][y-k]; break; case 'v': for (k=0;k<4;k++) i+=field[x][y+k]*(k+1)*(k+1); break; } return(i); } short CheckPrior3(short x, short y) { short i,j,k,l,m=0,z=0; if (x<3) k=0; // horizontal else k=x-3; j=y; for (i=k; i<=x && i<4 ;i++) { z=CalcSum(i,j,'h'); switch (z) { case 15: m=1; break; case 3 : if (m!=1) m=2; break; } } if ((abs(x-y)<3) || (x-y==3)) { // schraeg hoch k=x-3; l=y-3; while (k<0 || l<0) { k++; l++; } i=k; j=l; while (i<=x && i<4 && j<=y && j<3) { z=CalcSum(i,j,'u'); switch (z) { case 15: m=1; break; case 3 : if (m!=1) m=2; break; } i++; j++; } } if (x+y>2 && x+y<9) { // schraeg runter k=x-3; l=y+3; while (k<0 || l>5) { k++; l--; } i=k; j=l; while (i<=x && i<4 && j>=y && j>2) { z=CalcSum(i,j,'d'); switch (z) { case 15: m=1; break; case 3 : if (m!=1) m=2; break; } i++; j--; } } return(m); } short CheckPrior4(short x, short y) { short i,j,k,l,m=0,z=0; if (x<3) k=0; // horizontal else k=x-3; j=y; for (i=k; i<=x && i<4 ;i++) { z=CalcSum(i,j,'h'); switch (z) { case 3 : m=1; break; case 15: if (m!=1) m=2; break; } } if ((abs(x-y)<3) || (x-y==3)) { // schraeg hoch k=x-3; l=y-3; while (k<0 || l<0) { k++; l++; } i=k; j=l; while (i<=x && i<4 && j<=y && j<3) { z=CalcSum(i,j,'u'); switch (z) { case 3 : m=1; break; case 15: if (m!=1) m=2; break; } i++; j++; } } if (x+y>2 && x+y<9) { // schraeg runter k=x-3; l=y+3; while (k<0 || l>5) { k++; l--; } i=k; j=l; while (i<=x && i<4 && j>=y && j>2) { z=CalcSum(i,j,'d'); switch (z) { case 3 : m=1; break; case 15: if (m!=1) m=2; break; } i++; j--; } } return(m); } int Prior3(short g, short h) { if (g!=1) { switch (h) { case 1: return(23); case 2: return(17); case 0: if (g==0) return(11); else return(13); } } else return(3); } int Prior4(short g, short h) { if (g!=1) { switch (h) { case 1: return(21); case 2: return(15); case 0: if (g==0) return(9); else return(11); } } else return(1); } void CheckPrior1(short x, short y) { short i,j,k,l,g=0,h=0,z=0; if (y>0 && y<3 && field[x][y-1]==black) prior[x]+=1; PrintPrior("norm1",x,y,z,1); if (x<3) k=0; // horizontal else k=x-3; j=y; for (i=k; i<=x && i<4 ;i++) { z=CalcSum(i,j,'h'); switch (z) { case 20: prior[x]=1999; return; case 8 : prior[x]+=1000; break; case 15: z=0; for (k=0;k<4;k++) z+=field[i+k][j]*(k+1); switch(z) { case 35: field[x][y]=empty; h=0; g=CheckPrior3(i+2,j); if (j>0) h=CheckPrior3(i+2,j-1); if (j<5 && h!=1) h=CheckPrior3(i+2,j+1); field[x][y]=white; if (x==i) { if (i+4>6 || field[i+4][j]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || field[i-1][j]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 40: field[x][y]=empty; h=0; g=CheckPrior3(i+1,j); if (j>0) h=CheckPrior3(i+1,j-1); if (j<5 && h!=1) h=CheckPrior3(i+1,j+1); field[x][y]=white; if (x==i) { if (i+4>6 || field[i+4][j]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || field[i-1][j]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 30: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]+=12; } else if (field[i-1][j]==empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i+3,j); if (j>0) h=CheckPrior3(i+3,j-1); if (j<5 && h!=1) h=CheckPrior3(i+3,j+1); field[x][y]=white; if (x!=0) prior[x]+=Prior3(g,h); else if (field[i+4][j]!=white) prior[x]+=Prior3(g,h); break; case 45: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]+=12; } else if (field[i+4][j]==empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i,j); if (j>0) h=CheckPrior3(i,j-1); if (j<5 && h!=1) h=CheckPrior3(i,j+1); field[x][y]=white; if (x!=6) prior[x]+=Prior3(g,h); else if(field[i-1][j]!=white) prior[x]+=Prior3(g,h); break; } break; case 7 : z=0; for (k=0;k<4;k++) z+=field[i+k][j]*(k+1); switch (z) { case 11: case 12: if (i+4>6 || field[i+4][j]!=black) prior[x]+=7; break; case 23: case 24: if (i-1<0 || field[i-1][j]!=black) prior[x]+=7; break; case 10: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]+=12; } else if (field[i-1][j]==empty) prior[x]+=12; } if (x!=0) { if (field[i-1][j]==empty) prior[x]+=9; else prior[x]+=7; } else if (field[i+4][j]!=black) prior[x]+=7; break; case 25: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]+=12; } else if (field[i+4][j]==empty) prior[x]+=12; } if (x!=6) { if (field[i+4][j]==empty) prior[x]+=9; else prior[x]+=7; } else if(field[i-1][j]!=black) prior[x]+=7; break; case 17: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]+=12; } else if (field[i+4][j]==empty) prior[x]+=12; } if (field[i+4][j]==empty) prior[x]+=9; else prior[x]+=7; break; case 18: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]+=12; } else if (field[i-1][j]==empty) prior[x]+=12; } if (field[i-1][j]==empty) prior[x]+=9; else prior[x]+=7; break; case 14: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]+=12; } else if (field[i-1][j]==empty) prior[x]+=12; } prior[x]+=7; break; case 21: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]+=12; } else if (field[i+4][j]==empty) prior[x]+=12; } prior[x]+=7; break; default: prior[x]+=7; break; } break; } } PrintPrior("hor1",x,y,z,2); i=x; // vertikal if (y<3) j=0; else j=y-3; z=CalcSum(i,j,'v'); switch (z) { // oben - unten case 150: prior[x]=1999; return; // OOOO case 94 : prior[x]+=1000; break; // OXXX case 70 : prior[x]+=10; break; // _OOO case 146: if (y<5) prior[x]+=10; break; // OOOX // case 50 : prior[x]+=3; break; // _OXX // case 98 : if (y<5) prior[x]+=3; break; // OXXO } PrintPrior("vert1",x,y,z,3); if ((abs(x-y)<3) || (x-y==3)) { // schraeg hoch k=x-3; l=y-3; while (k<0 || l<0) { k++; l++; } i=k; j=l; while (i<=x && i<4 && j<=y && j<3) { z=CalcSum(i,j,'u'); switch (z) { case 20: prior[x]=1999; return; case 8 : prior[x]+=1000; break; case 15: z=0; for (k=0;k<4;k++) z+=field[i+k][j+k]*(k+1); switch (z) { case 35: field[x][y]=empty; h=0; g=CheckPrior3(i+2,j+2); h=CheckPrior3(i+2,j+1); if (h!=1) h=CheckPrior3(i+2,j+3); field[x][y]=white; if (x==i) { if (i+4>6 || j+4>5 || field[i+4][j+4]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || j-1<0 || field[i-1][j-1]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 40: field[x][y]=empty; h=0; g=CheckPrior3(i+1,j+1); h=CheckPrior3(i+1,j); if (h!=1) h=CheckPrior3(i+1,j+2); field[x][y]=white; if (x==i) { if (i+4>6 || j+4>5 || field[i+4][j+4]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || j-1<0 || field[i-1][j-1]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 30: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]+=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i+3,j+3); h=CheckPrior3(i+3,j+2); if (j<2 && h!=1) h=CheckPrior3(i+3,j+4); field[x][y]=white; if (x!=0 && y!=0) prior[x]+=Prior3(g,h); else if (field[i+4][j+4]!=white) prior[x]+=Prior3(g,h); break; case 45: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]+=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i,j); if (j>0) h=CheckPrior3(i,j-1); if (h!=1) h=CheckPrior3(i,j+1); field[x][y]=white; if (x!=6 && y!=5) prior[x]+=Prior3(g,h); else if(field[i-1][j-1]!=white) prior[x]+=Prior3(g,h); break; } break; case 7 : z=0; for (k=0;k<4;k++) z+=field[i+k][j+k]*(k+1); switch (z) { case 11: case 12: if (i+4>6 || j+4>5 || field[i+4][j+4]!=black) prior[x]+=8; break; case 24: case 23: if (i-1<0 || j-1<0 || field[i-1][j-1]!=black) prior[x]+=8; break; case 10: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]+=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]+=12; } if (x!=0 && y!=0) { if (field[i-1][j-1]==empty) prior[x]+=10; else prior[x]+=8; } else if (field[i+4][j+4]!=black) prior[x]+=10; break; case 25: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]+=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]+=12; } if (x!=6 && y!=5) { if (field[i+4][j+4]==empty) prior[x]+=10; else prior[x]+=8; } else if(field[i-1][j-1]!=black) prior[x]+=8; break; case 17: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]+=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]+=12; } if (field[i+4][j+4]==empty) prior[x]+=10; else prior[x]+=8; break; case 18: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]+=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]+=12; } if (field[i-1][j-1]==empty) prior[x]+=10; else prior[x]+=8; break; case 14: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]+=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]+=12; } prior[x]+=8; break; case 21: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]+=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]+=12; } prior[x]+=8; break; default: prior[x]+=8; break; } break; } i++; j++; } } PrintPrior("schr h1",x,y,z,4); if (x+y>2 && x+y<9) { // schraeg runter k=x-3; l=y+3; while (k<0 || l>5) { k++; l--; } i=k; j=l; while (i<=x && i<4 && j>=y && j>2) { z=CalcSum(i,j,'d'); switch (z) { case 20: prior[x]=1999; return; case 8 : prior[x]+=1000; break; case 15: z=0; for (k=0;k<4;k++) z+=field[i+k][j-k]*(k+1); switch (z) { case 35: field[x][y]=empty; h=0; g=CheckPrior3(i+2,j-2); h=CheckPrior3(i+2,j-3); if (h!=1) h=CheckPrior3(i+2,j-1); field[x][y]=white; if (x==i) { if (i+4>6 || j-4<0 || field[i+4][j-4]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || j+1>5 || field[i-1][j+1]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 40: field[x][y]=empty; h=0; g=CheckPrior3(i+1,j-1); h=CheckPrior3(i+1,j-2); if (h!=1) h=CheckPrior3(i+1,j); field[x][y]=white; if (x==i) { if (i+4>6 || j-4<0 || field[i+4][j-4]!=white) prior[x]+=Prior3(g,h); } else if (x==i+3) { if (i-1<0 || j+1>5 || field[i-1][j+1]!=white) prior[x]+=Prior3(g,h); } else prior[x]+=Prior3(g,h); break; case 30: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]+=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i+3,j-3); h=CheckPrior3(i+3,j-2); if (j>3 && h!=1) h=CheckPrior3(i+3,j-4); field[x][y]=white; if (x!=0 && y!=5) prior[x]+=Prior3(g,h); else if (field[i+4][j-4]!=white) prior[x]+=Prior3(g,h); break; case 45: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]+=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]+=12; } field[x][y]=empty; h=0; g=CheckPrior3(i,j); if (j>0) h=CheckPrior3(i,j-1); if (h!=1) h=CheckPrior3(i,j+1); field[x][y]=white; if (x!=6 && y!=0) prior[x]+=Prior3(g,h); else if(field[i-1][j+1]!=white) prior[x]+=Prior3(g,h); break; } break; case 7 : z=0; for (k=0;k<4;k++) z+=field[i+k][j-k]*(k+1); switch (z) { case 11: case 12: if (i+4>6 || j-4<0 || field[i+4][j-4]!=black) prior[x]+=7; break; case 24: case 23: if (i-1<0 || j+1>5 || field[i-1][j+1]!=black) prior[x]+=7; break; case 10: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]+=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]+=12; } if (x!=0 && y!=5) { if (field[i-1][j+1]==empty) prior[x]+=12; else prior[x]+=7; } else if (field[i+4][j-4]!=black) prior[x]+=7; break; case 25: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]+=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]+=12; } if (x!=6 && y!=0) { if (field[i+4][j-4]==empty) prior[x]+=9; else prior[x]+=7; } else if(field[i-1][j+1]!=black) prior[x]+=7; break; case 17: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]+=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]+=12; } if (field[i+4][j-4]==empty) prior[x]+=9; else prior[x]+=7; break; case 18: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]+=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]+=12; } if (field[i-1][j+1]==empty) prior[x]+=9; else prior[x]+=7; break; case 14: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]+=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]+=12; } prior[x]+=7; break; case 21: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]+=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]+=12; } prior[x]+=7; break; default: prior[x]+=7; break; } break; } i++; j--; } } PrintPrior("schr r1",x,y,z,5); } void CheckPrior2(short x, short y, short m) { short i,j,k,l,g=0,h=0,z=0; if (m==-1) { PrintPrior("norm2",x,y,z,7); } else PrintPrior("norm2",x,y,z,13); if (x<3) k=0; // horizontal else k=x-3; j=y; for (i=k; i0) h=CheckPrior4(i+2,j-1); if (j<5 && h!=1) h=CheckPrior4(i+2,j+1); field[x][y]=black; if (x==i) { if (i+4>6 || field[i+4][j]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || field[i-1][j]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*Prior4(g,h); break; case 8 : field[x][y]=empty; h=0; g=CheckPrior4(i+1,j); if (j>0) h=CheckPrior4(i+1,j-1); if (j<5 && h!=1) h=CheckPrior4(i+1,j+1); field[x][y]=black; if (x==i) { if (i+4>6 || field[i+4][j]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || field[i-1][j]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*Prior4(g,h); break; case 6 : if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]-=12; } else if (field[i-1][j]==empty) prior[x]-=12; } field[x][y]=empty; h=0; g=CheckPrior4(i+3,j); if (j>0) h=CheckPrior4(i+3,j-1); if (j<5 && h!=1) h=CheckPrior4(i+3,j+1); field[x][y]=black; if (x!=0) prior[x]+=m*Prior4(g,h); else if (field[i+4][j]!=black) prior[x]+=m*Prior4(g,h); break; case 9 : if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]-=12; } else if (field[i+4][j]==empty) prior[x]-=12; } field[x][y]=empty; h=0; g=CheckPrior4(i,j); if (j>0) h=CheckPrior4(i,j-1); if (j<5 && h!=1) h=CheckPrior4(i,j+1); field[x][y]=black; if (x!=6) prior[x]+=m*Prior4(g,h); else if(field[i-1][j]!=black) prior[x]+=m*Prior4(g,h); break; } break; case 11: z=0; for (k=0;k<4;k++) z+=field[i+k][j]*(k+1); switch (z) { case 31: case 36: if (i+4>6 || field[i+4][j]!=white) prior[x]+=m*5; break; case 19: case 24: if (i-1<0 || field[i-1][j]!=white) prior[x]+=m*5; break; case 26: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]-=12; } else if (field[i-1][j]==empty) prior[x]-=12; } if (x!=0) { if (field[i-1][j]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if (field[i+4][j]!=white) prior[x]+=m*5; break; case 29: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]-=12; } else if (field[i+4][j]==empty) prior[x]-=12; } if (x!=6) { if (field[i+4][j]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if(field[i-1][j]!=white) prior[x]+=m*5; break; case 37: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]-=12; } else if (field[i+4][j]==empty) prior[x]-=12; } if (field[i+4][j]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 18: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]-=12; } else if (field[i-1][j]==empty) prior[x]-=12; } if (field[i-1][j]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 22: if (i>0) { if (j>0) { if (field[i-1][j]==empty && field[i-1][j-1]!=empty && field[i+3][j-1]!=empty) prior[x]-=12; } else if (field[i-1][j]==empty) prior[x]-=12; } prior[x]+=m*5; break; case 33: if (i<3) { if (j>0) { if (field[i+4][j]==empty && field[i][j-1]!=empty && field[i+4][j-1]!=empty) prior[x]-=12; } else if (field[i+4][j]==empty) prior[x]-=12; } prior[x]+=m*5; break; default: prior[x]+=m*5; break; } break; } } if (m==-1) { PrintPrior("hor2",x,y,z,8); } else PrintPrior("hor2",x,y,z,14); i=x; // vertikal if (y<3) j=0; else j=y-3; z=CalcSum(i,j,'v'); switch (z) { case 86: prior[x]+=m*16; break; // X000 // case 34: prior[x]+=m*1; break; // _XOO // case 82: if (y<5) prior[x]+=m*1; break; // XOOX } if (m==-1) { PrintPrior("ver2",x,y,z,9); } else PrintPrior("ver2",x,y,z,15); if ((abs(x-y)<3) || (x-y==3)) { // schraeg hoch k=x-3; l=y-3; while (k<0 || l<0) { k++; l++; } i=k; j=l; while (i<=x && i<4 && j<=y && j<3) { z=CalcSum(i,j,'u'); switch (z) { case 4 : prior[x]+=m*700; break; case 16: prior[x]+=m*100; break; case 3 : z=0; for (k=0;k<4;k++) z+=field[i+k][j+k]*(k+1); switch (z) { case 7 : field[x][y]=empty; h=0; g=CheckPrior4(i+2,j+2); h=CheckPrior4(i+2,j+1); if (h!=1) h=CheckPrior4(i+2,j+3); field[x][y]=black; if (x==i) { if (i+4>6 || j+4>5 || field[i+4][j+4]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || j-1<0 || field[i-1][j-1]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*Prior4(g,h); break; case 8 : field[x][y]=empty; h=0; g=CheckPrior4(i+1,j+1); h=CheckPrior4(i+1,j); if (h!=1) h=CheckPrior4(i+1,j+2); field[x][y]=black; if (x==i) { if (i+4>6 || j+4>5 || field[i+4][j+4]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || j-1<0 || field[i-1][j-1]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*Prior4(g,h); break; case 6 : if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]-=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]-=12; } field[x][y]=empty; h=0; g=CheckPrior4(i+3,j+3); h=CheckPrior4(i+3,j+2); if (j<2 && h!=1) h=CheckPrior4(i+3,j+4); field[x][y]=black; if (x!=0 && y!=0) prior[x]+=m*Prior4(g,h); else if (field[i+4][j+4]!=black) prior[x]+=m*Prior4(g,h); break; case 9 : if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]-=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]-=12; } field[x][y]=empty; h=0; g=CheckPrior4(i,j); if (j>0) h=CheckPrior4(i,j-1); if (h!=1) h=CheckPrior4(i,j+1); field[x][y]=black; if (x!=6 && y!=5) prior[x]+=m*Prior4(g,h); else if(field[i-1][j-1]!=black) prior[x]+=m*Prior4(g,h); break; } break; case 11: z=0; for (k=0;k<4;k++) z+=field[i+k][j+k]*(k+1); switch (z) { case 31: case 36: if (i+4>6 || j+4>5 || field[i+4][j+4]!=white) prior[x]+=m*5; break; case 19: case 24: if (i-1<0 || j-1<0 || field[i-1][j-1]!=white) prior[x]+=m*5; break; case 26: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]-=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]-=12; } if (x!=0 && y!=0) { if (field[i-1][j-1]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if (field[i+4][j+4]!=white) prior[x]+=m*5; break; case 29: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]-=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]-=12; } if (x!=6 && y!=5) { if (field[i+4][j+4]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if(field[i-1][j-1]!=white) prior[x]+=m*5; break; case 37: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]-=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]-=12; } if (field[i+4][j+4]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 18: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]-=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]-=12; } if (field[i-1][j-1]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 22: if (i>0) { if (j>1) { if (field[i-1][j-1]==empty && field[i-1][j-2]!=empty && field[i+3][j+2]!=empty) prior[x]-=12; } else if (field[i-1][j-1]==empty && field[i+3][j+2]!=empty) prior[x]-=12; } prior[x]+=m*5; break; case 33: if (i<3) { if (j==2) { if (field[i+4][j+4]==empty && field[i][j-1]!=empty && field[i+4][j+3]!=empty) prior[x]-=12; } else if (j==0 && field[i+4][j+4]==empty && field[i+4][j+3]!=empty) prior[x]-=12; } prior[x]+=m*5; break; default: prior[x]+=m*5; break; } break; } i++; j++; } } if (m==-1) PrintPrior("schr h2",x,y,z,10); else PrintPrior("schr h2",x,y,z,16); if (x+y>2 && x+y<9) { // schraeg runter k=x-3; l=y+3; while (k<0 || l>5) { k++; l--; } i=k; j=l; while (i<=x && i<4 && j>=y && j>2) { z=CalcSum(i,j,'d'); switch (z) { case 4 : prior[x]+=m*700; break; // XXXX case 16: prior[x]+=m*100; break; // OOOX, OOXO, OXOO, XOOO case 3 : z=0; for (k=0;k<4;k++) z+=field[i+k][j-k]*(k+1); switch (z) { case 7 : field[x][y]=empty; h=0; // XX_X g=CheckPrior4(i+2,j-2); h=CheckPrior4(i+2,j-3); if (h!=1) h=CheckPrior4(i+2,j-1); field[x][y]=black; if (x==i) { if (i+4>6 || j-4<0 || field[i+4][j-4]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || j+1>5 || field[i-1][j+1]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*Prior4(g,h); break; case 8 : field[x][y]=empty; h=0; // X_XX g=CheckPrior4(i+1,j-1); h=CheckPrior4(i+1,j-2); if (h!=1) h=CheckPrior4(i+1,j); field[x][y]=black; if (x==i) { if (i+4>6 || j-4<0 || field[i+4][j-4]!=black) prior[x]+=m*Prior4(g,h); } else if (x==i+3) { if (i-1<0 || j+1>5 || field[i-1][j+1]!=black) prior[x]+=m*Prior4(g,h); } else prior[x]+=m*9; break; case 6 : if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]-=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]-=12; } field[x][y]=empty; h=0; // XXX_ g=CheckPrior4(i+3,j-3); h=CheckPrior4(i+3,j-2); if (j>3 && h!=1) h=CheckPrior4(i+3,j-4); field[x][y]=black; if (x!=0 && y!=5) prior[x]+=m*Prior4(g,h); else if (field[i+4][j-4]!=black) prior[x]+=m*Prior4(g,h); break; case 9 : if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]-=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]-=12; } field[x][y]=empty; h=0; // _XXX g=CheckPrior4(i,j); if (j>0) h=CheckPrior4(i,j-1); if (h!=1) h=CheckPrior4(i,j+1); field[x][y]=black; if (x!=6 && y!=0) prior[x]+=m*Prior4(g,h); else if(field[i-1][j+1]!=black) prior[x]+=m*Prior4(g,h); break; } break; case 11: z=0; for (k=0;k<4;k++) z+=field[i+k][j-k]*(k+1); switch (z) { case 31: case 36: if (i+4>6 || j-4<0 || field[i+4][j-4]!=white) prior[x]+=m*5; break; case 19: case 24: if (i-1<0 || j+1>5 || field[i-1][j+1]!=white) prior[x]+=m*5; break; case 26: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]-=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]-=12; } if (x!=0 && y!=5) { if (field[i-1][j+1]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if (field[i+4][j-4]!=white) prior[x]+=m*5; break; case 29: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]-=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]-=12; } if (x!=6 && y!=0) { if (field[i+4][j-4]==empty) prior[x]+=m*7; else prior[x]+=m*5; } else if(field[i-1][j+1]!=white) prior[x]+=m*5; break; case 37: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]-=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]-=12; } if (field[i+4][j-4]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 18: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]-=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]-=12; } if (field[i-1][j+1]==empty) prior[x]+=m*7; else prior[x]+=m*5; break; case 22: if (i>0) { if (j==4) { if (field[i-1][j+1]==empty && field[i-1][j]!=empty && field[i+3][j-4]!=empty) prior[x]-=12; } else if (j==3 && field[i-1][j+1]==empty && field[i-1][j]!=empty) prior[x]-=12; } prior[x]+=m*5; break; case 33: if (i<3) { if (j==5) { if (field[i+4][j-4]==empty && field[i][j-1]!=empty && field[i+4][j-5]!=empty) prior[x]-=12; } else if (j==4 && field[i+4][j-4]==empty && field[i][j-1]!=empty) prior[x]-=12; } prior[x]+=m*5; break; default: prior[x]+=m*5; break; } break; } i++; j--; } } if (m==-1) PrintPrior("schr r2",x,y,z,11); else PrintPrior("schr r12",x,y,z,17); } long int pow(int x, int y) { // rechnet x hoch y aus long int i=1; while (y!=0) { i*=x; y--; } return(i); } void SetStone(short x) { short i=top(x); field[x][i]=player; gotoxy(3+x*4,13-2*i); puts("O"); player=black; steine[player]++; } stone Check_Four(void) { int i,j,k,x; for (i=0;i<4;i++) for (j=0;j<6;j++) { x=0; for (k=0;k<4;k++) x+=field[i+k][j]; if (x==20) return(white); if (x==4) return(black); } for (i=0;i<7;i++) for (j=0;j<3;j++) { x=0; for (k=0;k<4;k++) x+=field[i][j+k]; if (x==20) return(white); if (x==4) return(black); } for (i=0;i<4;i++) for (j=0;j<3;j++) { x=0; for (k=0;k<4;k++) x+=field[i+k][j+k]; if (x==20) return(white); if (x==4) return(black); } for (i=0;i<4;i++) for (j=3;j<6;j++) { x=0; for (k=0;k<4;k++) x+=field[i+k][j-k]; if (x==20) return(white); if (x==4) return(black); } return (empty); } void Computer (void) { short x, i, j; for (i=0;i<7;i++) { prior[i]=0; // Die Prioritaeten der Spalten loeschen. gotoxy (33,i+1); printf(" "); gotoxy (33,7+i+1); printf(" "); } // Dee'sche Eröffnung (*g*) /* switch(field[3][0]) { case empty: prior[3]+=20; break; case white: switch(field[6][0]) { case empty: prior[6]+=20; break; case black: switch(field[0][0]) { case empty: prior[0]+=20; break; case black: switch(field[5][0]) { case empty: prior[5]+=20; break; case white: if (field[2][0]==empty) prior[2]+=20; else if (field[2][0]==black) { if (field[1][0]==empty) prior[1]+=20; else if (field[1][0]==white && field[4][0]==empty) prior[4]+=20; } break; case black: if (field[1][0]==empty) prior[1]+=20; else if (field[1][0]==white && field[4][0]==empty) prior[4]+=20; break; } break; } break; } break; case black: switch(field[5][0]) { case empty: prior[5]+=20; break; case white: if (field[2][0]==empty) prior[2]+=20; else if (field[2][0]==black) { if (field[1][0]==empty) prior[1]+=20; else if (field[1][0]==white && field[4][0]==empty) prior[4]+=20; } break; case black: if (field[1][0]==empty) prior[1]+=20; else if (field[1][0]==white && field[4][0]==empty) prior[4]+=20; break; } break; } */ for (i=0;i<7;i++) { // Fuer jede Spalte die Moeglichkeiten pruefen. for (j=top(i);j<5;j++) { field[i][j]=white; // Zwickmuehle suchen uns ausnutzen if (Check_Four()==white) { field[i][j]=black; if (Check_Four()!=black) { field[i][j]=empty; field[i][j+1]=white; if (Check_Four()==white) prior[i]+=500; } } field[i][j]=empty; field[i][j+1]=empty; } j=top(i); if (j<6) { // Nur wenn noch ein Stein gesetzt werden kann, testen. field[i][j]=white; // Feld probehalber belegen CheckPrior1(i,j); // Aussichen fuer den Computer testen. if (prior[i]==1999) { field[i][j]=empty; // Feld wieder freigeben SetStone(i); return; } if (j<5) { field[i][j+1]=black; // Feld probehalber belegen CheckPrior2(i,j+1,-1); // Aussichen fuer den Spieler testen. field[i][j+1]=empty; // Feld wieder freigeben } field[i][j]=empty; } } x=0; for(i=0;i<7;i++) if (prior[i]>=0 && top(i)<6) x+=prior[i]; // Gibt es Felder mit besonderen Prioritaeten. // gotoxy(40,13); printf("pg:%d",x); if (x>0) { // Es gibt ein Feld mit positiver Prioritaet i=0; while (prior[i]<=0) i++; // Erstes Feld mit pos. Prioritaet finden. x=i; bool same=false; for (i=x+1;i<7;i++) { // Ab der Position Feld mit groesster Prioritaet finden. if (prior[x]==prior[i]) same=true; // Es gibt zwei Felder mit groesster Prioritaet. if (prior[x]=0) i++; // Erstes Feld mit negativer Prioritaet finden. x=i; // gotoxy(40,22); printf("1) x:%d px:%d",x,prior[x]); bool same=false; for (i=x+1;i<7;i++) { if (prior[i]==prior[x]) same=true; // Es gibt zwei Felder mit gleicher negativer Prioritaet. if (prior[x]3) cursorx-=4; break; case RETURN : i=top((cursorx-3)/4); if (i!=6) { field[(cursorx-3)/4][i]=player; gotoxy(cursorx,13-2*i); if (player==white) { puts("O"); player=black; } else { puts("X"); player=white; } empty_fields--; steine[player]++; } break; } } winner=Check_Four(); } while (zeichen!=27 && empty_fields!=0 && winner==0); gotoxy(40,1); if (winner==1) puts("Schwarz hat gewonnen!"); if (winner==5) puts("Weiss hat gewonnen!"); zeichen=getch(); } while (zeichen!=27); return (0); }