正文

中国象棋2012-07-30 23:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wyw628729/53688.html

分享到:

type      qp=array[0..9,1..9]of shortint;      const      es:array['a'..'i']of byte=(1,2,3,4,5,6,7,8,9);      se:array[ 1 .. 9 ]of char=('a','b','c','d','e','f','g','h','i');      ci:array['0'..'9']of byte=(0,1,2,3,4,5,6,7,8,9);      qz:array[ 1 ..14 ]of string[2]=('車','馬','炮','仕','相','兵','帅','车','马','泡','士','象','卒','将');      yqp:qp=(( 8, 9,12,11,14,11,12, 9, 8),              ( 0, 0, 0, 0, 0, 0, 0, 0, 0),              ( 0,10, 0, 0, 0, 0, 0,10, 0),              (13, 0,13, 0,13, 0,13, 0,13),              ( 0, 0, 0, 0, 0, 0, 0, 0, 0),              ( 0, 0, 0, 0, 0, 0, 0, 0, 0),              ( 6, 0, 6, 0, 6, 0, 6, 0, 6),              ( 0, 3, 0, 0, 0, 0, 0, 3, 0),              ( 0, 0, 0, 0, 0, 0, 0, 0, 0),              ( 1, 2, 5, 4, 7, 4, 5, 2, 1)); var     t,sx,sy,ex,ey,bushu:integer;     qipan:qp; procedure initqp(var a:qp); var i,j:integer; begin      fillchar(a,sizeof(a),0);      for i:=1 to 9 do      for j:=0 to 9 do      a[j,i]:=yqp[j,i]; end; procedure print(q:qp); var i,j:integer;     b:array[1..10,1..9]of string[2]; begin      for i:=1 to 6 do writeln;      writeln('中国象棋软件V1.2[ 王昱炜原创]');      writeln('红:帅仕相車馬炮兵');      writeln('黑:将士象车马泡卒');      writeln;      for i:=1 to 10 do      for j:=1 to 8 do      b[i,j]:='+-';      for i:=1 to 10 do      b[i,9]:='-+';      for i:=1 to 10 do      for j:=1 to 9 do      if q[i-1,j]>0 then b[i,j]:=qz[q[i-1,j]];      writeln('  a   b   c   d   e   f   g   h   i');      writeln('0 ',b[1,1],'--',b[1,2],'--',b[1,3],'--',b[1,4],'--',b[1,5],'--',b[1,6],'--',b[1,7],'--',b[1,8],'-',b[1,9]);      writeln('  |   |   |   | \ | / |   |   |   |');      writeln('1 ',b[2,1],'--',b[2,2],'--',b[2,3],'--',b[2,4],'--',b[2,5],'--',b[2,6],'--',b[2,7],'--',b[2,8],'-',b[2,9]);      writeln('  |   |   |   | / | \ |   |   |   |');      writeln('2 ',b[3,1],'--',b[3,2],'--',b[3,3],'--',b[3,4],'--',b[3,5],'--',b[3,6],'--',b[3,7],'--',b[3,8],'-',b[3,9]);      writeln('  |   |   |   |   |   |   |   |   |');      writeln('3 ',b[4,1],'--',b[4,2],'--',b[4,3],'--',b[4,4],'--',b[4,5],'--',b[4,6],'--',b[4,7],'--',b[4,8],'-',b[4,9]);      writeln('  |   |   |   |   |   |   |   |   |');      writeln('4 ',b[5,1],'--',b[5,2],'--',b[5,3],'--',b[5,4],'--',b[5,5],'--',b[5,6],'--',b[5,7],'--',b[5,8],'-',b[5,9]);      writeln('  |   楚河              汉界      |');      writeln('5 ',b[6,1],'--',b[6,2],'--',b[6,3],'--',b[6,4],'--',b[6,5],'--',b[6,6],'--',b[6,7],'--',b[6,8],'-',b[6,9]);      writeln('  |   |   |   |   |   |   |   |   |');      writeln('6 ',b[7,1],'--',b[7,2],'--',b[7,3],'--',b[7,4],'--',b[7,5],'--',b[7,6],'--',b[7,7],'--',b[7,8],'-',b[7,9]);      writeln('  |   |   |   |   |   |   |   |   |');      writeln('7 ',b[8,1],'--',b[8,2],'--',b[8,3],'--',b[8,4],'--',b[8,5],'--',b[8,6],'--',b[8,7],'--',b[8,8],'-',b[8,9]);      writeln('  |   |   |   | \ | / |   |   |   |');      writeln('8 ',b[9,1],'--',b[9,2],'--',b[9,3],'--',b[9,4],'--',b[9,5],'--',b[9,6],'--',b[9,7],'--',b[9,8],'-',b[9,9]);      writeln('  |   |   |   | / | \ |   |   |   |');      writeln('9 ',b[10,1],'--',b[10,2],'--',b[10,3],'--',b[10,4],'--',b[10,5],'--',b[10,6],'--',b[10,7],'--',b[10,8],'-',b[10,9]); end; function checkred(a:qp;const sx,sy,ex,ey:integer):boolean; var i,j,t:integer; begin      checkred:=true;      if not(a[sy,sx] in [1..7]) then begin checkred:=false;exit;end;      if a[ey,ex] in [1..7] then begin checkred:=false;exit;end;      if (ey=sy)and(ex=sx) then begin checkred:=false;exit;end;      case a[sy,sx] of      1:begin             if (ey=sy)or(ex=sx) then else begin checkred:=false;exit;end;             if sx=ex then             begin                  if ey>sy then                  begin                       for i:=sy+1 to ey-1 do                       if a[i,sx]>0 then begin checkred:=false;exit;end;                  end                  else if sy>ey then                  begin                       for i:=sy-1 downto ey+1 do                       if a[i,sx]>0 then begin checkred:=false;exit;end;                  end;             end             else             begin                  if ex>sx then                  begin                       for i:=sx+1 to ex-1 do                       if a[sy,i]>0 then begin checkred:=false;exit;end;                  end                  else if sx>ex then                  begin                       for i:=sx-1 downto ex+1 do                       if a[sy,i]>0 then begin checkred:=false;exit;end;                  end;             end;        end;      2:begin             i:=ey-sy;j:=ex-sx;             if ((abs(i)=1)and(abs(j)=2))or((abs(i)=2)and(abs(j)=1)) then                else begin checkred:=false;exit;end;             if (j=2) then             begin                  if a[sy,sx+1]>0 then begin checkred:=false;exit;end;             end             else if (j=-2) then             begin                  if a[sy,sx-1]>0 then begin checkred:=false;exit;end;             end             else if (i=2) then             begin                  if a[sy+1,sx]>0 then begin checkred:=false;exit;end;             end             else if (i=-2) then             begin                  if a[sy-1,sx]>0 then begin checkred:=false;exit;end;             end;        end;      3:begin             if (ey=sy)or(ex=sx) then else begin checkred:=false;exit;end;             if sx=ex then             begin                  if ey>sy then                  begin                       t:=0;                       for i:=sy+1 to ey-1 do                       if a[i,sx]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkred:=false;exit;end;                  end                  else if sy>ey then                  begin                       t:=0;                       for i:=sy-1 downto ey+1 do                       if a[i,sx]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkred:=false;exit;end;                  end;             end else             if sy=ey then             begin                  if ex>sx then                  begin                       t:=0;                       for i:=sx+1 to ex-1 do                       if a[sy,i]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkred:=false;exit;end;                  end                  else if sx>ex then                  begin                       t:=0;                       for i:=sx-1 downto ex+1 do                       if a[sy,i]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkred:=false;exit;end;                  end;             end;        end;      4:begin             i:=ey-sy;j:=ex-sx;             if (abs(i)=1)and(abs(j)=1) then else begin checkred:=false;exit;end;             if (ey in [7..9])and(ex in [4..6]) then else begin checkred:=false;exit;end;        end;      5:begin             i:=ey-sy;j:=ex-sx;             if (abs(i)=2)and(abs(j)=2) then else begin checkred:=false;exit;end;             if a[(ey+sy)div 2,(ex+sx)div 2]>0 then begin checkred:=false;exit;end;             if (ey in [9,7,5])and(ex in [1,3,5,7,9]) then else begin checkred:=false;exit;end;        end;      6:begin             i:=ey-sy;j:=ex-sx;             if (i=-1)and(j=0) then             else if (i=0)and(abs(j)=1)and(sy<5) then             else begin checkred:=false;exit;end;        end;      7:begin             i:=ey-sy;j:=ex-sx;             if ((abs(i)=1)and(j=0))or((abs(j)=1)and(i=0)) then             begin                  if (ey in [7..9])and(ex in [4..6]) then else begin checkred:=false;exit;end;             end             else             begin                   if a[ey,ex]<>14 then begin checkred:=false;exit;end;                   for i:=sy-1 downto ey+1 do if a[i,ex]>0 then begin checkred:=false;exit;end;             end;        end;      end; end; function checkblack(a:qp;sx,sy,ex,ey:integer):boolean; var i,j,t:integer; begin      checkblack:=true;      if not(a[sy,sx] in [8..14]) then begin checkblack:=false;exit;end;      if a[ey,ex] in [8..14] then begin checkblack:=false;exit;end;      if (ey=sy)and(ex=sx) then begin checkblack:=false;exit;end;      case a[sy,sx] of      8:begin             if (ey=sy)or(ex=sx) then else begin checkblack:=false;exit;end;             if sx=ex then             begin                  if ey>sy then                  begin                       for i:=sy+1 to ey-1 do                       if a[i,sx]>0 then begin checkblack:=false;exit;end;                  end                  else if sy>ey then                  begin                       for i:=sy-1 downto ey+1 do                       if a[i,sx]>0 then begin checkblack:=false;exit;end;                  end;             end             else             begin                  if ex>sx then                  begin                       for i:=sx+1 to ex-1 do                       if a[sy,i]>0 then begin checkblack:=false;exit;end;                  end                  else if sx>ex then                  begin                       for i:=sx-1 downto ex+1 do                       if a[sy,i]>0 then begin checkblack:=false;exit;end;                  end;             end;        end;      9:begin             i:=ey-sy;j:=ex-sx;             if ((abs(i)=1)and(abs(j)=2))or((abs(i)=2)and(abs(j)=1)) then                else begin checkblack:=false;exit;end;             if (j=2) then             begin                  if a[sy,sx+1]>0 then begin checkblack:=false;exit;end;             end             else if (j=-2) then             begin                  if a[sy,sx-1]>0 then begin checkblack:=false;exit;end;             end             else if (i=2) then             begin                  if a[sy+1,sx]>0 then begin checkblack:=false;exit;end;             end             else if (i=-2) then             begin                  if a[sy-1,sx]>0 then begin checkblack:=false;exit;end;             end;        end;      10:begin             if (ey=sy)or(ex=sx) then else begin checkblack:=false;exit;end;             if sx=ex then             begin                  if ey>sy then                  begin                       t:=0;                       for i:=sy+1 to ey-1 do                       if a[i,sx]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkblack:=false;exit;end;                  end                  else if sy>ey then                  begin                       t:=0;                       for i:=sy-1 downto ey+1 do                       if a[i,sx]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkblack:=false;exit;end;                  end;             end;             if sy=ey then             begin                  if ex>sx then                  begin                       t:=0;                       for i:=sx+1 to ex-1 do                       if a[sy,i]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkblack:=false;exit;end;                  end                  else if sx>ex then                  begin                       t:=0;                       for i:=sx-1 downto ex+1 do                       if a[sy,i]>0 then inc(t);                       if ((t=0)and(a[ey,ex]=0))or((t=1)and(a[ey,ex]>0)) then                          else begin checkblack:=false;exit;end;                  end;             end;        end;      11:begin             i:=ey-sy;j:=ex-sx;             if (abs(i)=1)and(abs(j)=1) then else begin checkblack:=false;exit;end;             if (ey in [0..2])and(ex in [4..6]) then else begin checkblack:=false;exit;end;        end;      12:begin             i:=ey-sy;j:=ex-sx;             if (abs(i)=2)and(abs(j)=2) then else begin checkblack:=false;exit;end;             if a[(ey+sy)div 2,(ex+sx)div 2]>0 then begin checkblack:=false;exit;end;             if (ey in [0,2,4])and(ex in [1,3,5,7,9]) then else begin checkblack:=false;exit;end;        end;      13:begin             i:=ey-sy;j:=ex-sx;             if (i=1)and(j=0) then             else if (i=0)and(abs(j)=1)and(sy>4) then             else begin checkblack:=false;exit;end;        end;      14:begin             i:=ey-sy;j:=ex-sx;             if ((abs(i)=1)and(j=0))or((abs(j)=1)and(i=0)) then             begin                  if (ey in [0..2])and(ex in [4..6]) then else begin checkblack:=false;exit;end;             end             else             begin                   if a[ey,ex]<>7 then begin checkblack:=false;exit;end;                   for i:=sy+1 to ey-1 do if a[i,ex]=0 then begin checkblack:=false;exit;end;             end;        end;      end; end; procedure getline(var c1,c2,c3,c4:integer); var st:string; begin      while true do      begin           writeln('请连着输入2个坐标(如e4e5,就是e4的军队移动到e5去)');           write('red:');           readln(st);           if not(st[1] in ['a'..'i']) then continue;           if not(st[2] in ['0'..'9']) then continue;           if not(st[3] in ['a'..'i']) then continue;           if not(st[4] in ['0'..'9']) then continue;           if copy(st,1,2)=copy(st,3,2) then continue;            c1:=es[st[1]];c2:=ci[st[2]];           c3:=es[st[3]];c4:=ci[st[4]];           if checkred(qipan,c1,c2,c3,c4) then break;      end; end; function fenzhi(q:qp):integer; var i,j,i1,j1:integer; begin      t:=0;      for i:=1 to 9 do      for j:=0 to 9 do      begin           if (q[j,i]=8)and(i in [2,4,6,8])and(bushu<30) then inc(t,10);           if (q[i,j]=8)and(j in [1,4,6,7]) then inc(t,10);           if (q[i,j]=8)and(j=3) then dec(t,5);           if (q[j,i]=yqp[j,i])and(q[j,i] in [8..14])and(bushu<50) then dec(t,2);           if (q[j,i] in [8..10,13])and(j>5)and(bushu>10) then inc(t,(14-q[j,i]));           if (q[j,i]=13)and(q[j+2,i]=6)and(q[j+3,i]=2) then inc(t,10);           if (q[j,i]=13)and(q[j-2,i]=9)and(q[j+2,i]=6) then inc(t,10);           if (q[j,i]=8)and(j=1)and(i=5) then dec(t,40);           case q[j,i] of                1:dec(t,100);                2:if bushu<30 then dec(t,40) else dec(t,50);                3:if bushu<50 then dec(t,50) else dec(t,40);                4,5:dec(t,20);                6:if bushu<50 then dec(t,10)                    else if (j>5)or(j=0) then dec(t,20)                        else dec(t,30);                7:dec(t,10000);                8:inc(t,100);                9:if bushu<30 then inc(t,40) else inc(t,50);                10:if bushu<50 then inc(t,50) else inc(t,40);                11,12:inc(t,20);                13:if bushu<50 then inc(t,10)                    else if (j>5)or(j=0) then inc(t,20)                        else inc(t,30);                14:inc(t,10000);           end;      end;      if q[1,5] in[8,9,10,14] then dec(t,10);      if (bushu<50)and(q[0,5]<>14) then dec(t,18);      if (q[3,5]=3)and checkred(q,5,3,5,1) and (bushu<50) then dec(t,30);      if (q[4,5]=3)and checkred(q,5,4,5,1) and (bushu<50) then dec(t,30);      if (q[5,5]=3)and checkred(q,5,5,5,1) and (bushu<50) then dec(t,30);      if (q[6,5]=3)and checkred(q,5,6,5,1) and (bushu<50) then dec(t,30);      if (q[7,5]=3)and checkred(q,5,7,5,1) and (bushu<50) then dec(t,30);      if (q[2,1]=12) then dec(t,18);      if (q[2,9]=12) then dec(t,18);      if (q[2,5]=12) then inc(t,10);      if (q[2,5] in [1..9,10..13,14])and(q[4,5]=13)and(q[7,5] in [0,3]) then dec(t,10);      if (bushu<10)and(q[2,5]=10) then inc(t,15);      if (q[0,1]=8) then dec(t,25);      if (q[0,9]=8) then dec(t,25);      if (q[0,2]=9) then dec(t,24);      if (q[0,8]=9) then dec(t,24);      if (q[2,1]=9)and(q[2,9]=9) then dec(t,10);      if (q[2,1]=9)and(q[2,7]<>9) then dec(t,10);      if (q[2,9]=9)and(q[2,3]<>9) then dec(t,10);      if (q[1,9]=9)or(q[1,1]=9) then dec(t,15);      if (q[6,3]=9)or(q[6,7]=0) then inc(t,20);      fenzhi:=t; end; function panfen(q:qp;dep:integer):integer; var    qi1,qi2,hqi:qp;    i1,i2,i3,i4,j1,j2,j3,j4,t,t1,t2:integer; begin      if dep=0 then      begin           panfen:=fenzhi(q);           exit;      end;      t:=-32768;      for i1:=1 to 9 do      for i2:=0 to 9 do      if q[i2,i1] in [8..14] then      for i3:=1 to 9 do      for i4:=0 to 9 do      if checkblack(q,i1,i2,i3,i4) then      begin           qi1:=q;           qi1[i4,i3]:=qi1[i2,i1];           qi1[i2,i1]:=0;           t1:=32767;           for j1:=1 to 9 do           for j2:=0 to 9 do           if q[j2,j1] in [1..7] then           for j3:=1 to 9 do           for j4:=0 to 9 do           if checkred(qi1,j1,j2,j3,j4) then           begin                qi2:=qi1;                qi2[j4,j3]:=qi2[j2,j1];                qi2[j2,j1]:=0;                t2:=panfen(qi2,0);                if t2<=t1 then begin t1:=t2;hqi:=qi2;end;           end;           if t1<-5000 then continue;           t1:=panfen(hqi,dep-1);           if t1>t then           begin                t:=t1;           end;      end;      panfen:=t; end; procedure searchblack(q:qp;var c1,c2,c3,c4:integer); var    qi1,qi2,hqi:qp;    i1,i2,i3,i4,j1,j2,j3,j4,t,h1,h2,h3,h4,t1,t2:integer; begin      t:=-32768;      for i1:=1 to 9 do      for i2:=0 to 9 do      if q[i2,i1] in [8..14] then      for i3:=1 to 9 do      for i4:=0 to 9 do      if checkblack(q,i1,i2,i3,i4) then      begin           qi1:=q;           qi1[i4,i3]:=qi1[i2,i1];           qi1[i2,i1]:=0;           if fenzhi(qi1)>5000 then begin  c1:=i1;c2:=i2;c3:=i3;c4:=i4;exit;end;           t1:=32767;           for j1:=1 to 9 do           for j2:=0 to 9 do           if q[j2,j1] in [1..7] then           for j3:=1 to 9 do           for j4:=0 to 9 do           if checkred(qi1,j1,j2,j3,j4) then           begin                qi2:=qi1;                qi2[j4,j3]:=qi2[j2,j1];                qi2[j2,j1]:=0;                t2:=panfen(qi2,0);                if t2<=t1 then begin t1:=t2;hqi:=qi2;end;           end;           if t1<-5000 then continue;           t1:=panfen(hqi,1);           if t1>t then           begin                t:=t1;h1:=i1;h2:=i2;h3:=i3;h4:=i4;           end;      end;      c1:=h1;c2:=h2;c3:=h3;c4:=h4; end; begin      initqp(qipan);      print(qipan);bushu:=1;      while true do      begin           getline(sx,sy,ex,ey);           qipan[ey,ex]:=qipan[sy,sx];qipan[sy,sx]:=0;           writeln('busy...');           searchblack(qipan,sx,sy,ex,ey);           writeln('black:',se[sx],sy,se[ex],ey);           qipan[ey,ex]:=qipan[sy,sx];qipan[sy,sx]:=0;           inc(bushu,2);           print(qipan);      end;      writeln;      writeln('本程序为王昱炜所创作,任何人盗版必究!');      readln; end.

阅读(1269) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册