human.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /* $NetBSD: human.cc,v 1.1 2003/12/27 01:16:55 christos Exp $ */
  2. /*-
  3. * Copyright (c) 2003 The NetBSD Foundation, Inc.
  4. * All rights reserved.
  5. *
  6. * This code is derived from software contributed to The NetBSD Foundation
  7. * by Christos Zoulas.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions
  11. * are met:
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in the
  16. * documentation and/or other materials provided with the distribution.
  17. * 3. All advertising materials mentioning features or use of this software
  18. * must display the following acknowledgement:
  19. * This product includes software developed by the NetBSD
  20. * Foundation, Inc. and its contributors.
  21. * 4. Neither the name of The NetBSD Foundation nor the names of its
  22. * contributors may be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  26. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  27. * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  28. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
  29. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  32. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  33. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  34. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  35. * POSSIBILITY OF SUCH DAMAGE.
  36. */
  37. /*
  38. * human.C: Human interface for dots, using rogue-like keys.
  39. */
  40. #include "defs.h"
  41. RCSID("$NetBSD: human.cc,v 1.1 2003/12/27 01:16:55 christos Exp $")
  42. #include "human.h"
  43. #include "board.h"
  44. #include "box.h"
  45. #define CONTROL(a) ((a) & 037)
  46. HUMAN::HUMAN(const char c) :
  47. PLAYER(c),
  48. _curx(0),
  49. _cury(1)
  50. {
  51. }
  52. void HUMAN::play(const BOARD& b, size_t& y, size_t& x, int& dir)
  53. {
  54. int mv;
  55. b.setpos(_cury, _curx);
  56. for (;;) {
  57. switch (mv = b.getmove()) {
  58. case 'h': case 'H':
  59. _curx -= 2;
  60. break;
  61. case 'l': case 'L':
  62. _curx += 2;
  63. break;
  64. case 'k': case 'K':
  65. _cury -= 2;
  66. break;
  67. case 'j': case 'J':
  68. _cury += 2;
  69. break;
  70. case 'u': case 'U':
  71. _curx += 1;
  72. _cury -= 1;
  73. break;
  74. case 'y': case 'Y':
  75. _curx -= 1;
  76. _cury -= 1;
  77. break;
  78. case 'b': case 'B':
  79. _curx -= 1;
  80. _cury += 1;
  81. break;
  82. case 'n': case 'N':
  83. _curx += 1;
  84. _cury += 1;
  85. break;
  86. case 'q': case 'Q':
  87. exit(0);
  88. case CONTROL('L'): case CONTROL('R'):
  89. b.clean();
  90. b.paint();
  91. break;
  92. case ' ':
  93. {
  94. x = _curx / 2;
  95. y = _cury / 2;
  96. if (_cury & 1) {
  97. if (_curx == 0)
  98. dir = BOX::left;
  99. else {
  100. x--;
  101. dir = BOX::right;
  102. }
  103. }
  104. if (_curx & 1) {
  105. if (_cury == 0)
  106. dir = BOX::top;
  107. else {
  108. y--;
  109. dir = BOX::bottom;
  110. }
  111. }
  112. }
  113. return;
  114. default:
  115. break;
  116. }
  117. // We add 2 before the comparison to avoid underflow
  118. if ((2 + _curx) - (_curx & 1) < 2)
  119. _curx = (b.nx() * 2) + (_curx & 1);
  120. if (_curx >= (b.nx() * 2) + 1)
  121. _curx = (_curx & 1);
  122. if ((2 + _cury) - (_cury & 1) < 2)
  123. _cury = (b.ny() * 2) + (_cury & 1);
  124. if (_cury >= (b.ny() * 2) + 1)
  125. _cury = (_cury & 1);
  126. b.setpos(_cury, _curx);
  127. }
  128. }