Othello

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
Yuto_K
Date:
Tue Sep 04 04:07:41 2018 +0000
Commit message:
Othello;

Changed in this revision

color.h Show annotated file Show diff for this revision Revisions of this file
led_func.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
necleo_pin.h Show annotated file Show diff for this revision Revisions of this file
othello.h Show annotated file Show diff for this revision Revisions of this file
othellomain.h Show annotated file Show diff for this revision Revisions of this file
player.h Show annotated file Show diff for this revision Revisions of this file
--- /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