zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第8章:面向对象设计——题目8

    2014-04-23 23:49

    题目:有个棋牌游戏叫Othello,也叫Reversi。请看游戏规则。中文应该叫黑白棋吧,不常玩儿就是了。

    解法:既然这题的规则很清楚,也很清楚,我就写了一个命令行的程序来模拟玩游戏的过程。

    代码:

      1 // 8.8 Othello game, the rule is balabala. Try to design a class to play the game.
      2 // Here are the rules:
      3 //    1. two players, one black, one white, play alternatively, black first.
      4 //    2. the board is 8x8, two blacks and two whites are placed in the center first.
      5 // 00000000
      6 // 00000000
      7 // 00000000
      8 // 000bw000
      9 // 000wb000
     10 // 00000000
     11 // 00000000
     12 // 00000000
     13 //    3. every time, a player has to place a piece on an empty position, if the eight directions have the player's pieces, then all the opponent's pieces trapped between those pieces and the new piece is flipped to the current player.
     14 //    4. for every move, the player must at least flip one of the opponent's pieces.
     15 //    5. if a player is unable to make a move, the game ends. Whoever has more pieces on the board wins.
     16 #include <cstdio>
     17 #include <vector>
     18 using namespace std;
     19 
     20 class OthelloGame {
     21 public:
     22     OthelloGame() {
     23         board.resize(8);
     24         possible_position.resize(8);
     25         int i, j;
     26         for (i = 0; i < 8; ++i) {
     27             board[i].resize(8);
     28             possible_position[i].resize(8);
     29         }
     30         for (i = 0; i < 8; ++i) {
     31             for (j = 0; j < 8; ++j) {
     32                 board[i][j] = 0;
     33             }
     34         }
     35         board[3][3] = board[4][4] = 1;
     36         board[3][4] = board[4][3] = 2;
     37         winner = 0;
     38         
     39         dd[0][0] = -1;
     40         dd[0][1] = -1;
     41         dd[1][0] = -1;
     42         dd[1][1] = 0;
     43         dd[2][0] = -1;
     44         dd[2][1] = +1;
     45         dd[3][0] = 0;
     46         dd[3][1] = -1;
     47         dd[4][0] = 0;
     48         dd[4][1] = +1;
     49         dd[5][0] = +1;
     50         dd[5][1] = -1;
     51         dd[6][0] = +1;
     52         dd[6][1] = 0;
     53         dd[7][0] = +1;
     54         dd[7][1] = +1;
     55     };
     56     
     57     bool playGame() {
     58         int i, j;
     59         int x, y;
     60         int current_player;
     61         int pc[2];
     62         
     63         current_player = 1;
     64         while (!winner) {
     65             if (!checkPositions(current_player)) {
     66                 pc[0] = pc[1] = 0;
     67                 for (i = 0; i < 8; ++i) {
     68                     for (j = 0; j < 8; ++j) {
     69                         if (board[i][j]) {
     70                             ++pc[board[i][j] - 1];
     71                         }
     72                     }
     73                 }
     74                 winner = (pc[0] > pc[1] ? 1 : pc[0] < pc[1] ? 2 : 0);
     75                 break;
     76             }
     77             while (true) {
     78                 printBoard();
     79                 printf("Player %d please move: ", current_player);
     80                 scanf("%d%d", &x, &y);
     81                 if (inBound(x, y) && possible_position[x][y]) {
     82                     setPiece(x, y, current_player);
     83                     current_player = (current_player == 1) ? 2 : 1;
     84                     break;
     85                 } else {
     86                     printf("Invalid move.
    ");
     87                 }
     88             }
     89         }
     90         return 0;
     91     };
     92     
     93     ~OthelloGame() {
     94         int i;
     95         
     96         for (i = 0; i < 8; ++i) {
     97             board[i].clear();
     98             possible_position[i].clear();
     99         }
    100         board.clear();
    101         possible_position.clear();
    102     }
    103 private:
    104     // 1 for player one, 2 for player two, 0 for empty.
    105     vector<vector<int> > board;
    106     vector<vector<int> > possible_position;
    107     int dd[8][2];
    108     int winner;
    109     
    110     void printBoard() {
    111         int i, j;
    112         putchar(' ');
    113         putchar(' ');
    114         for (i = 0; i < 8; ++i) {
    115             putchar('0' + i);
    116             putchar(' ');
    117         }
    118         puts("                  
    ");
    119         for (i = 0; i < 8; ++i) {
    120             putchar('0' + i);
    121             putchar(' ');
    122             for (j = 0; j < 8; ++j) {
    123                 putchar('0' + board[i][j]);
    124                 putchar(' ');
    125             }
    126             putchar('
    ');
    127         }
    128     };
    129     
    130     bool inBound(int x, int y) {
    131         return x >= 0 && x <= 7 && y >= 0 && y <= 7;
    132     };
    133     
    134     bool checkPositions(int current_player) {
    135         int i, j, k;
    136         int x, y;
    137         int len;
    138         int count;
    139         
    140         for (i = 0; i < 8; ++i) {
    141             for (j = 0; j < 8; ++j) {
    142                 possible_position[i][j] = 0;
    143             }
    144         }
    145         count = 0;
    146         
    147         for (i = 0; i < 8; ++i) {
    148             for (j = 0; j < 8; ++j) {
    149                 if (board[i][j]) {
    150                     continue;
    151                 }
    152                 for (k = 0; k < 8; ++k) {
    153                     len = 1;
    154                     while (true) {
    155                         x = i + len * dd[k][0];
    156                         y = j + len * dd[k][1];
    157                         if (!inBound(x, y)) {
    158                             break;
    159                         }
    160                         if (board[x][y] == 0) {
    161                             break;
    162                         } else if (board[x][y] == current_player) {
    163                             if (len > 1) {
    164                                 possible_position[i][j] = 1;
    165                                 ++count;
    166                             }
    167                             break;
    168                         } else {
    169                             ++len;
    170                         }
    171                     }
    172                     if (possible_position[i][j]) {
    173                         break;
    174                     }
    175                 }
    176             }
    177         }
    178         
    179         return count > 0;
    180     };
    181     
    182     void setPiece(int x, int y, int current_player) {
    183         int xx, yy;
    184         int k;
    185         int len;
    186         
    187         board[x][y] = current_player;
    188         for (k = 0; k < 8; ++k) {
    189             len = 1;
    190             while (true) {
    191                 xx = x + len * dd[k][0];
    192                 yy = y + len * dd[k][1];
    193                 if (!inBound(x, y)) {
    194                     break;
    195                 }
    196                 if (board[xx][yy] == 0) {
    197                     break;
    198                 } else if (board[xx][yy] == current_player) {
    199                     while (--len > 0) {
    200                         xx = x + len * dd[k][0];
    201                         yy = y + len * dd[k][1];
    202                         board[xx][yy] = current_player;
    203                     }
    204                 } else {
    205                     ++len;
    206                 }
    207             }
    208         }
    209     };
    210 };
    211 
    212 int main()
    213 {
    214     OthelloGame game;
    215     
    216     game.playGame();
    217     
    218     return 0;
    219 }
  • 相关阅读:
    CentOS怎样强制卸载PHP以及自定义安装PHP
    HTMLparser 笔记
    linux如何查看CPU,内存,机器型号,网卡信息
    PC机做ISCSI存储服务器故障
    [ Python
    [ Python
    [ Python
    [ Python
    [ Python
    [ Python
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3684337.html
Copyright © 2011-2022 走看看