手磕五子棋AI日志

· · 个人记录

众所周知啊,学校组织的科技节那是必须参加,作为一名oier,肯定选择软件方面进行创作。

所以

从今天开始手磕

五子棋AI!

while(true){
    rp++;
}

Day1 2023/3/10

别人的AI都是人类思路AI,为了体现我有多NB们oier的能力,我决定写一个模拟神经元AI

首先随手创建两个文件

然后测试一下文件读写

Day2 2023/3/11

周末了,好欸!

随手颓废爆肝47行代码,费了我俩小时((((((((

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
namespace AI{
    double sigmod(double x){
        return 1/(1+exp(-x));
    }
    class edge;
    class neure{
        public:
            neure(double __w,vector<edge> __edges,bool __outputLayer=false):
                w(__w),outputLayer(__outputLayer),edges(__edges){}
            ~neure(){
                vector<edge>().swap(edges);
            }
            double now;
            double getOuput(){return sigmod(this->now*this->w);}
            bool outputLayer;
        private:
            double w;
            vector<edge> edges;
    };
    class edge{
        public:
            edge(neure* __from,neure* __to,double __w):from(__from),to(__to),w(__w){}
            ~edge(){this->to=this->from=nullptr;}
            bool calc(){
                return (this->to!=nullptr&&this->from!=nullptr)&&
                    (this->to->now+=this->from->getOuput()+this->w||true);
            }
        private:
            double w;
            neure* from;
            neure* to;
    };
    class ai{
        public:
            ai(int layer,vector<int>nums){
                for(int i=0;i<nums.size();i++){
                    //something 
                }
            }
        private:
            vector<vector<neure> >neures;
    };
}//一次修改于21:55

写完了摆烂了写了一点巨佬们帮忙挑挑错

Day3 2023/3/12

            ai(int __layer,vector<int>nums):layer(__layer){
                for(int i=0;i<layer-1;i++)
                    neures.push_back(
                        vector<neure>(nums[i],neure(0,vector<edge>(nums[i+1])))
                    );
                neures.push_back(vector<neure>(nums[layer],neure(0,vector<edge>(),true)));
                for(int i=0;i<layer-1;i++)
                    for(int j=0;j<neures[i].size();j++)
                        for(int k=0;k<neures[i+1].size();k++)
                            neures[i][j].edges=edge(neures[i][j],neures[i][k],0);
            }//完成ai类初始化21:49

Day4 2023/3/13

疯狂复习后向传播思路ing

感谢 @sunrise1024 的建议

Day5 2023/3/17

在摆烂了一×114514天之后,终于迎来了信竞课,开始写五子棋代码喽

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
const int size=15;
string p[12]={"  ","●","○","┌ ","┬ ","┐ ","├ ","┼ ","┤ ","└ ","┴ ","┘ "};
int Map[size][size];
bool in_map(int i,int j){
    return i>=0&&i<size&&j>=0&&j<=size;
}
string get(int i,int j){
    if(!in_map(i,j))return "  ";
    if(Map[i][j])return p[Map[i][j]];
    if(i==0){
        if(j==0)return p[3];
        if(j==size-1)return p[5];
        return p[4];
    }
    if(i==size-1){
        if(j==0)return p[9];
        if(j==size-1)return p[11];
        return p[10];
    }
    if(j==0)return p[6];
    if(j==size-1)return p[8];
    return p[7];
}
void print_map(){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++)printf("%s",get(i,j).c_str());
        printf("\n");
    }
}
void print(int i,int j,string t){
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),{j*2,i});
    printf("%s",t.c_str());
}
int main(){
    print_map();    
    while(true){
        //something
        break;
    }
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),{0,size-1});
    return 0;
}
┌ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┬ ┐
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
├ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┼ ┤
└ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┴ ┘
--------------------------------
Process exited after 0.05621 seconds with return value 0
请按任意键继续. . .

Day6 2023/3/18

五子棋代码终于写完啦!

右键下棋

明天该搞遗传代码了

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define kd(name) ((GetAsyncKeyState(name)&0x8000)?true:false)
using namespace std;
const int size=30;
const HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
const HWND cWin=GetConsoleWindow();
CONSOLE_FONT_INFO ccf;//consoleCurrentFont而不是€€£ 
CONSOLE_CURSOR_INFO cci; 
string p[12]={"  ","●","○","┌ ","┬ ","┐ ","├ ","┼ ","┤ ","└ ","┴ ","┘ "};
int Map[size][size];
enum ConsoleForegroundColor{
    enmCFC_Red          = FOREGROUND_INTENSITY | FOREGROUND_RED,
    enmCFC_Green        = FOREGROUND_INTENSITY | FOREGROUND_GREEN,
    enmCFC_Blue         = FOREGROUND_INTENSITY | FOREGROUND_BLUE,
    enmCFC_Yellow       = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN,
    enmCFC_Purple       = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE,
    enmCFC_Cyan         = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE,
    enmCFC_Gray         = FOREGROUND_INTENSITY,
    enmCFC_White        = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
    enmCFC_HighWhite    = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
    enmCFC_Black        = 0,
};
enum ConsoleBackGroundColor{
    enmCBC_Red          = BACKGROUND_INTENSITY | BACKGROUND_RED,
    enmCBC_Green        = BACKGROUND_INTENSITY | BACKGROUND_GREEN,
    enmCBC_Blue         = BACKGROUND_INTENSITY | BACKGROUND_BLUE,
    enmCBC_Yellow       = BACKGROUND_RED | BACKGROUND_GREEN,
    enmCBC_Purple       = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE,
    enmCBC_Cyan         = BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE,
    enmCBC_White        = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE,
    enmCBC_HighWhite    = BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE,
    enmCBC_Black        = 0,
};//copy from https://www.cnblogs.com/tangxin-blog/p/7257413.html
bool in_map(int i,int j){
    return i>=0&&i<size&&j>=0&&j<size;
}
string get(int i,int j){
    if(!in_map(i,j))return "  ";
    if(Map[i][j])return p[1];
    if(i==0){
        if(j==0)return p[3];
        if(j==size-1)return p[5];
        return p[4];
    }
    if(i==size-1){
        if(j==0)return p[9];
        if(j==size-1)return p[11];
        return p[10];
    }
    if(j==0)return p[6];
    if(j==size-1)return p[8];
    return p[7];
}
void print_map(){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++)printf("%s",get(i,j).c_str());
        printf("\n");
    }
}
void print(int i,int j,string t,int fg_color=enmCFC_HighWhite,int bg_color=enmCBC_Yellow){
    SetConsoleTextAttribute(hOut,fg_color|bg_color);
    SetConsoleCursorPosition(hOut,{j*2,i});
    printf("%s",t.c_str());
}
bool test_win(int a,int b){
    int me=Map[a][b],flag=0;
    for(int i=a-5;i<=a+5;i++){
        if(!in_map(i,b))continue;
        if(Map[i][b]==me)flag++;
        else flag=0;
        if(flag>=5)return true;
    }
    flag=0;
    for(int i=b-5;i<=b+5;i++){
        if(!in_map(a,i))continue;
        if(Map[a][i]==me)flag++;
        else flag=0;
        if(flag>=5)return true;
    }
    flag=0;
    for(int i=a-5,j=b+5;i<=a+5&&j>=b-5;i++,j--){
        if(!in_map(i,j))continue;
        if(Map[i][j]==me)flag++;
        else flag=0;
        if(flag>=5)return true;
    }
    if(flag>=5)return true;
    flag=0;
    for(int i=a-5,j=b-5;i<=a+5&&j<=b+5;i++,j++){
        if(!in_map(i,j))continue;
        if(Map[i][j]==me)flag++;
        else flag=0;
        if(flag>=5)return true;
    }
    if(flag>=5)return true;
    return false;
}
void init(){
    char cmd[64];sprintf(cmd,"mode con cols=%d lines=%d",size*2,size+1);system(cmd);
    SetWindowLongPtrA(cWin,GWL_STYLE,GetWindowLongPtrA(cWin,GWL_STYLE)&~(WS_SIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZEBOX));
    SetConsoleTextAttribute(hOut,enmCFC_HighWhite|enmCBC_Yellow);
    GetCurrentConsoleFont(hOut,FALSE,&ccf);
    GetConsoleCursorInfo(hOut,&cci);cci.bVisible=false;SetConsoleCursorInfo(hOut,&cci);
    print_map();
}
int main(){
    int now=1,i=size/2,j=size/2;
    init();
    POINT cpos;
    while(true){
        if(in_map(i,j))print(i,j,get(i,j),Map[i][j]==1?0:enmCFC_HighWhite);
        GetCursorPos(&cpos);
        ScreenToClient(GetForegroundWindow(),&cpos);
        i=1.0*cpos.y/ccf.dwFontSize.Y+0.5;
        j=cpos.x/ccf.dwFontSize.X/2;
        if(!in_map(i,j)){
            GetConsoleCursorInfo(hOut,&cci);cci.bVisible=false;SetConsoleCursorInfo(hOut,&cci);
            //bug,移出框框后会重新显示光标 
            continue;
        }
        print(i,j,p[1],enmCFC_Red);
        if(kd(VK_RBUTTON)){
            if(!Map[i][j]){
                Map[i][j]=now;
                now=3-now;
                SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),{0,size});
                if(test_win(i,j))break;
            }
        }
        Sleep(20);
    }
    print(size,0,p[1],now==2?0:enmCFC_HighWhite);
    printf("赢了"); 
    return 0;
}