手磕五子棋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;
}