sunnytoy 大约5小时前 平静 的说 无奈呀   ㄣ苐②噤區℡ 大约7小时前 思念 的说 情何以堪啊~   鲍豪斯 大约9小时前 平静 的说 提醒您注意保暖…   jacky200247 大约9小时前 平静 的说 对不起,我不想再这样等下去了。   无耻之兔 大约14小时前 生气 的说 机电又分钱了   丰之痛 大约18小时前 高兴 的说 今天又想去打篮球了!!!!   丰之痛 12月2日 郁闷 的说 机电那伙人太火了..........   看海的日子 12月2日 平静 的说 输入要叽歪的内容_   穿拖鞋的兔子 12月1日 平静 的说 翘课   沙漠★寂寞 11月30日 平静 的说 机电那伙人又开始分钱了,刚刚又赚了很,见者有份,速度去抢!!!   [查看全部 454 条唧唧歪歪...]


打印

[C/C++] C语言的中国象棋,有兴趣的去研究

C语言的中国象棋,有兴趣的去研究

/*--------------------chess.c----------------------*/
#include "dos.h"
#include "stdio.h"
/*----------------------------------------------------*/
#define RED 7
#define BLACK 14
#define true 1
#define false 0
#define SELECT 0
#define MOVE 1
#define RED_UP 0x1100
#define RED_DOWN 0x1f00
#define RED_LEFT 0x1e00
#define RED_RIGHT 0x2000
#define RED_DO 0x3900
#define RED_UNDO 0x1000

#define BLACK_UP 0x4800
#define BLACK_DOWN 0x5000
#define BLACK_LEFT 0x4b00
#define BLACK_RIGHT 0x4d00
#define BLACK_DO 0x1c00
#define BLACK_UNDO 0x2b00

#define ESCAPE 0x0100

#define RED_JU 1
#define RED_MA 2
#define RED_XIANG 3
#define RED_SHI 4
#define RED_JIANG 5
#define RED_PAO 6
#define RED_BIN 7

#define BLACK_JU 8
#define BLACK_MA 9
#define BLACK_XIANG 10
#define BLACK_SHI 11
#define BLACK_JIANG 12
#define BLACK_PAO 13
#define BLACK_BIN 14
/*----------------------------------------------------*/
int firsttime=1;
int savemode;
char page_new=0,page_old=0;
int finish=false,turn=BLACK,winner=0;
int key;
int redstate=SELECT,blackstate=SELECT;
int board[10][9];
/*----------------------------------------------------*/
char *chessfile[15]={"",
        "bmp\\rju.wfb",        "bmp\\rma.wfb",        "bmp\\rxiang.wfb","bmp\\rshi.wfb",
        "bmp\\rjiang.wfb","bmp\\rpao.wfb","bmp\\rbin.wfb",
        "bmp\\bju.wfb",        "bmp\\bma.wfb",        "bmp\\bxiang.wfb","bmp\\bshi.wfb",
        "bmp\\bjiang.wfb","bmp\\bpao.wfb","bmp\\bbin.wfb"
};
char *boardfile[10][9]={
  {"bmp\\11.wfb","bmp\\1t.wfb","bmp\\1t.wfb","bmp\\14.wfb","bmp\\15.wfb","bmp\\16.wfb","bmp\\1t.wfb","bmp\\1t.wfb","bmp\\19.wfb"},
  {"bmp\\21.wfb","bmp\\2c.wfb","bmp\\2c.wfb","bmp\\24.wfb","bmp\\25.wfb","bmp\\26.wfb","bmp\\2c.wfb","bmp\\2c.wfb","bmp\\29.wfb"},
  {"bmp\\21.wfb","bmp\\3a.wfb","bmp\\3t.wfb","bmp\\34.wfb","bmp\\3t.wfb","bmp\\36.wfb","bmp\\3t.wfb","bmp\\3a.wfb","bmp\\29.wfb"},
  {"bmp\\41.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\49.wfb"},
  {"bmp\\51.wfb","bmp\\52.wfb","bmp\\5t.wfb","bmp\\54.wfb","bmp\\5t.wfb","bmp\\56.wfb","bmp\\5t.wfb","bmp\\58.wfb","bmp\\59.wfb"},
  {"bmp\\61.wfb","bmp\\62.wfb","bmp\\6t.wfb","bmp\\64.wfb","bmp\\6t.wfb","bmp\\66.wfb","bmp\\6t.wfb","bmp\\68.wfb","bmp\\69.wfb"},
  {"bmp\\71.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\79.wfb"},
  {"bmp\\81.wfb","bmp\\8a.wfb","bmp\\8t.wfb","bmp\\84.wfb","bmp\\85.wfb","bmp\\86.wfb","bmp\\8t.wfb","bmp\\8a.wfb","bmp\\89.wfb"},
  {"bmp\\91.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\95.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\99.wfb"},
  {"bmp\\101.wfb","bmp\\102.wfb","bmp\\102.wfb","bmp\\104.wfb","bmp\\105.wfb","bmp\\106.wfb","bmp\\108.wfb","bmp\\108.wfb","bmp\\109.wfb"}
};

char cursor[14][14]={
        0,0,0,0,0,0,0,0,0,0,0,0,1,1,
        0,0,0,0,0,0,0,0,0,0,0,1,1,1,
        0,255,255,255,255,255,255,255,0,0,1,1,1,1,
        0,255,255,255,255,255,255,0,0,1,1,1,1,1,
        0,255,255,255,255,255,255,0,0,1,1,1,1,1,
        0,255,255,255,255,255,255,255,0,0,1,1,1,1,
        0,255,255,255,255,255,255,255,255,0,0,1,1,1,
        0,255,255,255,255,255,255,255,255,255,0,0,1,1,
        0,255,255,0,255,255,255,255,255,255,255,0,0,1,
        0,255,0,1,1,0,255,255,255,255,255,255,255,0,
        0,0,1,1,1,1,0,255,255,255,255,255,0,1,
        0,1,1,1,1,1,1,0,255,255,255,0,1,1,
        1,1,1,1,1,1,1,1,0,255,0,1,1,1,
        1,1,1,1,1,1,1,1,1,0,1,1,1,1
};



struct pos{
  int x;
  int y;
}position[10][9],redcurpos,redtemppos,redoldpos,blackcurpos,blacktemppos,blackoldpos;
/*----------------------------------------------------*/
selectpage(register char page) /*换页函数*/
{
  union REGS r;
  r.x.ax=0x4f05;
  r.x.bx=0;
  r.x.dx=page; /*选择页面*/
  int86(0x10,&r,&r);
}
unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/
{
  union REGS r;
  r.x.ax=0x4f02;
  r.x.bx=vmode;
  int86(0x10,&r,&r);
  return(r.h.ah);
}
unsigned int get_SVGA_mode() /*获取当前SVGA屏幕模式*/
{
  union REGS r;
  r.x.ax=0x4f03;
  int86(0x10,&r,&r);
  return(r.x.bx);
}
drawbmp(int start_x,int start_y,char filename[])
{
  char buffer[640];
  int i,j,k,n,r,g,b,width,length;
  long position;
  FILE *fp;

  if((fp=fopen(filename,"rb"))==NULL)
  {
    printf("Error! Can't open file!");
    getch();
    return;
  }

  fseek(fp,28,SEEK_SET);
  fread(&i,2,1,fp);
  if(i!=8) /*检查是否为256色位图*/
  {
    puts("Error!Can't find bitmap!");
    fclose(fp);
    getch();
    exit(0);
  }
  fseek(fp,18,SEEK_SET);
  fread(&width,4,1,fp);
  fread(&length,4,1,fp);
  if(firsttime)
  {
    fseek(fp,54,SEEK_SET);
    for(i=0;i<256;i++) /*按照该图片的DAC色表设置色彩寄存器*/
    {
      b=fgetc(fp);g=fgetc(fp);r=fgetc(fp); /*获取R、G、B分量*/
      outportb(0x3c8,i);
      outportb(0x3c9,r>>2); /*右移是要转化为VGA的6位寄存器形式*/
      outportb(0x3c9,g>>2);
      outportb(0x3c9,b>>2);
      fgetc(fp);
    }
  }
  else
    fseek(fp,300,SEEK_SET);
  k=(width%4)?(4-width%4):0; /*宽度修正值*/
  for(j=length-1+start_x;j>=start_x;j--)
  {
    fread(buffer,width,1,fp);
    for(i=start_y,n=0;i<width+start_y;i++,n++)
    {
      position=j*640l+i; /*计算要显示点的显存位置*/
      page_new=position/65536; /*计算显示页*/
      if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
      {selectpage(page_new);page_old=page_new;}
      pokeb(0xa000,position%65536,buffer[n]); /*写到显存位置*/
    }
    fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度*/
  }
  fclose(fp);

}

init()
{
  savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/
  set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为640*480 256色模式*/
}

end()
{
   set_SVGA_mode(savemode); /*恢复屏幕*/
}
/*----------------------------------------------------*/
initpos()
{
   int i,j;
   for(i=0;i<10;i++)
     for (j=0;j<9;j++)
     {
       position[j].x=35+i*39;
       position[j].y=43+j*40;
     }
}
initchessmap()
{
  board[0][0]=BLACK_JU;
  board[0][1]=BLACK_MA;
  board[0][2]=BLACK_XIANG;
  board[0][3]=BLACK_SHI;
  board[0][4]=BLACK_JIANG;
  board[0][5]=BLACK_SHI;
  board[0][6]=BLACK_XIANG;
  board[0][7]=BLACK_MA;
  board[0][8]=BLACK_JU;
  board[2][1]=BLACK_PAO;
  board[2][7]=BLACK_PAO;
  board[3][0]=BLACK_BIN;
  board[3][2]=BLACK_BIN;
  board[3][4]=BLACK_BIN;
  board[3][6]=BLACK_BIN;
  board[3][8]=BLACK_BIN;

  board[9][0]=RED_JU;
  board[9][1]=RED_MA;
  board[9][2]=RED_XIANG;
  board[9][3]=RED_SHI;
  board[9][4]=RED_JIANG;
  board[9][5]=RED_SHI;
  board[9][6]=RED_XIANG;
  board[9][7]=RED_MA;
  board[9][8]=RED_JU;
  board[7][1]=RED_PAO;
  board[7][7]=RED_PAO;
  board[6][0]=RED_BIN;
  board[6][2]=RED_BIN;
  board[6][4]=RED_BIN;
  board[6][6]=RED_BIN;
  board[6][8]=RED_BIN;
}
initdrawchess()
{
  int i,j;;
  for(i=0;i<10;i++)
    for(j=0;j<9;j++)
    {
      if(board[j])
        drawbmp(position[j].x,position[j].y,chessfile[board[j]]);
    }
}

drawcursor(struct pos p)
{
  int i,j,n,m,x,y;
  long thisposition;
  x=position[p.x][p.y].x+20;
  y=position[p.x][p.y].y+25;
  for(j=13-1+x,m=13;j>=x;j--,m--)
  {
    for(i=y,n=0;i<13+y;i++,n++)
    {
      thisposition=j*640l+i; /*计算要显示点的显存位置*/
      page_new=thisposition/65536; /*计算显示页*/
      if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
        {selectpage(page_new);page_old=page_new;}
      if(cursor[m][n]!=1)
        if(cursor[m][n]==0)
          pokeb(0xa000,thisposition%65536,0);
        else
          if(turn==RED)
            pokeb(0xa000,thisposition%65536,153);
          else
            pokeb(0xa000,thisposition%65536,255);
    }
  }
}

drawselecursor(struct pos p)
{
  int i,j,n,m,x,y;
  long thisposition;
  x=position[p.x][p.y].x+20;
  y=position[p.x][p.y].y+25;
  for(j=13-1+x,m=13;j>=x;j--,m--)
  {
    for(i=y,n=0;i<13+y;i++,n++)
    {
      thisposition=j*640l+i; /*计算要显示点的显存位置*/
      page_new=thisposition/65536; /*计算显示页*/
      if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
        {selectpage(page_new);page_old=page_new;}
      if(cursor[m][n]!=1)
        pokeb(0xa000,thisposition%65536,0);
    }
  }
}
/*----------------------------------------------------*/
int getkey()
{
int press;

while(bioskey(1) == 0);
press=bioskey(0);
press=press&0xff00;
return(press);
}
/*--------------------红方操作--------------------*/
int redcanselect()
{
  int x,y;
  x=redcurpos.x;
  y=redcurpos.y;
  if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)
    return 1;
  else
    return 0;
}
int redcanmove()
{
  int i,j,min,max,oldx,oldy,x,y;
  oldx=redoldpos.x;
  oldy=redoldpos.y;
  x=redcurpos.x;
  y=redcurpos.y;
/*case1  目标位置是否是自己人*/  
  if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)
    return 0;
/*  军、马、炮、相、士、将、卒的走法正确性的判断*/
  switch(board[oldx][oldy])
  {
    case RED_BIN:                                 /*完成*/
         if(oldx>=5)
         { if(y!=oldy||(oldx-x)!=1) return 0;}
         else
         { if(x==(oldx-1)&&y==oldy) return 1;
           else
           if(x==oldx&&y==(oldy+1)) return 1;
           else
           if(x==oldx&&y==(oldy-1)) return 1;
           else
           return 0;
         }
         break;
    case RED_JIANG:                              /*完成*/
         if(x!=oldx&&y!=oldy) return 0;
         if(x!=oldx)
           if((x-oldx)>1||(oldx-x)>1) return 0;
           else if(x<7) return 0;  
         else if(y!=oldy)
           if((y-oldy)>1||(oldy-y)>1) return 0;
           else if(y<3||y>5) return 0;
         break;
   
    case RED_JU:                                 /*完成*/
         if(x!=oldx&&y!=oldy) return 0;
         else if(x!=oldx)
           { min=(x>oldx)?oldx:x;
             max=(x>oldx)?x:oldx;
               for(i=min+1;i<max;i++)
                 if(board[y]!=0) return 0;
           }
         else if(y!=oldy)
           { min=(y>oldy)?oldy:y;
             max=(y>oldy)?y:oldy;
               for(i=min+1;i<max;i++)
                 if(board[x]!=0) return 0;
           }
         break;
    case RED_MA:                                 /*完成*/
         if((x-oldx)==2&&((y-oldy)==1||(oldy-y)==1))
         {
           if(board[oldx+1][oldy]!=0) return 0;
         }else
         if((oldx-x)==2&&((y-oldy)==1||(oldy-y)==1))
         {
           if(board[oldx-1][oldy]!=0) return 0;
         }else
         if((y-oldy)==2&&((x-oldx)==1||(oldx-x)==1))
         {
           if(board[oldx][oldy+1]!=0) return 0;
         }else
         if((oldy-y)==2&&((x-oldx)==1||(oldx-x)==1))
         {
           if(board[oldx][oldy-1]!=0) return 0;
         }else
           return 0;
         break;
     case RED_PAO:                                  /*完成*/
         if(x!=oldx&&y!=oldy) return 0;
         if(board[x][y]==0)
           {
             if(x!=oldx)
             { min=(x>oldx)?oldx:x;
               max=(x>oldx)?x:oldx;
               for(i=min+1;i<max;i++)
                 if(board[y]!=0) return 0;
             }
             else if(y!=oldy)
             { min=(y>oldy)?oldy:y;
               max=(y>oldy)?y:oldy;
               for(i=min+1;i<max;i++)
                 if(board[x]!=0) return 0;
             }
           }
         else
           {
             if(x!=oldx)
             { min=(x>oldx)?oldx:x;
               max=(x>oldx)?x:oldx;
               for(i=min+1,j=0;i<max;i++)
                 if(board[y]!=0) j++;
               if(j!=1) return 0;
             }
             else if(y!=oldy)
             { min=(y>oldy)?oldy:y;
               max=(y>oldy)?y:oldy;
               for(i=min+1,j=0;i<max;i++)
                 if(board[x]!=0) j++;
               if(j!=1) return 0;
             }         
           }
         break;
    case RED_SHI:                                    /*完成*/
         if(oldx==9||oldx==7)
         {if(x!=8||y!=4) return 0;}
         else if(oldx==8)
         {if(x==9&&y==3) return 1;
          else
          if(x==9&&y==5) return 1;
          else
          if(x==7&&y==3) return 1;
          else
          if(x==7&&y==5) return 1;
          else return 0;
         }else return 0;
         break;
    case RED_XIANG:                                   /*完成*/
         if(x<5) return 0;
         if(x!=oldx&&y!=oldy)
         {
           if((x-oldx)==2&&(y-oldy)==2)
             {i=oldx+1;j=oldy+1;}
           else if((x-oldx)==2&&(oldy-y)==2)
             {i=oldx+1;j=oldy-1;}
           else if((oldx-x)==2&&(y-oldy)==2)
             {i=oldx-1;j=oldy+1;}
           else if((oldx-x)==2&&(oldy-y)==2)
             {i=oldx-1;j=oldy-1;}
           else return 0;
           if(board[j]!=0) return 0;     
         }
         else return 0;
         break;
  }
  return 1;
}

TOP

redup()
{
  int x,y,n;
  if(redcurpos.x>0)
  {
      redcurpos.x--;
      x=position[redtemppos.x][redtemppos.y].x;
      y=position[redtemppos.x][redtemppos.y].y;
      if(board[redtemppos.x][redtemppos.y]==0)
        drawbmp(x,y,boardfile[redtemppos.x][redtemppos.y]);
      else if(!(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE))
      {
        n=board[redtemppos.x][redtemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE)
        drawselecursor(redoldpos);
      drawcursor(redcurpos);
      redtemppos.x=redcurpos.x;
      redtemppos.y=redcurpos.y;
   
  }

}

reddown()
{
  int x,y,n;
  if(redcurpos.x<9)
  {
    redcurpos.x++;
      x=position[redtemppos.x][redtemppos.y].x;
      y=position[redtemppos.x][redtemppos.y].y;
      if(board[redtemppos.x][redtemppos.y]==0)
        drawbmp(x,y,boardfile[redtemppos.x][redtemppos.y]);
      else if(!(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE))
      {
        n=board[redtemppos.x][redtemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE)
        drawselecursor(redoldpos);
      
      drawcursor(redcurpos);
      redtemppos.x=redcurpos.x;
      redtemppos.y=redcurpos.y;
  }
}

redleft()
{
  int x,y,n;
  if(redcurpos.y>0)
  {
    redcurpos.y--;
      x=position[redtemppos.x][redtemppos.y].x;
      y=position[redtemppos.x][redtemppos.y].y;
      if(board[redtemppos.x][redtemppos.y]==0)
        drawbmp(x,y,boardfile[redtemppos.x][redtemppos.y]);
      else if(!(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE))
      {
        n=board[redtemppos.x][redtemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE)
        drawselecursor(redoldpos);

      drawcursor(redcurpos);
      redtemppos.x=redcurpos.x;
      redtemppos.y=redcurpos.y;
  }
}
redright()
{

  int x,y,n;
  if(redcurpos.y<8)
  {
    redcurpos.y++;
      x=position[redtemppos.x][redtemppos.y].x;
      y=position[redtemppos.x][redtemppos.y].y;
       if(board[redtemppos.x][redtemppos.y]==0)
        drawbmp(x,y,boardfile[redtemppos.x][redtemppos.y]);
      else if(!(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE))
      {
        n=board[redtemppos.x][redtemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(redtemppos.x==redoldpos.x&&redtemppos.y==redoldpos.y&&redstate==MOVE)
        drawselecursor(redoldpos);
      
      drawcursor(redcurpos);
      redtemppos.x=redcurpos.x;
      redtemppos.y=redcurpos.y;
  }
}

reddo()
{
  int i,j,x,y,n;
  if(redstate==SELECT&&redcanselect())
  {
    if(board[redcurpos.x][redcurpos.y]<=RED&&board[redcurpos.x][redcurpos.y]>0)
    {
      redstate=MOVE;
      drawselecursor(redcurpos);
      redoldpos.x=redcurpos.x;
      redoldpos.y=redcurpos.y;
    }
  }
  else if(redstate==MOVE&&redcanmove())
  {
    x=position[redoldpos.x][redoldpos.y].x;
    y=position[redoldpos.x][redoldpos.y].y;
    drawbmp(x,y,boardfile[redoldpos.x][redoldpos.y]);

    x=position[redcurpos.x][redcurpos.y].x;
    y=position[redcurpos.x][redcurpos.y].y;
    n=board[redoldpos.x][redoldpos.y];
    drawbmp(x,y,chessfile[n]);

    if(board[redcurpos.x][redcurpos.y]==BLACK_JIANG)
    {
      winner=RED;
      finish=1;
      return;
    }
   
    board[redcurpos.x][redcurpos.y]=n;
    board[redoldpos.x][redoldpos.y]=0;
   
    for(i=0;i<=2;i++)
      for(j=3;j<=5;j++)
        if(board[j]==BLACK_JIANG)
          {x=i;y=j;}
    for(i=x+1,j=y,n=0;i<=9;i++)
    {
      if(board[j]==RED_JIANG&&n==0)
      {winner=BLACK;finish=1;break;}
      else if(board[j]!=0) n++;
    }
    turn=BLACK;
    blackstate=SELECT;
    drawcursor(blackcurpos);
    drawbmp(30,438,\"bmp\\\\bzq.wfb\");           /*转交控制权给黑方*/
  }
}

redundo()
{
  int x,y,n;
  if(redstate==MOVE)
  {
    x=position[redoldpos.x][redoldpos.y].x;
    y=position[redoldpos.x][redoldpos.y].y;
    n=board[redoldpos.x][redoldpos.y];
    drawbmp(x,y,chessfile[n]);
    redoldpos.x=redcurpos.x;
    redoldpos.y=redcurpos.y;
    drawcursor(redcurpos);
    redstate=SELECT;
  }
}
/*--------------------黑方操作----------------------*/
int blackcanselect()
{
  int x,y;
  x=blackcurpos.x;
  y=blackcurpos.y;
  if(board[x][y]>=BLACK_JU&&board[x][y]<=BLACK_BIN)
    return 1;
  else
    return 0;
}
int blackcanmove()
{
  int i,j,min,max,oldx,oldy,x,y;
  oldx=blackoldpos.x;
  oldy=blackoldpos.y;
  x=blackcurpos.x;
  y=blackcurpos.y;
/*case1  目标位置是否是自己人*/  
  if(board[x][y]>=BLACK_JU&&board[x][y]<=BLACK_BIN)
    return 0;
  /*  军、马、炮、相、士、将、卒的走法正确性的判断*/
  switch(board[oldx][oldy])
  {
    case BLACK_JU:                              /*完成*/
         if(x!=oldx&&y!=oldy) return 0;
         else if(x!=oldx)
           { min=(x>oldx)?oldx:x;
             max=(x>oldx)?x:oldx;
               for(i=min+1;i<max;i++)
                 if(board[y]!=0) return 0;
           }
         else if(y!=oldy)
           { min=(y>oldy)?oldy:y;
             max=(y>oldy)?y:oldy;
               for(i=min+1;i<max;i++)
                 if(board[x]!=0) return 0;
           }
         break;
    case BLACK_MA:                             /*完成*/
         if((x-oldx)==2&&((y-oldy)==1||(oldy-y)==1))
         {
           if(board[oldx+1][oldy]!=0) return 0;
         }else
         if((oldx-x)==2&&((y-oldy)==1||(oldy-y)==1))
         {
           if(board[oldx-1][oldy]!=0) return 0;
         }else
         if((y-oldy)==2&&((x-oldx)==1||(oldx-x)==1))
         {
           if(board[oldx][oldy+1]!=0) return 0;
         }else
         if((oldy-y)==2&&((x-oldx)==1||(oldx-x)==1))
         {
           if(board[oldx][oldy-1]!=0) return 0;
         }else
           return 0;
         break;
    case BLACK_PAO:                        /*完成*/
         if(x!=oldx&&y!=oldy) return 0;
         if(board[x][y]==0)
           {
             if(x!=oldx)
             { min=(x>oldx)?oldx:x;
               max=(x>oldx)?x:oldx;
               for(i=min+1;i<max;i++)
                 if(board[y]!=0) return 0;
             }
             else if(y!=oldy)
             { min=(y>oldy)?oldy:y;
               max=(y>oldy)?y:oldy;
               for(i=min+1;i<max;i++)
                 if(board[x]!=0) return 0;
             }         
           }
           else
           {
             j=0;
             if(x!=oldx)
             { min=(x>oldx)?oldx:x;
               max=(x>oldx)?x:oldx;
               for(i=min+1;i<max;i++)
                 if(board[y]!=0) j++;
               if(j!=1) return 0;
             }
             else if(y!=oldy)
             { min=(y>oldy)?oldy:y;
               max=(y>oldy)?y:oldy;
               for(i=min+1;i<max;i++)
                 if(board[x]!=0) j++;
               if(j!=1) return 0;
             }         
           }
         break;


    case BLACK_XIANG:
         if(x>4) return 0;
         if(x!=oldx&&y!=oldy)
         {
           if((x-oldx)==2&&(y-oldy)==2)
             {i=oldx+1;j=oldy+1;}
           else if((x-oldx)==2&&(oldy-y)==2)
             {i=oldx+1;j=oldy-1;}
           else if((oldx-x)==2&&(y-oldy)==2)
             {i=oldx-1;j=oldy+1;}
           else if((oldx-x)==2&&(oldy-y)==2)
             {i=oldx-1;j=oldy-1;}
           else return 0;
           if(board[j]!=0) return 0;     
         }
         else return 0;
         break;

    case BLACK_SHI:
         if(oldx==0||oldx==2)
         {if(x!=1||y!=4) return 0;}
         else if(oldx==1)
         {if(x==0&&y==3) return 1;
          else
          if(x==0&&y==5) return 1;
          else
          if(x==2&&y==3) return 1;
          else
          if(x==2&&y==5) return 1;
          else return 0;
         }else return 0;
         break;
        
    case BLACK_JIANG:
         if(x!=oldx&&y!=oldy) return 0;
         if(x!=oldx)
           if((x-oldx)>1||(oldx-x)>1) return 0;
           else if(x>2) return 0;  
         else if(y!=oldy)
           if((y-oldy)>1||(oldy-y)>1) return 0;
           else if(y<3||y>5) return 0;
         break;

    case BLACK_BIN:
         if(oldx<=4)
         { if(y!=oldy||(x-oldx)!=1) return 0;}
         else
         { if(x==(oldx+1)&&y==oldy) return 1;
           else
           if(x==oldx&&y==(oldy+1)) return 1;
           else
           if(x==oldx&&y==(oldy-1)) return 1;
           else
           return 0;
         }
         break;
  }
  return 1;
}
blackup()
{
  int x,y,n;
  if(blackcurpos.x>0)
  {
    blackcurpos.x--;
      x=position[blacktemppos.x][blacktemppos.y].x;
      y=position[blacktemppos.x][blacktemppos.y].y;
      if(board[blacktemppos.x][blacktemppos.y]==0)
        drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
      else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
      {
        n=board[blacktemppos.x][blacktemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
        drawselecursor(blackoldpos);
      drawcursor(blackcurpos);
      blacktemppos.x=blackcurpos.x;
      blacktemppos.y=blackcurpos.y;
  }
}

blackdown()
{
  int x,y,n;
  if(blackcurpos.x<9)
  {
    blackcurpos.x++;
      x=position[blacktemppos.x][blacktemppos.y].x;
      y=position[blacktemppos.x][blacktemppos.y].y;
      if(board[blacktemppos.x][blacktemppos.y]==0)
        drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
      else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
      {
        n=board[blacktemppos.x][blacktemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
        drawselecursor(blackoldpos);
      drawcursor(blackcurpos);
      blacktemppos.x=blackcurpos.x;
      blacktemppos.y=blackcurpos.y;
  }
}

blackleft()
{
  int x,y,n;
  if(blackcurpos.y>0)
  {
    blackcurpos.y--;
   
      x=position[blacktemppos.x][blacktemppos.y].x;
      y=position[blacktemppos.x][blacktemppos.y].y;
      if(board[blacktemppos.x][blacktemppos.y]==0)
        drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
      else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
      {
        n=board[blacktemppos.x][blacktemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
        drawselecursor(blackoldpos);
      drawcursor(blackcurpos);
      blacktemppos.x=blackcurpos.x;
      blacktemppos.y=blackcurpos.y;

  }
}

TOP

随着一声『富神爷爷到』,从天上掉下一滴甘露正好落在你的嘴唇上!
你在恍惚中看见了14两黄金。

blackright()
{
  int x,y,n;
  if(blackcurpos.y<8)
  {
    blackcurpos.y++;
   
      x=position[blacktemppos.x][blacktemppos.y].x;
      y=position[blacktemppos.x][blacktemppos.y].y;
      if(board[blacktemppos.x][blacktemppos.y]==0)
        drawbmp(x,y,boardfile[blacktemppos.x][blacktemppos.y]);
      else if(!(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE))
      {
        n=board[blacktemppos.x][blacktemppos.y];
        drawbmp(x,y,chessfile[n]);
      }
      if(blacktemppos.x==blackoldpos.x&&blacktemppos.y==blackoldpos.y&&blackstate==MOVE)
        drawselecursor(blackoldpos);
      drawcursor(blackcurpos);
      blacktemppos.x=blackcurpos.x;
      blacktemppos.y=blackcurpos.y;
  }
}

blackdo()
{
  int i,j,x,y,n;
  if(blackstate==SELECT&&blackcanselect())
  {
    if(board[blackcurpos.x][blackcurpos.y]<=BLACK&&board[blackcurpos.x][blackcurpos.y]>0)
    {
      blackstate=MOVE;
      drawselecursor(blackcurpos);
      blackoldpos.x=blackcurpos.x;
      blackoldpos.y=blackcurpos.y;
    }
  }
  else if(blackstate==MOVE&&blackcanmove())
  {
    x=position[blackoldpos.x][blackoldpos.y].x;
    y=position[blackoldpos.x][blackoldpos.y].y;
    drawbmp(x,y,boardfile[blackoldpos.x][blackoldpos.y]);

    x=position[blackcurpos.x][blackcurpos.y].x;
    y=position[blackcurpos.x][blackcurpos.y].y;
    n=board[blackoldpos.x][blackoldpos.y];
    drawbmp(x,y,chessfile[n]);

    if(board[blackcurpos.x][blackcurpos.y]==RED_JIANG)
    {
      winner=BLACK;
      finish=1;
      return;
    }
    board[blackcurpos.x][blackcurpos.y]=n;
    board[blackoldpos.x][blackoldpos.y]=0;
    for(i=0;i<=2;i++)
      for(j=3;j<=5;j++)
        if(board[j]==BLACK_JIANG)
          {x=i;y=j;}
    for(i=x+1,j=y,n=0;i<=9;i++)
    {
      if(board[j]==RED_JIANG&&n==0)
      {winner=RED;finish=1;break;}
      else if(board[j]!=0) n++;
    }
   

    turn=RED;
    redstate=SELECT;
    drawcursor(redcurpos);
    drawbmp(30,438,\"bmp\\\\rzq.wfb\");               /*转交控制权给红方*/
  }
  
}
blackundo()
{
  int x,y,n;
  if(blackstate==MOVE)
  {
    x=position[blackoldpos.x][blackoldpos.y].x;
    y=position[blackoldpos.x][blackoldpos.y].y;
    n=board[blackoldpos.x][blackoldpos.y];
    drawbmp(x,y,chessfile[n]);
    blackoldpos.x=blackcurpos.x;
    blackoldpos.y=blackcurpos.y;
    drawcursor(blackcurpos);
    blackstate=SELECT;
  }
}

/*----------------------------------------------------*/
start()
{
  drawcursor(blackcurpos);
  drawbmp(30,438,\"bmp\\\\bzq.wfb\");
  while(!finish)
  {
    key=getkey();
    switch(key){
      case RED_UP:
           if(turn==RED)
             redup();
           break;
      case RED_DOWN:
           if(turn==RED)
             reddown();
           break;
      case RED_LEFT:
           if(turn==RED)
             redleft();
           break;
      case RED_RIGHT:
           if(turn==RED)
             redright();
           break;
      case RED_DO:
           if(turn==RED)
             reddo();
           break;
      case RED_UNDO:
           if(turn==RED)
             redundo();
           break;
          
      case BLACK_UP:
           if(turn==BLACK)
             blackup();
           break;
      case BLACK_DOWN:
           if(turn==BLACK)
             blackdown();
           break;
      case BLACK_LEFT:
           if(turn==BLACK)
             blackleft();
           break;
      case BLACK_RIGHT:
           if(turn==BLACK)
             blackright();
           break;
      case BLACK_DO:
           if(turn==BLACK)
             blackdo();
           break;
      case BLACK_UNDO:
           if(turn==BLACK)
             blackundo();
           break;
      case ESCAPE:  finish=1;break;
    }
   
  }
}

main()
{


  init();
  initpos();
  initchessmap();
  drawbmp(0,0,\"bmp\\\\board.wfb\");
  initdrawchess();
  /*初始化光标位置*/
  redcurpos.x=redoldpos.x=redtemppos.x=9;
  redcurpos.y=redoldpos.y=redtemppos.y=8;
  blackcurpos.x=blackoldpos.x=blacktemppos.x=0;
  blackcurpos.y=blackoldpos.y=blacktemppos.y=0;
/*开始*/
  start();
  if(winner==RED)
    drawbmp(200,200,\"bmp\\\\redwin.wfb\");
  else if(winner==BLACK)
    drawbmp(200,200,\"bmp\\\\blackwin.wfb\");
  else
    drawbmp(200,200,\"bmp\\\\exit.wfb\");
  getch();
  end();
}



TOP

强啊

TOP

楼主自己写的吗?强啊

TOP

有错
不能运行

TOP

佩服

TOP

佩服

TOP

如果真是楼主自己写的,我佩服

TOP

厉害啊!!!

TOP

那找的,可以不可以给个没有错误的源程序啊?
QQ:285262090

TOP

有错误,不能运行

TOP

门啊

TOP

引用:
下面是引用德拉库拉于2004-11-18 10:48 AM发表的:
有错
不能运行
[s:779]

TOP

五体投地

TOP