Othello

Dependencies:   mbed

Committer:
Yuto_K
Date:
Tue Sep 04 04:07:41 2018 +0000
Revision:
0:8c7f841516ab
Othello;

Who changed what in which revision?

UserRevisionLine numberNew 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 }