会员注册 | 电脑急诊 | 中国汽车救援中心网 | 中国电脑视频网 | 装机必备软件 | 淘宝商城
·维修资料下载
·视频教程下载
·
网络教程下载
·加盟地方救援
·
我要学维修
·
电子书下载
进入论坛 地图
教程 | 技巧 | 笔记本 | 安全 | 网络故障 | 建站经验 | 维修资料 | 行情 | Vista | Win Xp | 手机 | MP3 | DVDC | Q Q | 评测 | DIY | 厂商 | 源码 | 病毒 | 数据恢复
[菜鸟学院] 操作系统 程序设计 网站开发 图像动画 办公软件 [故障查询] CPU 主板 硬盘 内存 显示器 打印机 光驱 显卡 [PC电子书] 软件教程 硬件技术 数据理论 网络技术
【救援中心俱乐部】
120急诊室  菜鸟学院  视频教程
俱乐部活动 软件世界  操作系统
维修资料   网络世界  网站建设
笔记本专栏 硬件世界  聊天专栏
网友靓照   个人专栏  原创交流
灌水乐园   贴图中心  游戏世界
当前位置:首页 > 菜鸟学院 > 软件技巧 > 系统技巧 > 正文

一个用C语言编写的下象棋的程序(2人模式)
   2008-9-9 17:13:14 来源: 进入论坛 添加到收藏夹

改程序在VC++环境中使用没有问题

#include<stdio.h>
#include<math.h>
#include <windows.h>


void display(int table[][10]);
int checkRule(int x1,int y1,int x2,int y2,int table[][10]);
int checkche(int x1,int y1,int x2,int y2,int table[][10]);
int checkma(int x1,int y1,int x2,int y2,int table[][10]);
int checkxiang(int x1,int y1,int x2,int y2,int table[][10]);
int checkshi(int x1,int y1,int x2,int y2,int table[][10]);
int checkshuai(int x1,int y1,int x2,int y2,int table[][10]);
int checkpao(int x1,int y1,int x2,int y2,int table[][10]);
int checkbing(int x1,int y1,int x2,int y2,int table[][10]);

void main()
{
 int table[11][10];
 int i,j;
 int x1,y1,x2,y2;
 int order=0;
 // 调用 win32 API 函数改变输出颜色
 HANDLE consolehwnd;
 consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
 //  creat the blank layout
 for (i=1;i<=10;i++)
  for (j=1;j<=9;j++)
   table[i][j]=0;
 for (j=1;j<=5;j++)
  table[1][j]=j;
 for (j=6,i=1;j<=9;j++)
  table[1][j]=5-i++;
 table[3][2]=6;
 table[3][8]=6;
 for (j=1;j<=9;j++)
  if (j%2==1)
   table[4][j]=7;
 for (j=1;j<=5;j++)
  table[10][j]=-1*j;
 for (j=6,i=-1;j<=9;j++)
  table[10][j]=-5-i--;
 table[8][2]=-6;
 table[8][8]=-6;
 for (j=1;j<=9;j++)
  if (j%2==1)
   table[7][j]=-7;
 // creat finished
 display(table);
 while(1)
 {
  int result,win1=1,win2=1;
  while(1)
  {
   printf("\n请输入您要移动的棋子位置(例如输入 3 4 代表第三行第四列)  :");
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_BLUE);
   scanf("%d%d",&x1,&y1);
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
   if (x1>10 || x1<1 || y1>9 || y1<1 || table[x1][y1]==0) printf("您输入的位置没有棋子,请检查后重新输入。\n");
   else
   {
    if (order%2==0 && table[x1][y1]>0)
    {
     printf("该绿方走棋了,请绿方走棋。\n");
    }
    else if (order%2==1 && table[x1][y1]<0)
    {
     printf("该红方走棋了,请红方走棋。\n");
    }
    else
    {
     order++;
     break;
    }
   }
  }
  while(1)
  {
   printf("请输入您要将棋子移动到哪(例如输入 3 4 代表第三行第四列)  :");
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_BLUE);
   scanf("%d%d",&x2,&y2);
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
   result=checkRule(x1,y1,x2,y2,table);
   if (result==1)
   {
    table[x2][y2]=table[x1][y1];
    table[x1][y1]=0;
    display(table);
    break;
   }
   else
    if (result==99)
     printf("您怎么把棋子移动到棋盘外边去了?请仔细想好重新输入!\n");
   else continue;
  }
  for (i=1;i<=10;i++)
  {
   for (j=1;j<=9;j++)
   {
    if (table[i][j]==5) win1=0;
    if (table[i][j]==-5) win2=0;
   }
  }
  if (win1==1)
  {
   printf("恭喜绿方,绿方取得胜利!\n");
   break;
  }
  if (win2==1)
  {
   printf("恭喜红方,红方取得胜利!\n");
   break;
  }
 }
}

void display(int table[][10])
{
 int i,j;
 // 调用 win32 API 函数改变输出颜色
 HANDLE consolehwnd;
 consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
 printf("\n          1     2     3     4     5     6     7     8     9\n\n");
 for (i=1;i<=10;i++)
 {
  printf("%5d   ",i);
  for (j=1;j<=9;j++)
  {
   // display the top side
   if (table[i][j]==0) printf("  + ");
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_RED);
   if (table[i][j]==1) printf(" 车 ");
   if (table[i][j]==2) printf(" 马 ");
   if (table[i][j]==3) printf(" 象 ");
   if (table[i][j]==4) printf(" 士 ");
   if (table[i][j]==5) printf(" 将 ");
   if (table[i][j]==6) printf(" 炮 ");
   if (table[i][j]==7) printf(" 卒 ");
   // display the bottom side
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_GREEN);
   if (table[i][j]==-1) printf(" 車 ");
   if (table[i][j]==-2) printf(" 馬 ");
   if (table[i][j]==-3) printf(" 相 ");
   if (table[i][j]==-4) printf(" 仕 ");
   if (table[i][j]==-5) printf(" 帅 ");
   if (table[i][j]==-6) printf(" 砲 ");
   if (table[i][j]==-7) printf(" 兵 ");
   SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
   if (j<9) printf("--");
  }
  printf("\n");
  if (i<10 && i!=5) printf("          |     |     |     |     |     |     |     |     |\n");
  if (i==5) printf("\n");
 }
}

int checkRule(int x1,int y1,int x2,int y2,int table[][10])
{
 if (x2<1 || x2>10 || y2<1 || y2>9) return 99;
 else
  if (table[x1][y1]==1 || table[x1][y1]==-1)
  {
   if (checkche(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==2 || table[x1][y1]==-2)
  {
   if (checkma(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==3 || table[x1][y1]==-3)
  {
   if (checkxiang(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==4 || table[x1][y1]==-4)
  {
   if (checkshi(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==5 || table[x1][y1]==-5)
  {
   if (checkshuai(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==6 || table[x1][y1]==-6)
  {
   if (checkpao(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
  if (table[x1][y1]==7 || table[x1][y1]==-7)
  {
   if (checkbing(x1,y1,x2,y2,table)==1) return 1;
   else return 0;
  }
 else
 {
  printf("莫非程序崩溃了。。。 :(\n");
  return 0;
 }
}

int checkche(int x1,int y1,int x2,int y2,int table[][10])
{
 int i,flag=1;
 if (x1!=x2 && y1!=y2)
 {
  printf("车不能斜着走呀,重新输入吧\n");
  return 0;
 }
 if (table[x2][y2]*table[x1][y1]>0)
 {
  printf("自己不能吃掉自己呀,检查后重新输入吧\n");
  return 0;
 }

 if (x1==x2)
 {
  if (y1>y2)
  {
   for (i=y2+1;i<y1;i++)
   {
    if (table[x1][i]!=0)
    {
     flag=0;
     break;
    }
   }
  }
  else
  {
   for (i=y1+1;i<y2;i++)
   {
    if (table[x1][i]!=0)
    {
     flag=0;
     break;
    }
   }
  }
 }
 if (y1==y2)
 {
  if (x1>x2)
  {
   for (i=x2+1;i<x1;i++)
   {
    if (table[i][y1]!=0)
    {
     flag=0;
     break;
    }
   }
  }
  else
  {
   for (i=x1+1;i<x2;i++)
   {
    if (table[i][y1]!=0)
    {
     flag=0;
     break;
    }
   }
  }
 }
 if (flag==0)
 {
  printf("车移动的时候中间不能有其他的棋子呀,请重新输入\n");
  return 0;
 }
 return 1;
}
int checkma(int x1,int y1,int x2,int y2,int table[][10])
{
 if(table[x1][y1]<0)
 {
  if(table[x2][y2]<0)
  {
   printf("不能自己吃自己!!!\n");
   return 0;
  }
 }
 else if(table[x1][y1]>0)
 {
  if(table[x2][y2]>0)
  {
   printf("不能自己吃自己!!!\n");
   return 0;
  }
 }
 if(((x1-2==x2)&&(y1-1==y2))||((x1-2==x2)&&(y1+1==y2)))//上方位
 {
  if(table[x1-1][y1]==0)
  {
   return 1;
  }
  else
  {
   printf("别腿了!!!\n");
   return 0;
  }
 }
 if(((x1-1==x2)&&(y1+2==y2))||((x1+1==x2)&&(y1+2==y2)))//右方位
 {
  if(table[x1][y1+1]==0)
  {
   return 1;
  }
  else
  {
   printf("别腿了!!!\n");
   return 0;
  }
 }
 if(((x1+2==x2)&&(y1+1==y2))||((x1+2==x2)&&(y1-1==y2)))//左方位
 {
  if(table[x1+1][y1]==0)
  {
   return 1;
  }
  else
  {
   printf("别腿了!!!\n");
   return 0;
  }
 }
 if(((x1-1==x2)&&(y1-2==y2))||((x1+1==x2)&&(y1-2==y2)))//下方位
 {
  if(table[x1][y1-1]==0)
  {
   return 1;
  }
  else
  {
   printf("别腿了!!!\n");
   return 0;
  }
 }
 return 1;
}
int checkxiang(int x1,int y1,int x2,int y2,int table[][10])
{
 if ((abs(x2-x1))!=2 || (abs(y2-y1))!=2)
 {
  printf("相(象)只能走田字哦,呵呵,检查后重新输入\n");
  return 0;
 }
 else if ((table[x1][y1]>0 && x2>5)||(table[x1][y1]<0 && x2<5))
 {
  printf("相(象)不能渡过楚河汉界呀,重新输入吧\n");
  return 0;
 }
 else if (table[(x1+x2)/2][(y1+y2)/2]!=0)
 {
  printf("您要移动的路径上有其他棋挡着呢,不能移动,重新输入吧\n");
  return 0;
 }
 else if (table[x2][y2]*table[x1][y1]>0)
 {
  printf("自己不能吃掉自己呀,检查后重新输入吧\n");
  return 0;
 }
 else return 1;
}
int checkshi(int x1,int y1,int x2,int y2,int table[][10])
{
 if ((x2<8 || x2>10 || y2<4 || y2>6)&&(x2<1 || x2>3 || y2<4 || y2>6))
 {
  printf("士或者仕是不能移出九宫区域的,请重新输入。\n");
  return 0;
 }
 else if (!(abs(x2-x1)==1)&&(abs(y2-y1)==1))
 {
  printf("士或者仕只能斜着走呀,请检查后重新输入\n");
  return 0;
 }
 else if (table[x2][y2]*table[x1][y1]>0)
 {
  printf("自己不能吃掉自己呀,检查后重新输入吧\n");
  return 0;
 }
 else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))
 {
  printf("士或者仕不能一次走多格呀,请重新输入。\n");
  return 0;
 }
 else return 1;
}

int checkshuai(int x1,int y1,int x2,int y2,int table[][10])
{
 if ((x2<8 || x2>10 || y2<4 || y2>6)&&(x2<1 || x2>3 || y2<4 || y2>6))
 {
  printf("将或者帅是不能移出九宫区域的,请重新输入。\n");
  return 0;
 }
 else if ((abs(x2-x1)==1)&&(abs(y2-y1)==1))
 {
  printf("将或者帅是不能走斜线的哦,呵呵,请检查后重新输入\n");
  return 0;
 }
 else if (table[x2][y2]*table[x1][y1]>0)
 {
  printf("自己不能吃掉自己呀,检查后重新输入吧\n");
  return 0;
 }
 else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))
 {
  printf("将或者帅不能一次走多格呀,请重新输入。\n");
  return 0;
 }
 else return 1;
}

int checkpao(int x1,int y1,int x2,int y2,int table[][10])
{
 int i,flag=0;
 if (table[x1][y1]*table[x2][y2]>=0)
 {
  if (x1!=x2 && y1!=y2)
  {
   printf("炮不能斜着走呀,重新输入吧\n");
   return 0;
  }
  if (table[x2][y2]*table[x1][y1]>0)
  {
   printf("自己不能吃掉自己呀,检查后重新输入吧\n");
   return 0;
  }
  
  if (x1==x2)
  {
   if (y1>y2)
   {
    for (i=y2;i<y1;i++)
    {
     if (table[x1][i]!=0)
     {
      flag=1;
      break;
     }
    }
   }
   else
   {
    for (i=y1+1;i<y2;i++)
    {
     if (table[x1][i]!=0)
     {
      flag=1;
      break;
     }
    }
   }
  }
  if (y1==y2)
  {
   if (x1>x2)
   {
    for (i=x2;i<x1;i++)
    {
     if (table[i][y1]!=0)
     {
      flag=1;
      break;
     }
    }
   }
   else
   {
    for (i=x1+1;i<x2;i++)
    {
     if (table[i][y1]!=0)
     {
      flag=1;
      break;
     }
    }
   }
  }
  if (flag==1)
  {
   printf("炮不吃子移动的时候中间不能有其他的棋子呀,请重新输入\n");
   return 0;
  }
 }
 else
 {
  flag=0;
  if (x1!=x2 && y1!=y2)
  {
   printf("炮不能斜着走呀,重新输入吧\n");
   return 0;
  }
  else
  {
   if (x1==x2)
   {
    if (y1>y2)
    {
     for (i=y2+1;i<y1;i++)
     {
      if (table[x1][i]!=0)
      {
       flag++;          //flag2 : 支架的个数
      }
     }
    }
    else
    {
     for (i=y1+1;i<y2;i++)
     {
      if (table[x1][i]!=0)
      {
       flag++;
      }
     }
    }
   }
   if (y1==y2)
   {
    if (x1>x2)
    {
     for (i=x2+1;i<x1;i++)
     {
      if (table[i][y1]!=0)
      {
       flag++;
      }
     }
    }
    else
    {
     for (i=x1+1;i<x2;i++)
     {
      if (table[i][y1]!=0)
      {
       flag++;
      }
     }
    }
   }

  }
  if (flag==1) return 1;
  else if (flag==0)
  {
   printf("没有支架炮没法吃掉对方的棋子,请检查后重新输入\n");
   return 0;
  }
  else
  {
   printf("您不能用多个棋子做炮的支架吧,请重新输入。\n");
   return 0;
  }
 }
 return 1;
}

int checkbing(int x1,int y1,int x2,int y2, int table[][10])
{
 if(table[x1][y1]>0)//兵是否是黑方(在上方)
 {
  if(table[x2][y2]>0)
  {
   printf("不能自己吃自己!!!\n");
   return 0;
  }
  if(x1<6)//没过河
  {
   if((y1==y2)&&(x2-x1==1))
   {
    return 1;
   }
   else
   {
    printf("兵过河前只能向前走,请重新输入\n");
    return 0;
   }
  }
  else//过河
  {
   if(((y1==y2)&&(x2-x1==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1)))
   {
    return 1;
   }
   else
   {
    printf("兵过河后只能向前走或者平移,不能后退,请重新输入\n");
    return 0;
   }
  }
 }
 else//兵是否在红方(在下方)
 {
  if(table[x2][y2]<0)
  {
   printf("不能自己吃自己!!!\n");
   return 0;
  }
  if(x1>5)//没过河
  {
   if((y1==y2)&&(x1-x2==1))
   {
    return 1;
   }
   else
   {
    printf("兵过河前只能向前走,请重新输入\n");
    return 0;
   }
  }
  else//过河
  {
   if(((y1==y2)&&(x1-x2==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1)))
   {
    return 1;
   }
   else
   {
    printf("兵过河后只能向前走或者平移,不能后退,请重新输入\n");
    return 0;
   }
  }
 }
}


 
打印】【电脑俱乐部】【电脑视频】【电脑故障】【电脑学院】【电子书】【关闭
精彩视频教程推荐
电子书下载
推荐阅读
·未雨绸缪 系统出错我先知
·Vista下支付宝控件、证书使用问题
·Vista系统下的内存加速技巧
·耗材最关键 4种方式延长打印机寿
·提防!5种现象预示硬盘将要出现故
·差距究竟有多大 54M与108M无线路
·Excel 在单元格中要打钩怎么办?
·新硒鼓装上,缺粉灯就亮的解决参
·掏钱装机前必看 学生装机误区谈0
·重启网络设备 解决网络的疑难故障
·方便无比 教你自定义窗口快捷方式
·旁门左道 不用软件截屏的小技巧 
·番茄案已三人落网 主犯疑移居国外
·《互联网周刊》 “云计算”的容量
·一个用C语言编写的下象棋的程序(
·Photoshop精致制作一只红色铅笔

视频教程
EasyBoot制作双系统启 EasyBoot制作WinodwsX
最新新闻
·未雨绸缪 系统出错我先知
·评论:番茄花园该打 反垄断更该升级
·Vista下支付宝控件、证书使用问题大全
·Vista系统下的内存加速技巧
·耗材最关键 4种方式延长打印机寿命
·提防!5种现象预示硬盘将要出现故障
·差距究竟有多大 54M与108M无线路由对
·Excel 在单元格中要打钩怎么办?

装机必备软件下载
 
关于我们 | 合作媒体 | 版权声明 | 联系方式 | 意见反馈 | 广告业务 | 网站地图 | 急救中心

Copyright © 2003--2007 中国电脑援救中心版权所有
鲁ICP备05000605号