ntrongdangkhoa
13-06-2008, 12:51
Code caro chạy trên dos
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include "dos.h"
int longpro=0;
void Writesxy(int x,int y,char *ch,int col)
{
gotoxy(x,y);
textcolor(col);
cprintf("%s",ch);
}
int DemChanThu(int A[10][100],int m,int n,int x,int y,int nx,int ny,int flag)
{
int demchan=1;
int tx=x+nx,ty=y+ny;
while ((A[ty][tx]!=flag || A[ty][tx]==0)&& ty>=0 && ty<n && tx>=0 && tx<m)
{
demchan++;
tx=tx+nx;
ty=ty+ny;
}
tx=x-nx,ty=y-ny;
while ((A[ty][tx]!=flag || A[ty][tx]==0)&& ty>=0 && ty<n && tx>=0 && tx<m)
{
demchan++;
tx=tx-nx;
ty=ty-ny;
}
return demchan;
}
int DemChanCong(int A[10][100],int m,int n,int x,int y,int nx,int ny,int flag)
{
int demchan=1;
int tx=x+nx,ty=y+ny;
while ((A[ty][tx]==flag || A[ty][tx]==0)&& ty>=0 && ty<n && tx>=0 && tx<m)
{
demchan++;
tx=tx+nx;
ty=ty+ny;
}
tx=x-nx,ty=y-ny;
while ((A[ty][tx]==flag || A[ty][tx]==0)&& ty>=0 && ty<n && tx>=0 && tx<m)
{
demchan++;
tx=tx-nx;
ty=ty-ny;
}
return demchan;
}
int DemThu(int A[10][100],int m,int n,int x,int y,int nx,int ny,int flag)
{
int dem=0;
int tx=x+nx,ty=y+ny;
while (A[ty][tx]!=flag && A[ty][tx]!=0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+2;
tx=tx+nx;
ty=ty+ny;
}
if (A[ty][tx]==0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+1;
}
tx=x-nx,ty=y-ny;
while (A[ty][tx]!=flag && A[ty][tx]!=0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+2;
tx=tx-nx;
ty=ty-ny;
}
if (A[ty][tx]==0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+1;
}
return dem;
}
int DemCong(int A[100][100],int m,int n,int x,int y,int nx,int ny,int flag)
{
int dem=0;
int tx=x+nx,ty=y+ny;
while (A[ty][tx]==flag && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+2;
tx=tx+nx;
ty=ty+ny;
}
if (A[ty][tx]==0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+1;
}
tx=x-nx,ty=y-ny;
while (A[ty][tx]==flag && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+2;
tx=tx-nx;
ty=ty-ny;
}
if (A[ty][tx]==0 && ty>=0 && ty<n && tx>=0 && tx<m)
{
dem=dem+1;
}
return dem;
}
float mu4(int n)
{
long T=1;
for (int i=1;i<n/2;i++)
{
T=T*4;
}
if (n%2!=0)
{
T=T*2;
}
return T;
}
float ValueThu(int A[100][100],int m,int n,int x,int y,int flag)
{
int dem;
long S;
dem=DemThu(A,m,n,x,y, 1, 0,flag);
if (DemChanThu(A,m,n,x,y, 1, 0,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=mu4(dem);
dem=DemThu(A,m,n,x,y, 0, 1,flag);
if (DemChanThu(A,m,n,x,y, 0, 1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
dem=DemThu(A,m,n,x,y, 1, 1,flag);
if (DemChanThu(A,m,n,x,y, 1, 1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
dem=DemThu(A,m,n,x,y, 1,-1,flag);
if (DemChanThu(A,m,n,x,y, 1, -1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
return S;
}
float ValueCong(int A[100][100],int m,int n,int x,int y,int flag)
{
int dem;
long S;
dem=DemCong(A,m,n,x,y, 1, 0,flag);
if (DemChanCong(A,m,n,x,y, 1, 0,flag)<25)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=mu4(dem);
dem=DemCong(A,m,n,x,y, 0, 1,flag);
if (DemChanCong(A,m,n,x,y, 0, 1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
dem=DemCong(A,m,n,x,y, 1, 1,flag);
if (DemChanCong(A,m,n,x,y, 1, 1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
dem=DemCong(A,m,n,x,y, 1,-1,flag);
if (DemChanCong(A,m,n,x,y, 1, -1,flag)<5)
{
dem=dem-4;
}
if (dem>=9)
{
dem=dem+4;
}
S=S+mu4(dem);
return S;
}
int CapDo(long A)
{
return int (log(A)/log(4));
}
void ComPlay(int A[100][100],int m,int n,int flag)
{
if (longpro==0)
{
int cx,cy;
int i,j;
int a=0;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (A[i][j]!=0)
{
if (j>m/2)
cx=j-1;
else
cx=j+1;
if (i>n/2)
cy=i-1;
else
cy=i+1;
A[cy][cx]=flag;
longpro=1;
a=1;
break;
}
if (a==1)
{
break;
}
}
}
if (a==0)
{
A[n/2-1][m/2-1]=flag;
longpro=1;
}
}
else
{
int Cx,Cy;
int i,j;
unsigned long Cv,Ctv;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (A[i][j]==0)
{
Cx=j;
Cy=i;
Cv=ValueCong(A,m,n,j,i,flag);
Ctv=ValueThu(A,m,n,j,i,flag);
break;
}
}
}
int Tx,Ty;
unsigned long Tv,Tcv;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (A[i][j]==0)
{
Tx=j;Ty=i;
Tv=ValueThu(A,m,n,j,i,flag);
Tcv=ValueCong(A,m,n,j,i,flag);
break;
}
}
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
if (A[i][j]==0)
{
unsigned long Nc=ValueCong(A,m,n,j,i,flag);
unsigned long Ntv=ValueThu(A,m,n,j,i,flag);
if(( CapDo(Cv)==CapDo(Nc) && CapDo(Ctv)<CapDo(Ntv) )||(Cv<Nc))
{
Cv=Nc;
Cx=j;
Cy=i;
Ctv=Ntv;
}
unsigned long Nt=ValueThu(A,m,n,j,i,flag);
unsigned long Ncv=ValueThu(A,m,n,j,i,flag);
if(( CapDo(Tv)==CapDo(Nt) && CapDo(Tcv)<CapDo(Ncv) )||(Tv<Nt))
{
Tv=Nt;
Tx=j;
Ty=i;
Tcv=Ncv;
}
}
}
}
if (CapDo(Tv)>CapDo(Cv))
{
A[Ty][Tx]=flag;
}
else
{
A[Cy][Cx]=flag;
}
}
}
void BanCo(int m,int n)
{
Writesxy(1,1,"Ú",7);
Writesxy(m*2+2,1,"Ä¿",7);
Writesxy(1,n+2,"À",7);
Writesxy(m*2+2,n+2,"ÄÙ",7);
for (int i=1;i<=m;i++)
{
Writesxy(i*2,1,"ÄÂ",7);
}
for (i=1;i<=m;i++)
{
Writesxy(i*2,n+2,"ÄÁ",7);
}
for (i=2;i<=n+1;i++)
{
Writesxy(1,i,"Ã",7);
}
for (i=2;i<=n+1;i++)
{
Writesxy(2*m+2,i,"Ä´",7);
}
for (i=1;i<=m;i++)
{
for (int j=2;j<=n+1;j++)
{
Writesxy(i*2,j,"ÄÅ",7);
}
}
gotoxy(1+m/2*2,1+(n/2));
}
/*
ÚÄÂÄ¿
ÃÄÅÄ´
ÀÄÁÄÙ
*/
void ManPlay(int A[100][100],int m,int n,int& x,int& y,char& ch)
{
do
{
gotoxy(x*2+3,y+2);
ch=getch();
switch (ch)
{
case 72:if (y>0) { y--;} break;
case
80:if (y<n-1) { y++;} break;
case 75:if (x>0) { x--;} break;
case 77:if (x<m-1) { x++;} break;
case 27:exit(0);break;
}
}
while ((ch!=32 || A[y][x]!=0) && ch!=27);
A[y][x]=2;
}
void ConCo(int A[100][100],int m,int n)
{
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
if (A[i][j]==1)
{
Writesxy(j*2+3,i+2,"O",12);
}
if (A[i][j]==2)
{
Writesxy(j*2+3,i+2,"X",14);
}
}
}
}
void main()
{
int m=30,n=20;
int x=m/2;
int y=n/2;
char ch;
int A[100][100]={0};
textmode(3);
clrscr();
BanCo(m,n);
do
{
ManPlay(A,m,n,x,y,ch);
ConCo(A,m,n);
ComPlay(A,m,n,1);
ConCo(A,m,n);
}
while (ch!=27);
getch();
}
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.