/examples/Snake/snake.d

http://github.com/wilkie/djehuty · D · 118 lines · 90 code · 28 blank · 0 comment · 10 complexity · c21d33a7205b133993b23a6c1daec9e9 MD5 · raw file

  1. import djehuty;
  2. import posn;
  3. enum MoveResult {
  4. Ok,
  5. CollisionSelf,
  6. }
  7. class Snake {
  8. this(uint max_x, uint max_y, Dir d) {
  9. Posn.SetBounds(max_x, max_y);
  10. _max_x = max_x;
  11. _max_y = max_y;
  12. direction = d;
  13. _max_length = max_x * max_y / 2;
  14. _segments = new List!(Posn);
  15. _segments.add(new Posn(max_x/2, max_y/2));
  16. }
  17. Snake dup() {
  18. Snake ret = new Snake(_max_x, _max_y, direction);
  19. ret._segments = _segments.dup;
  20. return ret;
  21. }
  22. void direction(Dir d) {
  23. _direction = d;
  24. }
  25. Dir direction() {
  26. return _direction;
  27. }
  28. Posn[] segments() {
  29. return _segments.array();
  30. }
  31. Posn head() {
  32. return first(segments);
  33. }
  34. Posn neck() {
  35. return second(segments);
  36. }
  37. Posn[] torso() {
  38. return rest(segments);
  39. }
  40. Posn tail() {
  41. return last(segments);
  42. }
  43. bool isVertical() {
  44. return direction == Dir.Up || direction == Dir.Down;
  45. }
  46. uint length() {
  47. return _segments.length();
  48. }
  49. void reverse() {
  50. _segments = _segments.reverse();
  51. }
  52. void elongate(uint num = 1) {
  53. for (; length < _max_length && num > 0; num--)
  54. _segments.add(tail.dup());
  55. }
  56. int opEquals(Posn p) {
  57. foreach (Posn s; torso)
  58. if (s == p)
  59. return 1;
  60. return 0;
  61. }
  62. MoveResult slither() {
  63. foreach_reverse (uint i, Posn s; torso)
  64. s.moveTo(_segments[i]);
  65. switch (_direction) {
  66. case Dir.Up:
  67. head.y = head.y - 1;
  68. break;
  69. case Dir.Down:
  70. head.y = head.y + 1;
  71. break;
  72. case Dir.Left:
  73. head.x = head.x - 1;
  74. break;
  75. case Dir.Right:
  76. head.x = head.x + 1;
  77. break;
  78. default:
  79. break;
  80. }
  81. if (this == head)
  82. return MoveResult.CollisionSelf;
  83. return MoveResult.Ok;
  84. }
  85. private:
  86. uint _max_x, _max_y;
  87. uint _max_length;
  88. Dir _direction;
  89. List!(Posn) _segments;
  90. }