五子棋c++代码~~AI只能还算比较高的。。。。。。。。
来源:互联网 发布:mysql union distinct 编辑:程序博客网 时间:2024/04/28 11:35
说明1:如果你用VS,可能会编译不过。建议改用codeblocks或者vc++。
说明2:你可以直接点击屏幕落子。
说明3:AI采用防守优先的方法。所以当你看到AI已经赢了却不这么走的情况,千万别惊讶~~它防守可是很不错的。。
说明4:这个游戏,我走了5盘只赢了3盘。。。。。
#include <iostream>#include <windows.h>#include <cstring>#include <cstdlib>using namespace std;/*** 光标定位 ***/HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE),hin=GetStdHandle(STD_INPUT_HANDLE);COORD coord,pos;void locate(int x,int y){ coord.X=y; coord.Y=x; SetConsoleCursorPosition(hout,coord);};/*** 隐藏光标 ***/void hide(){ CONSOLE_CURSOR_INFO cursor_info={1,0}; SetConsoleCursorInfo(hout, &cursor_info);}INPUT_RECORD mouseRec;DWORD res;struct win_list{ bool is_able; int x[5],y[5]; bool is_used[5];};int len,sum;int chess[20][20],scoreC[20][20],scoreP[20][20];int last_x,last_y;win_list computer[2000],person[2000];/***** 数据初始化,将所有可能获胜的情况录入 ***/void init(){ int i,j,k; sum=0; memset(chess,0,sizeof(chess)); for (i=0;i<=len-1;i++) { for (j=0;j<=len-5;j++) { computer[sum+(len-4)*i+j].is_able=true; for (k=0;k<=4;k++) { computer[sum+(len-4)*i+j].is_used[k]=false; computer[sum+(len-4)*i+j].x[k]=i; computer[sum+(len-4)*i+j].y[k]=j+k; } } } sum+=(len-4)*len; for (i=0;i<=len-5;i++) { for (j=0;j<=len-1;j++) { computer[sum+len*i+j].is_able=true; for (k=0;k<=4;k++) { computer[sum+len*i+j].is_used[k]=false; computer[sum+len*i+j].x[k]=i+k; computer[sum+len*i+j].y[k]=j; } } } sum+=(len-4)*len; for (i=0;i<=len-5;i++) { for (j=0;j<=len-5;j++) { computer[sum+(len-4)*i+j].is_able=true; for (k=0;k<=4;k++) { computer[sum+(len-4)*i+j].is_used[k]=false; computer[sum+(len-4)*i+j].x[k]=i+k; computer[sum+(len-4)*i+j].y[k]=j+k; } } } sum+=(len-4)*(len-4); for (i=4;i<=len-1;i++) { for (j=0;j<=len-5;j++) { computer[sum+(len-4)*(i-4)+j].is_able=true; for (k=0;k<=4;k++) { computer[sum+(len-4)*(i-4)+j].is_used[k]=false; computer[sum+(len-4)*(i-4)+j].x[k]=i-k; computer[sum+(len-4)*(i-4)+j].y[k]=j+k; } } } sum+=(len-4)*(len-4); for (i=0;i<=sum-1;i++) person[i]=computer[i];}/*** 落子函数,其中w=1代表机器落子,w=2代表人落子 ***/void put_down(int x0,int y0,int w){ chess[x0][y0]=w; locate(x0+2,y0+2); if (w==2) cout << "o"; else { cout << "+"; if (last_x!=-1) { locate(last_x+2,last_y+2); cout << "*"; } last_x=x0;last_y=y0; } locate(len+3,0); int i,j; for (i=0;i<=sum-1;i++) { for (j=0;j<=4;j++) { if (w==1) { if (computer[i].x[j]==x0 && computer[i].y[j]==y0) computer[i].is_used[j]=true; if (person[i].x[j]==x0 && person[i].y[j]==y0) person[i].is_able=false; } else { if (computer[i].x[j]==x0 && computer[i].y[j]==y0) computer[i].is_able=false; if (person[i].x[j]==x0 && person[i].y[j]==y0) person[i].is_used[j]=true; } } }}/*** 评分函数,w=1代表给机器评分,w=2代表给人评分 ***/int judge(int x0,int y0,int w){ int i,j,k; int score=1; memset(scoreC,0,sizeof(scoreC)); memset(scoreP,0,sizeof(scoreP)); if (w==1) { for (i=0;i<=sum-1;i++) { score=1; if (computer[i].is_able==false) continue; for (j=0;j<=4;j++) { if (computer[i].x[j]==x0 && computer[i].y[j]==y0) { k=j-1; while (k>=0 && computer[i].is_used[k]==true) { k--; score*=6; } k=j+1; while (k<=4 && computer[i].is_used[k]==true) { k++; score*=6; } break; } } scoreC[x0][y0]+=score; } } else { for (i=0;i<=sum-1;i++) { score=1; if (person[i].is_able==false) continue; for (j=0;j<=4;j++) { if (person[i].x[j]==x0 && person[i].y[j]==y0) { k=j-1; while (k>=0 && person[i].is_used[k]==true) { k--; score*=6; } k=j+1; while (k<=4 && person[i].is_used[k]==true) { k++; score*=6; } break; } } scoreP[x0][y0]+=score; } } if (w==1) return scoreC[x0][y0]; return scoreP[x0][y0];}/*** 寻找落子位置 ***/int where(){ int i,j; int tempCx,tempCy,tempPx,tempPy; int scoreC=0,scoreP=0; int a,b; for (i=0;i<=len-1;i++) { for (j=0;j<=len-1;j++) { if (chess[i][j]==0) { a=judge(i,j,1); if (scoreC<a) { scoreC=a;tempCx=i;tempCy=j; } b=judge(i,j,2); if (scoreP<b) { scoreP=b;tempPx=i;tempPy=j; } } } } if (scoreC<scoreP) return tempPx*len+tempPy; return tempCx*len+tempCy;}/*** 判断游戏是否结束 ***/bool is_ended(int x0,int y0,int w){ int score=1; int i,j,k; if (w==1) { for (i=0;i<=sum-1;i++) { score=1; if (computer[i].is_able==false) continue; for (j=0;j<=4;j++) { if (computer[i].x[j]==x0 && computer[i].y[j]==y0) { k=j-1; while (k>=0 && computer[i].is_used[k]==true) { k--; score++; } k=j+1; while (k<=4 && computer[i].is_used[k]==true) { k++; score++; } if (score==5) return false; break; } } } } else { for (i=0;i<=sum-1;i++) { score=1; if (person[i].is_able==false) continue; for (j=0;j<=4;j++) { if (person[i].x[j]==x0 && person[i].y[j]==y0) { k=j-1; while (k>=0 && person[i].is_used[k]==true) { k--; score++; } k=j+1; while (k<=4 && person[i].is_used[k]==true) { k++; score++; } if (score==5) return false; break; } } } } return true;}/*** 输出棋盘 ***/void print(){ locate(0,0); int i,j; for (i=1;i<=4;i++) cout << " " << endl; locate(0,0); cout << " "; for (i=1;i<=len;i++) cout << i%10; cout << endl << " "; for (i=1;i<=len;i++) cout << "-"; cout << endl; for (i=1;i<=len;i++) { cout << i%10 << "|"; for (j=1;j<=len;j++) cout << " "; cout << "|" << endl; } cout << " "; for (i=0;i<=len-1;i++) cout << "-"; cout << endl;}/*** 主函数 ***/int main(){ cout << "--------五子棋游戏--------" << endl; cout << "请输入地图的宽度,不小于10" << endl; cout << "请直接用鼠标点击屏幕上的点" << endl; cout << "--------------------------" << endl; cin >> len; if (len<10) { cout << "ERROR" << endl; system("pause"); return 0; } int x0,y0,z0; int input=0,e=0; last_x=last_y=-1; init(); print(); hide(); while (1) { while (1) { ReadConsoleInput(hin,&mouseRec,1,&res); if (mouseRec.EventType==MOUSE_EVENT) { pos=mouseRec.Event.MouseEvent.dwMousePosition; x0=pos.Y-2;y0=pos.X-2; if (mouseRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED) { if ((x0>=0 && x0<=len-1 && y0>=0 && y0<=len-1 && chess[x0][y0]==0)) break; } } } locate(len+3,0); cout << " "; put_down(x0,y0,2); if (!is_ended(x0,y0,2)) { e=2;break; } input++; if (input>len*len) break; z0=where(); x0=z0/len;y0=z0%len; put_down(x0,y0,1); if (!is_ended(x0,y0,1)) { e=1;break; } input++; if (input>len*len) break; } locate(len+3,0); if (e==0) cout << "Draw!" <<endl; if (e==1) cout << "You lose!" << endl; if (e==2) cout << "You win!" << endl; system("pause"); return 0;}
- 五子棋c++代码~~AI只能还算比较高的。。。。。。。。
- 五子棋的简单AI
- 五子棋AI的应用思路
- 简单AI的五子棋程序
- 五子棋AI算法的实现
- 五子棋AI
- AI----------五子棋
- AI五子棋
- 五子棋AI
- 本人用 C 和 WinAPI 写的一个 带AI的五子棋
- 十四步实现强大的五子棋AI
- 关于五子棋AI的一点小尝试
- AS3.0五子棋的AI思路
- 基于Alphabet剪枝的五子棋AI
- 【五子棋AI】AI的基本结构——局面表示
- 【五子棋AI】AI的基本结构——招法生成器
- 【五子棋AI】AI的基本结构——局面评价
- 【五子棋AI】AI的基本结构——剪裁函数
- hdu 1057 A New Growth Industry
- JFreeChart的基本使用
- striptes框架学习笔记
- Perl 脚本测试网络连接
- 把十进制转成十六进制的一个简单易行的方法(不需要用栈)
- 五子棋c++代码~~AI只能还算比较高的。。。。。。。。
- java基础--IO流之装饰类与自定义装饰类
- Notepad++ 快捷键 大全
- POJ 2513 Colored Sticks
- 开源库
- 物联网
- 常用的iphone开发学习网站
- ODBC 标量函数
- 算法推荐