Othello
Dependencies: mbed
Revision 0:8c7f841516ab, committed 2018-09-04
- Comitter:
- Yuto_K
- Date:
- Tue Sep 04 04:07:41 2018 +0000
- Commit message:
- Othello;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/color.h Tue Sep 04 04:07:41 2018 +0000 @@ -0,0 +1,10 @@ +#define MAX 255 +#define MIN 0 +#define CCLEAR MIN,MIN,MIN +#define CRED MAX,MIN,MIN +#define CGREEN MIN,MAX,MIN +#define CBLUE MIN,MIN,MAX +#define CYELLOW MAX,MAX,MIN +#define CCYAN MIN,MAX,MAX +#define CMAGENTA MAX,MIN,MAX +#define CWHITE MAX,MAX,MAX \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/led_func.h Tue Sep 04 04:07:41 2018 +0000
@@ -0,0 +1,82 @@
+#include "necleo_pin.h"
+#include "color.h"
+
+#define L 0
+#define H 1
+
+#define R 0
+#define G 1
+#define B 2
+
+class Dot{
+ public:
+ char red;
+ char green;
+ char blue;
+ void SetColor(char r,char g,char b){
+ red=r;
+ green=g;
+ blue=b;
+ }
+};
+
+Dot led_board[16][16];
+
+void ResetLEDBoard(){
+ for(char i=0;i<16;i++){
+ for(char j=0;j<16;j++){
+ led_board[i][j].SetColor(CCLEAR);
+ }
+ }
+}
+
+void PrintLEDBoard(){
+ static const char list[4]={0,2,1,3};
+ static char count=0;
+ CLK=L;
+ LAT=L;
+ for(char i=0;i<4;i++){
+ OE=H;
+ Address=list[i];
+ for(char j=0;j<32;j++){
+ if(j<8){
+ Red1=led_board[i][7-j].red>count;
+ Green1=led_board[i][7-j].green>count;
+ Blue1=led_board[i][7-j].blue>count;
+ Red2=led_board[i+8][7-j].red>count;
+ Green2=led_board[i+8][7-j].green>count;
+ Blue2=led_board[i+8][7-j].blue>count;
+ }else if(j<16){
+ Red1=led_board[i+4][j-8].red>count;
+ Green1=led_board[i+4][j-8].green>count;
+ Blue1=led_board[i+4][j-8].blue>count;
+ Red2=led_board[i+12][j-8].red>count;
+ Green2=led_board[i+12][j-8].green>count;
+ Blue2=led_board[i+12][j-8].blue>count;
+ }else if(j<24){
+ Red1=led_board[i][31-j].red>count;
+ Green1=led_board[i][31-j].green>count;
+ Blue1=led_board[i][31-j].blue>count;
+ Red2=led_board[i+8][31-j].red>count;
+ Green2=led_board[i+8][31-j].green>count;
+ Blue2=led_board[i+8][31-j].blue>count;
+ }else{
+ Red1=led_board[i+4][j-16].red>count;
+ Green1=led_board[i+4][j-16].green>count;
+ Blue1=led_board[i+4][j-16].blue>count;
+ Red2=led_board[i+12][j-16].red>count;
+ Green2=led_board[i+12][j-16].green>count;
+ Blue2=led_board[i+12][j-16].blue>count;
+ }
+ CLK=H;
+ CLK=L;
+ }
+ LAT=H;
+ LAT=L;
+ OE=L;
+ wait_us(1);
+ }
+ OE=H;
+ count++;
+ if(count>100)count=0;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Sep 04 04:07:41 2018 +0000
@@ -0,0 +1,23 @@
+#include "led_func.h"
+#include "othellomain.h"
+
+Ticker LedBoard;
+
+void SetLEDBoard(Board board){
+ for(uint8_t i=0;i<8;i++){
+ for(uint8_t j=0;j<8;j++){
+ if(board.board[i][j]==BLACK)led_board[i][j].SetColor(CBLUE);
+ if(board.board[i][j]==WHITE)led_board[i][j].SetColor(CGREEN);
+ }
+ }
+}
+
+int main(){
+ ResetLEDBoard();
+ RandomAI player1(BLACK);
+ RandomAI player2(WHITE);
+ Board mainboard;
+ LedBoard.attach_us(&PrintLEDBoard,100);
+ Play(player1,player2,mainboard);
+ while(1){}
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Sep 04 04:07:41 2018 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/a7c7b631e539 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/necleo_pin.h Tue Sep 04 04:07:41 2018 +0000 @@ -0,0 +1,12 @@ +#include "mbed.h" +DigitalOut Red1(D0); +DigitalOut Green1(A5); +DigitalOut Blue1(D1); +DigitalOut Red2(D8); +DigitalOut Green2(A3); +DigitalOut Blue2(D3); +BusOut Address(A2,D4); +DigitalOut CLK(D6); +DigitalOut LAT(A0); +DigitalOut OE(D7); +DigitalOut myLED(LED1); \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/othello.h Tue Sep 04 04:07:41 2018 +0000
@@ -0,0 +1,232 @@
+#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;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/othellomain.h Tue Sep 04 04:07:41 2018 +0000
@@ -0,0 +1,25 @@
+#include "player.h"
+
+void Play(RandomAI player1,RandomAI player2,Board board){
+ uint8_t put_move;
+ while(1){
+ SetLEDBoard(board);
+ if(GameSet(board))break;
+ led_board[15][14].red=255;
+ if(board.turn==player1.color){
+ led_board[14][14].red=255;
+ put_move=player1.PutMove(board);
+ board.SetBoard(PutStone(board,put_move/8,put_move%8,player1.color).board);
+ if(GetPutCoords(board,player2.color).size()!=0)board.turn=-board.turn;
+ }
+ SetLEDBoard(board);
+ if(GameSet(board))break;
+ if(board.turn==player2.color){
+ led_board[13][13].red=255;
+ put_move=player2.PutMove(board);
+ board.SetBoard(PutStone(board,put_move/8,put_move%8,player2.color).board);
+ if(GetPutCoords(board,player1.color).size()!=0)board.turn=-board.turn;
+ }
+ }
+ led_board[15][15].red=255;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/player.h Tue Sep 04 04:07:41 2018 +0000
@@ -0,0 +1,26 @@
+#include "othello.h"
+
+/*class Player{
+ public:
+ int8_t color;
+ Player(int8_t color){
+ this->color=color;
+ }
+
+ uint8_t PutMove(int8_t board[8][8]){
+ return 0;
+ }
+};*/
+
+class RandomAI{
+ public:
+ int8_t color;
+ RandomAI(int8_t _color){
+ this->color=_color;
+ }
+ uint8_t PutMove(Board board){
+ std::vector<uint8_t> coords(GetPutCoords(board,this->color));
+ uint8_t idx=rand()%coords.size();
+ return coords[idx];
+ }
+};
\ No newline at end of file