logic.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <event.h>
  5. #include "mahjongg.h"
  6. Click NC = { -1, 0, 0, };
  7. Click
  8. Cl(int d, int x, int y)
  9. {
  10. return (Click){d, x, y};
  11. }
  12. int
  13. eqcl(Click c1, Click c2)
  14. {
  15. return c1.d == c2.d && c1.x == c2.x && c1.y == c2.y;
  16. }
  17. int
  18. freeup(Click c)
  19. {
  20. if(c.d == Depth -1 || (level.board[c.d+1][c.x][c.y].which == None &&
  21. level.board[c.d+1][c.x+1][c.y].which == None &&
  22. level.board[c.d+1][c.x][c.y+1].which == None &&
  23. level.board[c.d+1][c.x+1][c.y+1].which == None))
  24. return 1;
  25. return 0;
  26. }
  27. int
  28. freeleft(Click c)
  29. {
  30. if(c.x == 0 || (level.board[c.d][c.x-1][c.y].which == None &&
  31. level.board[c.d][c.x-1][c.y+1].which == None))
  32. return 1;
  33. return 0;
  34. }
  35. int
  36. freeright(Click c)
  37. {
  38. if(c.x == Lx-2 || (level.board[c.d][c.x+2][c.y].which == None &&
  39. level.board[c.d][c.x+2][c.y+1].which == None))
  40. return 1;
  41. return 0;
  42. }
  43. int
  44. isfree(Click c)
  45. {
  46. return (freeleft(c) || freeright(c)) && freeup(c);
  47. }
  48. Click
  49. cmatch(Click c, int dtop)
  50. {
  51. Click lc;
  52. lc.d = dtop;
  53. do {
  54. for(lc.y = 0; lc.y < Ly; lc.y++)
  55. for(lc.x = 0; lc.x < Lx; lc.x++)
  56. if(level.board[lc.d][lc.x][lc.y].which == TL &&
  57. isfree(lc) && !eqcl(c, lc) &&
  58. level.board[c.d][c.x][c.y].type ==
  59. level.board[lc.d][lc.x][lc.y].type)
  60. return lc;
  61. } while(--lc.d >= 0);
  62. return NC;
  63. }
  64. Brick *
  65. bmatch(Click c)
  66. {
  67. Click lc;
  68. lc = cmatch(c, Depth);
  69. if(lc.d == -1)
  70. return nil;
  71. else
  72. return &level.board[lc.d][lc.x][lc.y];
  73. }
  74. int
  75. canmove(void)
  76. {
  77. Click c;
  78. for(c.d = Depth - 1; c.d >= 0; c.d--)
  79. for(c.y = 0; c.y < Ly; c.y++)
  80. for(c.x = 0; c.x < Lx; c.x++)
  81. if(level.board[c.d][c.x][c.y].which == TL &&
  82. isfree(c) && bmatch(c) != nil)
  83. return 1;
  84. return 0;
  85. }