Fields.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <iostream>
  2. #include "Fields.h"
  3. bool Fields::hasState(const Vector& v, State state) const {
  4. return fields[v.x][v.y] == state;
  5. }
  6. Fields::State Fields::getState(const Vector& v) const {
  7. return fields[v.x][v.y];
  8. }
  9. void Fields::setState(const Vector& v, State state) {
  10. fields[v.x][v.y] = state;
  11. }
  12. void Fields::print(const Vector& active) {
  13. String s;
  14. toString(s, active);
  15. std::cerr << s;
  16. }
  17. char Fields::getChar(int x, int y, const Vector& active) const {
  18. if(active.compare(x, y)) {
  19. return '*';
  20. }
  21. static const char map[] = {'#', 'O', '.'};
  22. return map[fields[x][y]];
  23. }
  24. void Fields::toString(String& s, const Vector& active) const {
  25. s.append(" 0 1 2 3 4 5 6 7 8\n");
  26. lineToString(s, 0, active);
  27. s.append(" |\\|/|\\|/|\\|/|\\|/|\n");
  28. lineToString(s, 1, active);
  29. s.append(" |/|\\|/|\\|/|\\|/|\\|\n");
  30. lineToString(s, 2, active);
  31. s.append(" |\\|/|\\|/|\\|/|\\|/|\n");
  32. lineToString(s, 3, active);
  33. s.append(" |/|\\|/|\\|/|\\|/|\\|\n");
  34. lineToString(s, 4, active);
  35. s.append("\n");
  36. }
  37. void Fields::lineToString(String& s, int y, const Vector& active) const {
  38. s.append(y + '0').append(' ');
  39. for(int x = 0; x < 8; x++) {
  40. s.append(getChar(x, y, active)).append('-');
  41. }
  42. s.append(getChar(8, y, active)).append("\n\r");
  43. }
  44. void Fields::consumeLine() const {
  45. // skip until newline
  46. while(std::cin.get() != '\n');
  47. // skip any trailing line carriage
  48. while(true) {
  49. char c = std::cin.peek();
  50. if(c != '\r') {
  51. break;
  52. }
  53. std::cin.get();
  54. }
  55. }
  56. void Fields::readLine(uint y) {
  57. // skip line heading
  58. std::cin.get();
  59. std::cin.get();
  60. std::cin.get();
  61. for(uint x = 0; x < 9; x++) {
  62. // read field state
  63. char c = std::cin.get();
  64. if(c == '2') {
  65. fields[x][y] = BLACK;
  66. } else if(c == '0') {
  67. fields[x][y] = EMPTY;
  68. } else if(c == '1') {
  69. fields[x][y] = WHITE;
  70. } else {
  71. std::cerr << "game field parsing error\n";
  72. }
  73. // skip " - " until the next field (or the next line for x = 8)
  74. std::cin.get();
  75. std::cin.get();
  76. std::cin.get();
  77. }
  78. }
  79. void Fields::read() {
  80. for(uint i = 0; i < 5; i++) {
  81. consumeLine();
  82. readLine(i);
  83. }
  84. }