• Chess---->简单命令框象棋(人VS人)


    简单粗暴,直接先上代码: 

    ChessBoard.h:

     1 #ifndef CHESBOARD_H
     2 #include<iostream>
     3 #include<string>
     4 using namespace std;
     5 class Chess
     6 {
     7 public:
     8     virtual string getName() { return name; }
     9     //virtual bool judge(int a, int b, int c, int d);
    10     Chess(string name, int color) :name(name), color(color) {}
    11     virtual int judge(int a, int b, int c, int d) { return 4; }  //1 移动非法 2 可移动到空位子 3 吃子
    12     virtual int getColor() { return color; }
    13 protected:
    14     string name;
    15     int color;
    16 };
    17 
    18 class Shuai :public Chess
    19 {
    20 public:
    21     Shuai(string a, int b) :Chess(a, b) {}  //a 名字   b 颜色
    22     int judge(int a, int b, int c, int d);
    23 };
    24 
    25 class Shi :public Chess
    26 {
    27 public:
    28     Shi(string a, int b) :Chess(a, b) {}
    29     int judge(int a, int b, int c, int d);
    30 };
    31 
    32 class Bing :public Chess
    33 {
    34 public:
    35     Bing(string name, int color) :Chess(name, color) {}
    36     int judge(int a, int b, int c, int d);
    37 };
    38 
    39 class Xiang :public Chess
    40 {
    41 public:
    42     Xiang(string name, int color) :Chess(name, color) {}
    43     int judge(int a, int b, int c, int d);
    44 };
    45 
    46 class Ma :public Chess
    47 {
    48 public:
    49     int judge(int a, int b, int c, int d);
    50     Ma(string name, int color) :Chess(name, color) {}
    51 };
    52 
    53 
    54 class Pao :public Chess
    55 {
    56 public:
    57     int judge(int a, int b, int c, int d);
    58     Pao(string name, int color) :Chess(name, color) {}
    59 };
    60 class Che :public Chess
    61 {
    62 public:
    63     int judge(int a, int b, int c, int d);
    64     Che(string name, int color) :Chess(name, color) {}
    65 };
    66 
    67 class Player
    68 {
    69 public:
    70     Player(int a) :color(a) {}
    71     bool judge(int a, int b);
    72     void inPut();
    73     void moveChess(int a, int b, int c, int d);
    74     void eatChess(int a, int b, int c, int d);
    75 private:
    76     int color;
    77 };

    78 #endif // CHESBOARD_H 

    Chess: 

       1 #include"ChesBoard.h"
       2 #include<Windows.h>
       3 #include<vector>
       4 
       5 class ChessBoard {
       6 public:
       7     vector<vector<Chess *> > v_position;
       8     bool judgePositionIsNULL(int a, int b) {    //判断棋盘上是否是空位
       9         if (v_position[a][b]) {
      10             return false;
      11         }
      12         return true;
      13     }
      14 
      15     int judgePositionIsColor(int a, int b) {        //有子则返回颜色(1为红色,2为黑色)    
      16         return v_position[a][b]->getColor();
      17     }
      18     ChessBoard() {
      19         for (int i = 0; i < 10; i++) {
      20             vector<Chess *> v_cell(9, NULL);
      21             v_position.push_back(v_cell);
      22         }
      23     }
      24     void init_Red();
      25     void init_Black();
      26     void showBoard();
      27 };
      28 
      29 ChessBoard cb;
      30 
      31 //静态数据,红方
      32 Shuai shuai_red(""1);
      33 Shi shi_red1(""1);
      34 Shi shi_red2(""1);
      35 Xiang xiang_red1(""1);
      36 Xiang xiang_red2(""1);
      37 Ma ma_red1(""1);
      38 Ma ma_red2(""1);
      39 Che che_red1(""1);
      40 Che che_red2(""1);
      41 Pao pao_red1(""1);
      42 Pao pao_red2(""1);
      43 Bing bing_red1(""1);
      44 Bing bing_red2(""1);
      45 Bing bing_red3(""1);
      46 Bing bing_red4(""1);
      47 Bing bing_red5(""1);
      48 
      49 //静态数据,黑方
      50 Shuai shuai_black(""2);
      51 Shi shi_black1(""2);
      52 Shi shi_black2(""2);
      53 Xiang xiang_black1(""2);
      54 Xiang xiang_black2(""2);
      55 Ma ma_black1(""2);
      56 Ma ma_black2(""2);
      57 Che che_black1(""2);
      58 Che che_black2(""2);
      59 Pao pao_black1(""2);
      60 Pao pao_black2(""2);
      61 Bing bing_black1(""2);
      62 Bing bing_black2(""2);
      63 Bing bing_black3(""2);
      64 Bing bing_black4(""2);
      65 Bing bing_black5(""2);
      66 
      67 
      68 void ChessBoard::init_Red() {
      69     v_position[0][4] = &shuai_red;
      70     v_position[0][3] = &shi_red1;
      71     v_position[0][5] = &shi_red2;
      72     v_position[0][2] = &xiang_red1;
      73     v_position[0][6] = &xiang_red2;
      74     v_position[0][1] = &ma_red1;
      75     v_position[0][7] = &ma_red2;
      76     v_position[0][0] = &che_red1;
      77     v_position[0][8] = &che_red2;
      78     v_position[2][1] = &pao_red1;
      79     v_position[2][7] = &pao_red2;
      80     v_position[3][0] = &bing_red1;
      81     v_position[3][2] = &bing_red2;
      82     v_position[3][4] = &bing_red3;
      83     v_position[3][6] = &bing_red4;
      84     v_position[3][8] = &bing_red5;
      85 }
      86 
      87 void ChessBoard::init_Black() {
      88     v_position[9][4] = &shuai_black;
      89     v_position[9][3] = &shi_black1;
      90     v_position[9][5] = &shi_black2;
      91     v_position[9][2] = &xiang_black1;
      92     v_position[9][6] = &xiang_black2;
      93     v_position[9][1] = &ma_black1;
      94     v_position[9][7] = &ma_black2;
      95     v_position[9][0] = &che_black1;
      96     v_position[9][8] = &che_black2;
      97     v_position[7][1] = &pao_black1;
      98     v_position[7][7] = &pao_black2;
      99     v_position[6][0] = &bing_black1;
     100     v_position[6][2] = &bing_black2;
     101     v_position[6][4] = &bing_black3;
     102     v_position[6][6] = &bing_black4;
     103     v_position[6][8] = &bing_black5;
     104 }
     105 
     106 void ChessBoard::showBoard() {
     107     //用于记录已打印的行数,以便在准确位置打印“楚河、汉界”
     108     int flag = 0;
     109     cout << "    ";
     110     for (int i = 0; i < 9; i++) {
     111         cout << ' ' << i << "  ";
     112     }
     113     cout << endl;
     114     cout << "   ------------------------------------" << endl;
     115     for (auto row : v_position) {
     116         cout << flag << '|' << ' ';
     117         flag++;
     118         for (auto column : row) {
     119             if (column == NULL)
     120                 cout << " 十 ";
     121             else {
     122                 if (column->getColor() == 1) {
     123                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
     124                 }
     125                 else {
     126                     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
     127                 }
     128                 cout << ' ';
     129                 cout << (column->getName());
     130                 cout << ' ';
     131                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
     132             }
     133         }
     134         cout << endl << " |" << endl;
     135         if (flag == 5) {
     136             cout << "   ------------------------------------" << endl;
     137             cout << "            楚河          汉界    " << endl;
     138             cout << "   ------------------------------------" << endl;
     139             cout << endl;
     140         }
     141     }
     142 }
     143 int Shuai::judge(int a, int b, int c, int d)
     144 {
     145     if (getName() == "")     //判断帅还是将
     146     {
     147         if ((c <= 2 && c >= 0) && (d >= 3 && d <= 5))    // 帅只能在中心9格移动
     148         {
     149             if (cb.judgePositionIsNULL(c, d))      //判断在将要移动到的地方是否有子
     150             {
     151                 if ((c == a&&d == b + 1) || (c == a&&d == b - 1) || (c == a + 1 && d == b) || (c == a - 1 && d == b))  //判断移动是否为一格
     152                 {
     153                     return 2;
     154                 }
     155             }
     156             else
     157             {
     158                 if (cb.judgePositionIsColor(c, d) == 1)  //1红  2黑 判断是哪方子
     159                 {
     160                     return 1;
     161                 }
     162                 else   //若是黑子,返回吃子判断
     163                 {
     164                     return 3;
     165                 }
     166             }
     167         }
     168         //此时可能对将(飞将)
     169         else if((c >= 0 && c <= 9) && (d >= 0 && d <= 8) && b == d && cb.v_position[c][d]){
     170             if (cb.v_position[c][d]->getName() == "") {
     171                 for (int i = a + 1; i < c; i++)
     172                     //中间有子,则不能移动,返回1
     173                     if (cb.v_position[i][b])
     174                         return 1;
     175                 return 3;
     176             }
     177         }
     178     }
     179     if (getName() == "")     //判断帅还是将
     180     {
     181         if ((c <= 9 && c >= 7) && (d >= 3 && d <= 5))    // 将只能在中心9格移动
     182         {
     183             if (cb.judgePositionIsNULL(c, d))      //判断在将要移动到的地方是否有己方的子
     184             {
     185                 if ((c == a&&d == b + 1) || (c == a&&d == b - 1) || (c == a + 1 && d == b) || (c == a - 1 && d == b)) //判断移动是否为一格
     186                 {
     187                     return 2;
     188                 }
     189             }
     190             else
     191             {
     192                 if (cb.judgePositionIsColor(c, d) == 2)  //1红  2黑
     193                 {
     194                     return 1;
     195                 }
     196                 else   //若是红子,返回吃子判断
     197                 {
     198                     return 3;
     199                 }
     200             }
     201         }
     202         //此时可能对将(飞将)
     203         else if ((c >= 0 && c <= 9) && (d >= 0 && d <= 8) && b == d && cb.v_position[c][d]) {
     204             if (cb.v_position[c][d]->getName() == "") {
     205                 for (int i = a - 1; i > c; i--)
     206                     //中间有子,则不能移动,返回1
     207                     if (cb.v_position[i][b])
     208                         return 1;
     209                 return 3;
     210             }
     211         }
     212     }
     213     return 1;
     214 }
     215 
     216 int Shi::judge(int a, int b, int c, int d)
     217 {
     218     if (cb.judgePositionIsColor(a, b) == 1)    //判断是红子
     219     {
     220         if ((c <= 2 && c >= 0) && (d >= 3 && d <= 5))  //判断目的地是否在中心9格
     221         {
     222             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     223             {
     224                 if ((c == a + 1 && d == b + 1) || (c == a + 1 && d == b - 1) || (c == a - 1 && d == b + 1) || (c == a - 1 && d == b - 1))  //判断是否符合移动规则
     225                 {
     226                     return 2;
     227                 }
     228             }
     229             else
     230             {
     231                 if (cb.judgePositionIsColor(c, d) == 1)  //1红  2黑 判断是哪方子
     232                 {
     233                     return 1;
     234                 }
     235                 else   //若是黑子,返回吃子判断
     236                 {
     237                     return 3;
     238                 }
     239             }
     240         }
     241     }
     242     if (cb.judgePositionIsColor(a, b) == 2)    //判断是黑子
     243     {
     244         if ((c <= 9 && c >= 7) && (d >= 3 && d <= 5))  //判断目的地是否在中心9格
     245         {
     246             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     247             {
     248                 if ((c == a + 1 && d == b + 1) || (c == a + 1 && d == b - 1) || (c == a - 1 && d == b + 1) || (c == a - 1 && d == b - 1))  //判断是否符合移动规则
     249                 {
     250                     return 2;
     251                 }
     252             }
     253             else
     254             {
     255                 if (cb.judgePositionIsColor(c, d) == 2)  //1红  2黑 判断是哪方子
     256                 {
     257                     return 1;
     258                 }
     259                 else   //若是红子,返回吃子判断
     260                 {
     261                     return 3;
     262                 }
     263             }
     264         }
     265     }
     266     return 1;
     267 }
     268 int Bing::judge(int a, int b, int c, int d)
     269 {
     270     if (cb.judgePositionIsColor(a, b) == 1)    //判断是红子
     271     {
     272         if (a >= 5)    //判断是否过河界
     273         {
     274             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     275             {
     276                 if ((c == a&&d == b + 1) || (c == a&&d == b - 1) || (c == a + 1 && d == b))
     277                 {
     278                     return 2;
     279                 }
     280             }
     281             else
     282             {
     283                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     284                 {
     285                     return 1;
     286                 }
     287                 else     //若是黑子,返回吃子判断
     288                 {
     289                     return 3;
     290                 }
     291             }
     292         }
     293         else    //未过河界
     294         {
     295             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     296             {
     297                 if (c == a + 1 && d == b)
     298                 {
     299                     return 2;
     300                 }
     301             }
     302             else
     303             {
     304                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     305                 {
     306                     return 1;
     307                 }
     308                 else     //若是黑子,返回吃子判断
     309                 {
     310                     return 3;
     311                 }
     312             }
     313         }
     314     }
     315     if (cb.judgePositionIsColor(a, b) == 2)    //判断是黑子
     316     {
     317         if (a <= 4)    //判断是否过河界
     318         {
     319             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     320             {
     321                 if ((c == a&&d == b + 1) || (c == a&&d == b - 1) || (c == a - 1 && d == b))
     322                 {
     323                     return 2;
     324                 }
     325             }
     326             else
     327             {
     328                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     329                 {
     330                     return 1;
     331                 }
     332                 else     //若是红子,返回吃子判断
     333                 {
     334                     return 3;
     335                 }
     336             }
     337         }
     338         else   //未过河界
     339         {
     340             if (cb.judgePositionIsNULL(c, d))  //判断目的地是否有子
     341             {
     342                 if (c == a - 1 && d == b)
     343                 {
     344                     return 2;
     345                 }
     346             }
     347             else
     348             {
     349                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     350                 {
     351                     return 1;
     352                 }
     353                 else     //若是红子,返回吃子判断
     354                 {
     355                     return 3;
     356                 }
     357             }
     358         }
     359     }
     360     return 1;
     361 }
     362 int Xiang::judge(int a, int b, int c, int d)
     363 {
     364     if (cb.judgePositionIsColor(a, b) == 1)    //判断是红子
     365     {
     366         if (b - 1 >= 0 && a - 1 >= 0 && !cb.judgePositionIsNULL(a - 1, b - 1))   //判断是否别象腿左上方 数组越界问题
     367         {
     368             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     369             {
     370                 if ((c == a - 2 && d == b + 2) || (c == a + 2 && d == b + 2) || (c == a + 2 && d == b - 2))      //判断是否符合移动规则
     371                     return 2;
     372             }
     373             else
     374             {
     375                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     376                 {
     377                     return 1;
     378                 }
     379                 else     //若是黑子,返回吃子判断
     380                 {
     381                     return 3;
     382                 }
     383             }
     384         }
     385         else if (b + 1 <= 9 && a - 1 >= 0 && !cb.judgePositionIsNULL(a - 1, b + 1))  //判断是否别象腿右上方 数组越界问题
     386         {
     387             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     388             {
     389                 if ((c == a + 2 && d == b + 2) || (c == a + 2 && d == b - 2) || (c == a - 2 && d == b - 2))    //判断是否符合移动规则
     390                     return 2;
     391             }
     392             else
     393             {
     394                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     395                 {
     396                     return 1;
     397                 }
     398                 else     //若是黑子,返回吃子判断
     399                 {
     400                     return 3;
     401                 }
     402             }
     403         }
     404         else if (a + 1 <= 9 && b - 1 >= 0 && !cb.judgePositionIsNULL(a + 1, b - 1))   //判断是否别象腿左下方 数组越界问题
     405         {
     406             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     407             {
     408                 if ((c == a - 2 && d == b - 2) || (c == a - 2 && d == b + 2) || (c == a + 2 && d == b + 2))    //判断是否符合移动规则
     409                     return 2;
     410             }
     411             else
     412             {
     413                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     414                 {
     415                     return 1;
     416                 }
     417                 else     //若是黑子,返回吃子判断
     418                 {
     419                     return 3;
     420                 }
     421             }
     422         }
     423         else if (a + 1 <= 9 && b + 1 <= 9 && !cb.judgePositionIsNULL(a + 1, b + 1))  //判断是否别象腿右下方 数组越界问题
     424         {
     425             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     426             {
     427                 if ((c == a - 2 && d == b + 2) || (c == a - 2 && d == b - 2) || (c == a + 2 && d - 2))    //判断是否符合移动规则
     428                     return 2;
     429             }
     430             else
     431             {
     432                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     433                 {
     434                     return 1;
     435                 }
     436                 else     //若是黑子,返回吃子判断
     437                 {
     438                     return 3;
     439                 }
     440             }
     441         }
     442         else
     443         {
     444             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     445             {
     446                 if ((c == a - 2 && d == b + 2) || (c == a - 2 && d == b - 2) || (c == a + 2 && d == b - 2) || (c == a + 2 && d == b + 2))   //判断是否符合移动规则
     447                     return 2;
     448             }
     449             else
     450             {
     451                 if (cb.judgePositionIsColor(c, d) == 1)    //1红  2黑 判断是哪方子
     452                 {
     453                     return 1;
     454                 }
     455                 else     //若是黑子,返回吃子判断
     456                 {
     457                     return 3;
     458                 }
     459             }
     460         }
     461     }
     462     if (cb.judgePositionIsColor(a, b) == 2)    //判断是黑子
     463     {
     464         if (b - 1 >= 0 && a - 1 >= 0 && !cb.judgePositionIsNULL(a - 1, b - 1))   //判断是否别象腿左上方 数组越界问题
     465         {
     466             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     467             {
     468                 if ((c == a - 2 && d == b + 2) || (c == a + 2 && d == b + 2) || (c == a + 2 && d == b - 2))      //判断是否符合移动规则
     469                     return 2;
     470             }
     471             else
     472             {
     473                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     474                 {
     475                     return 1;
     476                 }
     477                 else     //若是红子,返回吃子判断
     478                 {
     479                     return 3;
     480                 }
     481             }
     482         }
     483         else if (b + 1 <= 9 && a - 1 >= 0 && !cb.judgePositionIsNULL(a - 1, b + 1))  //判断是否别象腿右上方 数组越界问题
     484         {
     485             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     486             {
     487                 if ((c == a + 2 && d == b + 2) || (c == a + 2 && d == b - 2) || (c == a - 2 && d == b - 2))    //判断是否符合移动规则
     488                     return 2;
     489             }
     490             else
     491             {
     492                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     493                 {
     494                     return 1;
     495                 }
     496                 else     //若是红子,返回吃子判断
     497                 {
     498                     return 3;
     499                 }
     500             }
     501         }
     502         else if (a + 1 <= 9 && b - 1 >= 0 && !cb.judgePositionIsNULL(a + 1, b - 1))   //判断是否别象腿左下方 数组越界问题
     503         {
     504             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     505             {
     506                 if ((c == a - 2 && d == b - 2) || (c == a - 2 && d == b + 2) || (c == a + 2 && d == b + 2))    //判断是否符合移动规则
     507                     return 2;
     508             }
     509             else
     510             {
     511                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     512                 {
     513                     return 1;
     514                 }
     515                 else     //若是红子,返回吃子判断
     516                 {
     517                     return 3;
     518                 }
     519             }
     520         }
     521         else if (a + 1 <= 9 && b + 1 <= 9 && !cb.judgePositionIsNULL(a + 1, b + 1))  //判断是否别象腿右下方 数组越界问题
     522         {
     523             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     524             {
     525                 if ((c == a - 2 && d == b + 2) || (c == a - 2 && d == b - 2) || (c == a + 2 && d - 2))    //判断是否符合移动规则
     526                     return 2;
     527             }
     528             else
     529             {
     530                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     531                 {
     532                     return 1;
     533                 }
     534                 else     //若是红子,返回吃子判断
     535                 {
     536                     return 3;
     537                 }
     538             }
     539         }
     540         else
     541         {
     542             if (cb.judgePositionIsNULL(c, d))    //判断目的地是否有子
     543             {
     544                 if ((c == a - 2 && d == b + 2) || (c == a - 2 && d == b - 2) || (c == a + 2 && d == b - 2) || (c == a + 2 && d == b + 2))   //判断是否符合移动规则
     545                     return 2;
     546             }
     547             else
     548             {
     549                 if (cb.judgePositionIsColor(c, d) == 2)    //1红  2黑 判断是哪方子
     550                 {
     551                     return 1;
     552                 }
     553                 else     //若是红子,返回吃子判断
     554                 {
     555                     return 3;
     556                 }
     557             }
     558         }
     559     }
     560     return 1;
     561 }
     562 
     563 int Che::judge(int a, int b, int c, int d) {
     564 
     565     //判断目标点是否在棋盘界内
     566     if ((c >= 0 && c <= 9) && (d >= 0 && d <= 8)) {
     567 
     568         //判断車是否走的是直线,否则不能移动,返回1
     569         if (a == c || b == d) {
     570 
     571             if (a == c) {        //横向移动
     572                                 //目标点是自身,则不能移动,返回1
     573                 if (b == d) {
     574                     return 1;
     575                 }
     576                 else if (b > d) {
     577                     for (int i = b - 1; i > d; i--)
     578                         //中间有子,则不能移动,返回1
     579                         if (cb.v_position[c][i])
     580                             return 1;
     581                 }
     582                 else {
     583                     for (int i = b + 1; i < d; i++)
     584                         //中间有子,则不能移动,返回1
     585                         if (cb.v_position[c][i])
     586                             return 1;
     587                 }
     588                 //目标点是空位置,则可直接移到目标点
     589                 if (!cb.v_position[c][d]) {
     590                     return 2;
     591                 }
     592                 else {
     593                     //目标位置是己方棋子,则不能移动,返回1
     594                     if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     595                         return 1;
     596                     }
     597                     else {
     598                         return 3;
     599                     }
     600                 }
     601             }
     602             else {            //纵向移动
     603                             //目标点是自身,则不能移动,返回1
     604                 if (a == c) {
     605                     return 1;
     606                 }
     607                 else if (a > c) {
     608                     for (int i = a - 1; i > c; i--)
     609                         //中间有子,则不能移动,返回1
     610                         if (cb.v_position[i][d])
     611                             return 1;
     612                 }
     613                 else {
     614                     for (int i = a + 1; i < c; i++)
     615                         //中间有子,则不能移动,返回1
     616                         if (cb.v_position[i][d])
     617                             return 1;
     618                 }
     619                 //目标点是空位置,则可直接移到目标点
     620                 if (!cb.v_position[c][d]) {
     621                     return 2;
     622                 }
     623                 else {
     624                     //目标位置是己方棋子,则不能移动,返回1
     625                     if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     626                         return 1;
     627                     }
     628                     else {
     629                         return 3;
     630                     }
     631                 }
     632             }
     633         }
     634         else {
     635             return 1;
     636         }
     637     }
     638     else {
     639         return 1;
     640     }
     641 
     642 }
     643 
     644 int Ma::judge(int a, int b, int c, int d) {
     645     //判断目标点是否在棋盘界内
     646     if ((c >= 0 && c <= 9) && (d >= 0 && d <= 8)) {
     647         //判断走的是否是“日”
     648         if (((a - c)*(a - c) + (b - d)*(b - d)) != 5) {
     649             return 1;
     650         }
     651         else {
     652             //偏左右
     653             if (abs(a - c) == 1) {
     654                 //
     655                 if (a > c) {
     656                     if (b > d && !cb.v_position[a][b - 1]/*判断是否别马脚*/) {
     657                         //目标点是空位置,则可直接移到目标点
     658                         if (!cb.v_position[c][d]) {
     659                             return 2;
     660                         }
     661                         else {
     662                             //目标位置是己方棋子,则不能移动,返回1
     663                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     664                                 return 1;
     665                             }
     666                             else {
     667                                 return 3;
     668                             }
     669                         }
     670                     }
     671                     else if (b < d && !cb.v_position[a][b + 1]/*判断是否别马脚*/) {
     672                         //目标点是空位置,则可直接移到目标点
     673                         if (!cb.v_position[c][d]) {
     674                             return 2;
     675                         }
     676                         else {
     677                             //目标位置是己方棋子,则不能移动,返回1
     678                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     679                                 return 1;
     680                             }
     681                             else {
     682                                 return 3;
     683                             }
     684                         }
     685                     }
     686                     //别马脚了,不能移动
     687                     else {
     688                         return 1;
     689                     }
     690                 }
     691                 //
     692                 else {
     693                     if (b > d && !cb.v_position[a][b - 1]/*判断是否别马脚*/) {
     694                         //目标点是空位置,则可直接移到目标点
     695                         if (!cb.v_position[c][d]) {
     696                             return 2;
     697                         }
     698                         else {
     699                             //目标位置是己方棋子,则不能移动,返回1
     700                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     701                                 return 1;
     702                             }
     703                             else {
     704                                 return 3;
     705                             }
     706                         }
     707                     }
     708                     else if (b < d && !cb.v_position[a][b + 1]/*判断是否别马脚*/) {
     709                         //目标点是空位置,则可直接移到目标点
     710                         if (!cb.v_position[c][d]) {
     711                             return 2;
     712                         }
     713                         else {
     714                             //目标位置是己方棋子,则不能移动,返回1
     715                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     716                                 return 1;
     717                             }
     718                             else {
     719                                 return 3;
     720                             }
     721                         }
     722                     }
     723                     //别马脚了,不能移动
     724                     else {
     725                         return 1;
     726                     }
     727                 }
     728             }
     729             //偏上下
     730             else {
     731                 //
     732                 if (b > d) {
     733                     if (a > c && !cb.v_position[a - 1][b]/*判断是否别马脚*/) {
     734                         //目标点是空位置,则可直接移到目标点
     735                         if (!cb.v_position[c][d]) {
     736                             return 2;
     737                         }
     738                         else {
     739                             //目标位置是己方棋子,则不能移动,返回1
     740                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     741                                 return 1;
     742                             }
     743                             else {
     744                                 return 3;
     745                             }
     746                         }
     747                     }
     748                     else if (a < c && !cb.v_position[a + 1][b]/*判断是否别马脚*/) {
     749                         //目标点是空位置,则可直接移到目标点
     750                         if (!cb.v_position[c][d]) {
     751                             return 2;
     752                         }
     753                         else {
     754                             //目标位置是己方棋子,则不能移动,返回1
     755                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     756                                 return 1;
     757                             }
     758                             else {
     759                                 return 3;
     760                             }
     761                         }
     762                     }
     763                     //别马脚了,不能移动
     764                     else {
     765                         return 1;
     766                     }
     767                 }
     768                 //
     769                 else {
     770                     if (a > c && !cb.v_position[a - 1][b]/*判断是否别马脚*/) {
     771                         //目标点是空位置,则可直接移到目标点
     772                         if (!cb.v_position[c][d]) {
     773                             return 2;
     774                         }
     775                         else {
     776                             //目标位置是己方棋子,则不能移动,返回1
     777                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     778                                 return 1;
     779                             }
     780                             else {
     781                                 return 3;
     782                             }
     783                         }
     784                     }
     785                     else if (a < c && !cb.v_position[a + 1][b]/*判断是否别马脚*/) {
     786                         //目标点是空位置,则可直接移到目标点
     787                         if (!cb.v_position[c][d]) {
     788                             return 2;
     789                         }
     790                         else {
     791                             //目标位置是己方棋子,则不能移动,返回1
     792                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     793                                 return 1;
     794                             }
     795                             else {
     796                                 return 3;
     797                             }
     798                         }
     799                     }
     800                     //别马脚了,不能移动
     801                     else {
     802                         return 1;
     803                     }
     804                 }
     805             }
     806         }
     807     }
     808     else {
     809         return 1;
     810     }
     811 }
     812 
     813 int Pao::judge(int a, int b, int c, int d) {
     814     //用于标记炮中间是否隔子
     815     int flag;
     816     //判断目标点是否在棋盘界内
     817     if ((c >= 0 && c <= 9) && (d >= 0 && d <= 8)) {
     818         //判断炮是否走的是直线,否则不能移动,返回1
     819         if (a == c || b == d) {
     820             if (a == c) {        //横向移动
     821                 //目标点是自身,则不能移动,返回1
     822                 if (b == d) {
     823                     return 1;
     824                 }
     825                 else if (b > d) {
     826                     flag = 0;
     827                     for (int i = b - 1; i > d; i--) {
     828                         //中间有一子,flag++
     829                         if (cb.v_position[c][i])
     830                             flag++;
     831                     }
     832                     switch (flag) {
     833                     case 0:
     834                         //目标点是空位置,则可直接移到目标点
     835                         if (!cb.v_position[c][d]) {
     836                             return 2;
     837                         }
     838                         else {
     839                             //目标位置不为空,则不能移动
     840                             return 1;
     841                         }
     842                         break;
     843                     case 1:
     844                         //目标点是空位置,则炮无法隔一子移动
     845                         if (!cb.v_position[c][d]) {
     846                             return 1;
     847                         }
     848                         else {
     849                             //目标位置是己方棋子,则不能吃,返回1
     850                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     851                                 return 1;
     852                             }
     853                             else {
     854                                 return 3;
     855                             }
     856                         }
     857                         break;
     858                     default:
     859                         return 1;
     860 
     861                     }
     862 
     863                 }
     864                 else {
     865                     flag = 0;
     866                     for (int i = b + 1; i < d; i++) {
     867                         //中间有一子,flag++
     868                         if (cb.v_position[c][i])
     869                             flag++;
     870                     }
     871                     switch (flag) {
     872                     case 0:
     873                         //目标点是空位置,则可直接移到目标点
     874                         if (!cb.v_position[c][d]) {
     875                             return 2;
     876                         }
     877                         else {
     878                             //目标位置不为空,则不能移动
     879                             return 1;
     880                         }
     881                         break;
     882                     case 1:
     883                         //目标点是空位置,则炮无法隔一子移动
     884                         if (!cb.v_position[c][d]) {
     885                             return 1;
     886                         }
     887                         else {
     888                             //目标位置是己方棋子,则不能吃,返回1
     889                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     890                                 return 1;
     891                             }
     892                             else {
     893                                 return 3;
     894                             }
     895                         }
     896                         break;
     897                     default:
     898                         return 1;
     899 
     900                     }
     901                 }
     902             }
     903             else {            //纵向移动
     904                 //目标点是自身,则不能移动,返回1
     905                 if (a == c) {
     906                     return 1;
     907                 }
     908                 else if (a > c) {
     909                     flag = 0;
     910                     for (int i = a - 1; i > c; i--) {
     911                         //中间有一子,flag++
     912                         if (cb.v_position[i][d])
     913                             flag++;
     914                     }
     915                     switch (flag) {
     916                     case 0:
     917                         //目标点是空位置,则可直接移到目标点
     918                         if (!cb.v_position[c][d]) {
     919                             return 2;
     920                         }
     921                         else {
     922                             //目标位置不为空,则不能移动
     923                             return 1;
     924                         }
     925                         break;
     926                     case 1:
     927                         //目标点是空位置,则炮无法隔一子移动
     928                         if (!cb.v_position[c][d]) {
     929                             return 1;
     930                         }
     931                         else {
     932                             //目标位置是己方棋子,则不能吃,返回1
     933                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     934                                 return 1;
     935                             }
     936                             else {
     937                                 return 3;
     938                             }
     939                         }
     940                         break;
     941                     default:
     942                         return 1;
     943 
     944                     }
     945 
     946                 }
     947                 else {
     948                     flag = 0;
     949                     for (int i = a + 1; i < c; i++) {
     950                         //中间有一子,flag++
     951                         if (cb.v_position[i][d])
     952                             flag++;
     953                     }
     954                     switch (flag) {
     955                     case 0:
     956                         //目标点是空位置,则可直接移到目标点
     957                         if (!cb.v_position[c][d]) {
     958                             return 2;
     959                         }
     960                         else {
     961                             //目标位置不为空,则不能移动
     962                             return 1;
     963                         }
     964                         break;
     965                     case 1:
     966                         //目标点是空位置,则炮无法隔一子移动
     967                         if (!cb.v_position[c][d]) {
     968                             return 1;
     969                         }
     970                         else {
     971                             //目标位置是己方棋子,则不能吃,返回1
     972                             if (cb.v_position[c][d]->getColor() == cb.v_position[a][b]->getColor()) {
     973                                 return 1;
     974                             }
     975                             else {
     976                                 return 3;
     977                             }
     978                         }
     979                         break;
     980                     default:
     981                         return 1;
     982 
     983                     }
     984                 }
     985             }
     986         }
     987         //炮不走直线,不能移动,返回1
     988         else {
     989             return 1;
     990         }
     991     }
     992     else {
     993         return 1;
     994     }
     995 }
     996 
     997 //judgePositionIsNULL
     998 bool Player::judge(int a, int b)
     999 {
    1000     if (!cb.judgePositionIsNULL(a, b) && cb.judgePositionIsColor(a, b) == color)
    1001         return true;
    1002     else
    1003         return false;
    1004 }
    1005 void Player::moveChess(int a, int b, int c, int d)
    1006 {
    1007     cb.v_position[c][d] = cb.v_position[a][b];
    1008     cb.v_position[a][b] = NULL;
    1009 }
    1010 void Player::eatChess(int a, int b, int c, int d)
    1011 {
    1012     if (cb.v_position[c][d]->getName() == "" || cb.v_position[c][d]->getName() == "")
    1013     {
    1014         cb.v_position[c][d] = cb.v_position[a][b];
    1015         cb.v_position[a][b] = NULL;
    1016         system("cls");
    1017         cb.showBoard();
    1018         if (cb.v_position[c][d]->getColor() == 1)
    1019             cout << "红棋方即上方玩家胜利" << endl;
    1020         if (cb.v_position[c][d]->getColor() == 2)
    1021             cout << "黑棋方即下方玩家胜利" << endl;
    1022         system("pause");
    1023         exit(0);
    1024     }
    1025     else
    1026     {
    1027         cb.v_position[c][d] = cb.v_position[a][b];
    1028         cb.v_position[a][b] = NULL;
    1029     }
    1030 }
    1031 void Player::inPut()
    1032 {
    1033     int a, b, c, d;
    1034     cout << "输入要移动的子位置坐标  先行数再列数 :";
    1035     while (cin >> a >> b) {
    1036         //判断选择点是否在棋盘界内
    1037         if ((a >= 0 && a <= 9) && (b >= 0 && b <= 8) && judge(a, b)) {
    1038             break;
    1039         }
    1040         system("cls");
    1041         cb.showBoard();
    1042         cout << "选择位置不合法,请重新输入:";
    1043     }
    1044     cout << "输入目标位置:";
    1045     while (cin >> c >> d) {
    1046         //判断选择点是否在棋盘界内
    1047         if ((a >= 0 && a <= 9) && (b >= 0 && b <= 8) && cb.v_position[a][b]->judge(a, b, c, d) != 1) {
    1048             break;
    1049         }
    1050         system("cls");
    1051         cb.showBoard();
    1052         cout << "目标位置不合法 无法移动,请重新输入:";
    1053     }
    1054     /*if (cb.v_position[a][b]->judge(a, b, c, d) == 1)
    1055     {
    1056         system("cls");
    1057         cb.showBoard();
    1058         cout << "目标位置不合法 无法移动" << endl;
    1059         inPut();
    1060     }*/
    1061     if (cb.v_position[a][b]->judge(a, b, c, d) == 2)
    1062     {
    1063         moveChess(a, b, c, d);
    1064     }
    1065     else      //(cb.v_position[a][b]->judge(a, b, c, d) == 3)
    1066     {
    1067         eatChess(a, b, c, d);
    1068     }
    1069 }
    1070 int main()
    1071 {
    1072     Player player1(1);
    1073     Player player2(2);
    1074     cb.init_Red();
    1075     cb.init_Black();
    1076     cout << cb.v_position[0][2]->judge(0220);
    1077 
    1078     while (1)
    1079     {
    1080         system("cls");
    1081         cb.showBoard();
    1082         cout << "上方玩家";
    1083         player1.inPut();
    1084         system("cls");
    1085         cb.showBoard();
    1086         cout << "下方玩家";
    1087         player2.inPut();
    1088     }
    1089     return 0;
    1090 

    1091 } 

  • 相关阅读:
    NGINX -- 详解Nginx几种常见实现301重定向方法上的区别
    数据库外键的使用以及优缺点
    phpok -- 域名问题
    Sql Server系列:多表连接查询
    Go -- cron定时任务的用法
    JavaScript -- 清除缓存
    sql CAST用法
    Mock -- 数据模拟
    EsLint入门
    citus real-time 分析demo( 来自官方文档)
  • 原文地址:https://www.cnblogs.com/qjm253/p/5374913.html
Copyright © 2020-2023  润新知