Othello
Dependencies: mbed
othello.h@0:8c7f841516ab, 2018-09-04 (annotated)
- Committer:
- Yuto_K
- Date:
- Tue Sep 04 04:07:41 2018 +0000
- Revision:
- 0:8c7f841516ab
Othello;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yuto_K | 0:8c7f841516ab | 1 | #include <stdint.h> |
Yuto_K | 0:8c7f841516ab | 2 | #include <stdlib.h> |
Yuto_K | 0:8c7f841516ab | 3 | #include <string.h> |
Yuto_K | 0:8c7f841516ab | 4 | #include <vector> |
Yuto_K | 0:8c7f841516ab | 5 | #define EMPTY 0 |
Yuto_K | 0:8c7f841516ab | 6 | #define BLACK 1 |
Yuto_K | 0:8c7f841516ab | 7 | #define WHITE -1 |
Yuto_K | 0:8c7f841516ab | 8 | |
Yuto_K | 0:8c7f841516ab | 9 | class Board{ |
Yuto_K | 0:8c7f841516ab | 10 | public: |
Yuto_K | 0:8c7f841516ab | 11 | int8_t board[8][8]; |
Yuto_K | 0:8c7f841516ab | 12 | int8_t turn; |
Yuto_K | 0:8c7f841516ab | 13 | Board(){ |
Yuto_K | 0:8c7f841516ab | 14 | for(int8_t i=0;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 15 | for(int8_t j=0;j<8;j++)board[i][j]=EMPTY; |
Yuto_K | 0:8c7f841516ab | 16 | } |
Yuto_K | 0:8c7f841516ab | 17 | board[3][4]=BLACK;board[4][3]=BLACK; |
Yuto_K | 0:8c7f841516ab | 18 | board[3][3]=WHITE;board[4][4]=WHITE; |
Yuto_K | 0:8c7f841516ab | 19 | turn=BLACK; |
Yuto_K | 0:8c7f841516ab | 20 | } |
Yuto_K | 0:8c7f841516ab | 21 | void SetBoard(int8_t board[8][8]){ |
Yuto_K | 0:8c7f841516ab | 22 | memcpy(this->board,board,sizeof board); |
Yuto_K | 0:8c7f841516ab | 23 | } |
Yuto_K | 0:8c7f841516ab | 24 | }; |
Yuto_K | 0:8c7f841516ab | 25 | |
Yuto_K | 0:8c7f841516ab | 26 | void SetLEDBoard(Board board); |
Yuto_K | 0:8c7f841516ab | 27 | |
Yuto_K | 0:8c7f841516ab | 28 | /*void ResetBoard(){ |
Yuto_K | 0:8c7f841516ab | 29 | for(uint8_t i=0;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 30 | for(uint8_t j=0;j<8;j++)board[i][j]=EMPTY; |
Yuto_K | 0:8c7f841516ab | 31 | } |
Yuto_K | 0:8c7f841516ab | 32 | board[3][4]=BLACK;board[4][3]=BLACK; |
Yuto_K | 0:8c7f841516ab | 33 | board[3][3]=WHITE;board[4][4]=WHITE; |
Yuto_K | 0:8c7f841516ab | 34 | }*/ |
Yuto_K | 0:8c7f841516ab | 35 | |
Yuto_K | 0:8c7f841516ab | 36 | bool CanRight(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 37 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 38 | if(x<=5&&board.board[x+1][y]==enemy){ |
Yuto_K | 0:8c7f841516ab | 39 | for(int8_t i=x+2;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 40 | if(board.board[i][y]==color)return true; |
Yuto_K | 0:8c7f841516ab | 41 | else if(board.board[i][y]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 42 | } |
Yuto_K | 0:8c7f841516ab | 43 | } |
Yuto_K | 0:8c7f841516ab | 44 | return false; |
Yuto_K | 0:8c7f841516ab | 45 | } |
Yuto_K | 0:8c7f841516ab | 46 | |
Yuto_K | 0:8c7f841516ab | 47 | bool CanLeft(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 48 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 49 | if(x>=2&&board.board[x-1][y]==enemy){ |
Yuto_K | 0:8c7f841516ab | 50 | for(int8_t i=x-2;i>=0;i--){ |
Yuto_K | 0:8c7f841516ab | 51 | if(board.board[i][y]==color)return true; |
Yuto_K | 0:8c7f841516ab | 52 | else if(board.board[i][y]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 53 | } |
Yuto_K | 0:8c7f841516ab | 54 | } |
Yuto_K | 0:8c7f841516ab | 55 | return false; |
Yuto_K | 0:8c7f841516ab | 56 | } |
Yuto_K | 0:8c7f841516ab | 57 | |
Yuto_K | 0:8c7f841516ab | 58 | bool CanUp(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 59 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 60 | if(y>=2&&board.board[x][y-1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 61 | for(int8_t i=y-2;i>=0;i--){ |
Yuto_K | 0:8c7f841516ab | 62 | if(board.board[x][i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 63 | else if(board.board[x][i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 64 | } |
Yuto_K | 0:8c7f841516ab | 65 | } |
Yuto_K | 0:8c7f841516ab | 66 | return false; |
Yuto_K | 0:8c7f841516ab | 67 | } |
Yuto_K | 0:8c7f841516ab | 68 | |
Yuto_K | 0:8c7f841516ab | 69 | bool CanDown(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 70 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 71 | if(y<=5&&board.board[x][y+1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 72 | for(int8_t i=y+2;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 73 | if(board.board[x][i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 74 | else if(board.board[x][i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 75 | } |
Yuto_K | 0:8c7f841516ab | 76 | } |
Yuto_K | 0:8c7f841516ab | 77 | return false; |
Yuto_K | 0:8c7f841516ab | 78 | } |
Yuto_K | 0:8c7f841516ab | 79 | |
Yuto_K | 0:8c7f841516ab | 80 | bool CanRightUp(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 81 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 82 | if(x<=5&&y>=2&&board.board[x+1][y-1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 83 | int8_t i=2; |
Yuto_K | 0:8c7f841516ab | 84 | while(x+i<8&&y-i>=0){ |
Yuto_K | 0:8c7f841516ab | 85 | if(board.board[x+i][y-i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 86 | else if(board.board[x+i][y-i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 87 | i++; |
Yuto_K | 0:8c7f841516ab | 88 | } |
Yuto_K | 0:8c7f841516ab | 89 | } |
Yuto_K | 0:8c7f841516ab | 90 | return false; |
Yuto_K | 0:8c7f841516ab | 91 | } |
Yuto_K | 0:8c7f841516ab | 92 | |
Yuto_K | 0:8c7f841516ab | 93 | bool CanRightDown(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 94 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 95 | if(x<=5&&y<=5&&board.board[x+1][y+1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 96 | int8_t i=2; |
Yuto_K | 0:8c7f841516ab | 97 | while(x+i<8&&y+i<8){ |
Yuto_K | 0:8c7f841516ab | 98 | if(board.board[x+i][y+i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 99 | else if(board.board[x+i][y+i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 100 | i++; |
Yuto_K | 0:8c7f841516ab | 101 | } |
Yuto_K | 0:8c7f841516ab | 102 | } |
Yuto_K | 0:8c7f841516ab | 103 | return false; |
Yuto_K | 0:8c7f841516ab | 104 | } |
Yuto_K | 0:8c7f841516ab | 105 | |
Yuto_K | 0:8c7f841516ab | 106 | bool CanLeftDown(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 107 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 108 | if(x>=2&&y<=5&&board.board[x-1][y+1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 109 | int8_t i=2; |
Yuto_K | 0:8c7f841516ab | 110 | while(x-i>=0&&y+i<8){ |
Yuto_K | 0:8c7f841516ab | 111 | if(board.board[x-i][y+i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 112 | else if(board.board[x-i][y+i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 113 | i++; |
Yuto_K | 0:8c7f841516ab | 114 | } |
Yuto_K | 0:8c7f841516ab | 115 | } |
Yuto_K | 0:8c7f841516ab | 116 | return false; |
Yuto_K | 0:8c7f841516ab | 117 | } |
Yuto_K | 0:8c7f841516ab | 118 | |
Yuto_K | 0:8c7f841516ab | 119 | bool CanLeftUp(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 120 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 121 | if(x>=2&&y>=2&&board.board[x-1][y-1]==enemy){ |
Yuto_K | 0:8c7f841516ab | 122 | int8_t i=2; |
Yuto_K | 0:8c7f841516ab | 123 | while(x-i>=0&&y-i>=0){ |
Yuto_K | 0:8c7f841516ab | 124 | if(board.board[x-i][y-i]==color)return true; |
Yuto_K | 0:8c7f841516ab | 125 | else if(board.board[x-i][y-i]==EMPTY)break; |
Yuto_K | 0:8c7f841516ab | 126 | i++; |
Yuto_K | 0:8c7f841516ab | 127 | } |
Yuto_K | 0:8c7f841516ab | 128 | } |
Yuto_K | 0:8c7f841516ab | 129 | return false; |
Yuto_K | 0:8c7f841516ab | 130 | } |
Yuto_K | 0:8c7f841516ab | 131 | |
Yuto_K | 0:8c7f841516ab | 132 | bool CanPut(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 133 | return CanRight(board,x,y,color)||CanLeft(board,x,y,color)||CanUp(board,x,y,color)||CanDown(board,x,y,color)||CanRightUp(board,x,y,color)||CanRightDown(board,x,y,color)||CanLeftDown(board,x,y,color)||CanLeftUp(board,x,y,color); |
Yuto_K | 0:8c7f841516ab | 134 | } |
Yuto_K | 0:8c7f841516ab | 135 | |
Yuto_K | 0:8c7f841516ab | 136 | std::vector<uint8_t> GetPutCoords(Board board,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 137 | std::vector<uint8_t> coords; |
Yuto_K | 0:8c7f841516ab | 138 | for(int8_t i=0;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 139 | for(int8_t j=0;j<8;j++){ |
Yuto_K | 0:8c7f841516ab | 140 | led_board[i+8][j+8].red=255; |
Yuto_K | 0:8c7f841516ab | 141 | if(CanPut(board,i,j,color))coords.push_back(i*8+j);//ここの18回目の実行で上のCanDownからCanRightUpの間で止まる |
Yuto_K | 0:8c7f841516ab | 142 | } |
Yuto_K | 0:8c7f841516ab | 143 | } |
Yuto_K | 0:8c7f841516ab | 144 | return coords; |
Yuto_K | 0:8c7f841516ab | 145 | } |
Yuto_K | 0:8c7f841516ab | 146 | |
Yuto_K | 0:8c7f841516ab | 147 | Board PutStone(Board board,int8_t x,int8_t y,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 148 | Board _dummyboard; |
Yuto_K | 0:8c7f841516ab | 149 | int8_t dummyboard[8][8]; |
Yuto_K | 0:8c7f841516ab | 150 | int8_t enemy=-color; |
Yuto_K | 0:8c7f841516ab | 151 | uint8_t i; |
Yuto_K | 0:8c7f841516ab | 152 | memcpy(dummyboard,board.board,sizeof board.board); |
Yuto_K | 0:8c7f841516ab | 153 | _dummyboard.SetBoard(dummyboard); |
Yuto_K | 0:8c7f841516ab | 154 | if(CanRight(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 155 | i=x+1; |
Yuto_K | 0:8c7f841516ab | 156 | while(dummyboard[i][y]==enemy){ |
Yuto_K | 0:8c7f841516ab | 157 | dummyboard[i][y]=color; |
Yuto_K | 0:8c7f841516ab | 158 | i+=1; |
Yuto_K | 0:8c7f841516ab | 159 | } |
Yuto_K | 0:8c7f841516ab | 160 | } |
Yuto_K | 0:8c7f841516ab | 161 | if(CanLeft(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 162 | i=x-1; |
Yuto_K | 0:8c7f841516ab | 163 | while(dummyboard[i][y]==enemy){ |
Yuto_K | 0:8c7f841516ab | 164 | dummyboard[i][y]=color; |
Yuto_K | 0:8c7f841516ab | 165 | i-=1; |
Yuto_K | 0:8c7f841516ab | 166 | } |
Yuto_K | 0:8c7f841516ab | 167 | } |
Yuto_K | 0:8c7f841516ab | 168 | if(CanUp(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 169 | i=y-1; |
Yuto_K | 0:8c7f841516ab | 170 | while(dummyboard[x][i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 171 | dummyboard[x][i]=color; |
Yuto_K | 0:8c7f841516ab | 172 | i-=1; |
Yuto_K | 0:8c7f841516ab | 173 | } |
Yuto_K | 0:8c7f841516ab | 174 | } |
Yuto_K | 0:8c7f841516ab | 175 | if(CanDown(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 176 | i=y+1; |
Yuto_K | 0:8c7f841516ab | 177 | while(dummyboard[x][i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 178 | dummyboard[x][i]=color; |
Yuto_K | 0:8c7f841516ab | 179 | i+=1; |
Yuto_K | 0:8c7f841516ab | 180 | } |
Yuto_K | 0:8c7f841516ab | 181 | } |
Yuto_K | 0:8c7f841516ab | 182 | if(CanRightUp(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 183 | i=1; |
Yuto_K | 0:8c7f841516ab | 184 | while(dummyboard[x+i][y-i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 185 | dummyboard[x+i][y-i]=color; |
Yuto_K | 0:8c7f841516ab | 186 | i+=1; |
Yuto_K | 0:8c7f841516ab | 187 | } |
Yuto_K | 0:8c7f841516ab | 188 | } |
Yuto_K | 0:8c7f841516ab | 189 | if(CanRightDown(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 190 | i=1; |
Yuto_K | 0:8c7f841516ab | 191 | while(dummyboard[x+i][y+i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 192 | dummyboard[x+i][y+i]=color; |
Yuto_K | 0:8c7f841516ab | 193 | i+=1; |
Yuto_K | 0:8c7f841516ab | 194 | } |
Yuto_K | 0:8c7f841516ab | 195 | } |
Yuto_K | 0:8c7f841516ab | 196 | if(CanLeftDown(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 197 | i=1; |
Yuto_K | 0:8c7f841516ab | 198 | while(dummyboard[x-i][y+i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 199 | dummyboard[x-i][y+i]=color; |
Yuto_K | 0:8c7f841516ab | 200 | i+=1; |
Yuto_K | 0:8c7f841516ab | 201 | } |
Yuto_K | 0:8c7f841516ab | 202 | } |
Yuto_K | 0:8c7f841516ab | 203 | if(CanLeftUp(_dummyboard,x,y,color)){ |
Yuto_K | 0:8c7f841516ab | 204 | i=1; |
Yuto_K | 0:8c7f841516ab | 205 | while(dummyboard[x-i][y-i]==enemy){ |
Yuto_K | 0:8c7f841516ab | 206 | dummyboard[x-i][y-i]=color; |
Yuto_K | 0:8c7f841516ab | 207 | i+=1; |
Yuto_K | 0:8c7f841516ab | 208 | } |
Yuto_K | 0:8c7f841516ab | 209 | } |
Yuto_K | 0:8c7f841516ab | 210 | dummyboard[x][y]=color; |
Yuto_K | 0:8c7f841516ab | 211 | _dummyboard.SetBoard(dummyboard); |
Yuto_K | 0:8c7f841516ab | 212 | return _dummyboard; |
Yuto_K | 0:8c7f841516ab | 213 | } |
Yuto_K | 0:8c7f841516ab | 214 | |
Yuto_K | 0:8c7f841516ab | 215 | uint8_t GetScore(Board board,int8_t color){ |
Yuto_K | 0:8c7f841516ab | 216 | uint8_t score=0; |
Yuto_K | 0:8c7f841516ab | 217 | for(int8_t i=0;i<8;i++){ |
Yuto_K | 0:8c7f841516ab | 218 | for(int8_t j=0;j<8;j++){ |
Yuto_K | 0:8c7f841516ab | 219 | if(board.board[i][j]==color)score++; |
Yuto_K | 0:8c7f841516ab | 220 | } |
Yuto_K | 0:8c7f841516ab | 221 | } |
Yuto_K | 0:8c7f841516ab | 222 | return score; |
Yuto_K | 0:8c7f841516ab | 223 | } |
Yuto_K | 0:8c7f841516ab | 224 | |
Yuto_K | 0:8c7f841516ab | 225 | |
Yuto_K | 0:8c7f841516ab | 226 | bool GameSet(Board board){ |
Yuto_K | 0:8c7f841516ab | 227 | led_board[8][0].red=255; |
Yuto_K | 0:8c7f841516ab | 228 | std::vector<uint8_t> black(GetPutCoords(board,BLACK)); |
Yuto_K | 0:8c7f841516ab | 229 | std::vector<uint8_t> white(GetPutCoords(board,WHITE)); |
Yuto_K | 0:8c7f841516ab | 230 | led_board[0][8].red=255; |
Yuto_K | 0:8c7f841516ab | 231 | return black.size()==0&&white.size()==0; |
Yuto_K | 0:8c7f841516ab | 232 | } |