Othello
Dependencies: mbed
othello.h
- Committer:
- Yuto_K
- Date:
- 2018-09-04
- Revision:
- 0:8c7f841516ab
File content as of revision 0:8c7f841516ab:
#include <stdint.h> #include <stdlib.h> #include <string.h> #include <vector> #define EMPTY 0 #define BLACK 1 #define WHITE -1 class Board{ public: int8_t board[8][8]; int8_t turn; Board(){ for(int8_t i=0;i<8;i++){ for(int8_t j=0;j<8;j++)board[i][j]=EMPTY; } board[3][4]=BLACK;board[4][3]=BLACK; board[3][3]=WHITE;board[4][4]=WHITE; turn=BLACK; } void SetBoard(int8_t board[8][8]){ memcpy(this->board,board,sizeof board); } }; void SetLEDBoard(Board board); /*void ResetBoard(){ for(uint8_t i=0;i<8;i++){ for(uint8_t j=0;j<8;j++)board[i][j]=EMPTY; } board[3][4]=BLACK;board[4][3]=BLACK; board[3][3]=WHITE;board[4][4]=WHITE; }*/ bool CanRight(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x<=5&&board.board[x+1][y]==enemy){ for(int8_t i=x+2;i<8;i++){ if(board.board[i][y]==color)return true; else if(board.board[i][y]==EMPTY)break; } } return false; } bool CanLeft(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x>=2&&board.board[x-1][y]==enemy){ for(int8_t i=x-2;i>=0;i--){ if(board.board[i][y]==color)return true; else if(board.board[i][y]==EMPTY)break; } } return false; } bool CanUp(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(y>=2&&board.board[x][y-1]==enemy){ for(int8_t i=y-2;i>=0;i--){ if(board.board[x][i]==color)return true; else if(board.board[x][i]==EMPTY)break; } } return false; } bool CanDown(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(y<=5&&board.board[x][y+1]==enemy){ for(int8_t i=y+2;i<8;i++){ if(board.board[x][i]==color)return true; else if(board.board[x][i]==EMPTY)break; } } return false; } bool CanRightUp(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x<=5&&y>=2&&board.board[x+1][y-1]==enemy){ int8_t i=2; while(x+i<8&&y-i>=0){ if(board.board[x+i][y-i]==color)return true; else if(board.board[x+i][y-i]==EMPTY)break; i++; } } return false; } bool CanRightDown(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x<=5&&y<=5&&board.board[x+1][y+1]==enemy){ int8_t i=2; while(x+i<8&&y+i<8){ if(board.board[x+i][y+i]==color)return true; else if(board.board[x+i][y+i]==EMPTY)break; i++; } } return false; } bool CanLeftDown(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x>=2&&y<=5&&board.board[x-1][y+1]==enemy){ int8_t i=2; while(x-i>=0&&y+i<8){ if(board.board[x-i][y+i]==color)return true; else if(board.board[x-i][y+i]==EMPTY)break; i++; } } return false; } bool CanLeftUp(Board board,int8_t x,int8_t y,int8_t color){ int8_t enemy=-color; if(x>=2&&y>=2&&board.board[x-1][y-1]==enemy){ int8_t i=2; while(x-i>=0&&y-i>=0){ if(board.board[x-i][y-i]==color)return true; else if(board.board[x-i][y-i]==EMPTY)break; i++; } } return false; } bool CanPut(Board board,int8_t x,int8_t y,int8_t color){ 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); } std::vector<uint8_t> GetPutCoords(Board board,int8_t color){ std::vector<uint8_t> coords; for(int8_t i=0;i<8;i++){ for(int8_t j=0;j<8;j++){ led_board[i+8][j+8].red=255; if(CanPut(board,i,j,color))coords.push_back(i*8+j);//ここの18回目の実行で上のCanDownからCanRightUpの間で止まる } } return coords; } Board PutStone(Board board,int8_t x,int8_t y,int8_t color){ Board _dummyboard; int8_t dummyboard[8][8]; int8_t enemy=-color; uint8_t i; memcpy(dummyboard,board.board,sizeof board.board); _dummyboard.SetBoard(dummyboard); if(CanRight(_dummyboard,x,y,color)){ i=x+1; while(dummyboard[i][y]==enemy){ dummyboard[i][y]=color; i+=1; } } if(CanLeft(_dummyboard,x,y,color)){ i=x-1; while(dummyboard[i][y]==enemy){ dummyboard[i][y]=color; i-=1; } } if(CanUp(_dummyboard,x,y,color)){ i=y-1; while(dummyboard[x][i]==enemy){ dummyboard[x][i]=color; i-=1; } } if(CanDown(_dummyboard,x,y,color)){ i=y+1; while(dummyboard[x][i]==enemy){ dummyboard[x][i]=color; i+=1; } } if(CanRightUp(_dummyboard,x,y,color)){ i=1; while(dummyboard[x+i][y-i]==enemy){ dummyboard[x+i][y-i]=color; i+=1; } } if(CanRightDown(_dummyboard,x,y,color)){ i=1; while(dummyboard[x+i][y+i]==enemy){ dummyboard[x+i][y+i]=color; i+=1; } } if(CanLeftDown(_dummyboard,x,y,color)){ i=1; while(dummyboard[x-i][y+i]==enemy){ dummyboard[x-i][y+i]=color; i+=1; } } if(CanLeftUp(_dummyboard,x,y,color)){ i=1; while(dummyboard[x-i][y-i]==enemy){ dummyboard[x-i][y-i]=color; i+=1; } } dummyboard[x][y]=color; _dummyboard.SetBoard(dummyboard); return _dummyboard; } uint8_t GetScore(Board board,int8_t color){ uint8_t score=0; for(int8_t i=0;i<8;i++){ for(int8_t j=0;j<8;j++){ if(board.board[i][j]==color)score++; } } return score; } bool GameSet(Board board){ led_board[8][0].red=255; std::vector<uint8_t> black(GetPutCoords(board,BLACK)); std::vector<uint8_t> white(GetPutCoords(board,WHITE)); led_board[0][8].red=255; return black.size()==0&&white.size()==0; }