主要为大家详细介绍了H5+C3+JS实现双人对战五子棋游戏,实现双人对战模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1
python人工智能-五子棋_项目源码与素材,python少儿编程,经典教学作品,儿童益智游戏
2022-04-21 12:06:11 2.78MB python 人工智能 游戏 scratch
// Chess.cpp: implementation of the CChess class. ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "五子棋.h" #include "Chess.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CChess::CChess() { memset(m_board,0,sizeof(m_board)); m_turn=1; //下棋次序 m_flag=0; //输赢标志,1白 2黑 posflag=0; //下子信息数组下标初始值为0 } CChess::~CChess() { } int CChess::PanYing(int nx, int ny) //判断输赢函数 { int count=0; for(int i=-4;i<5;i++) //判断水平行还是否连成五个子,只要够了5个就返回1,否则返回0. { if(m_board[ny][nx+i]==m_turn) {count++;if(count==5) return m_turn;} else count=0; } count=0; for(i=-4;i<5;i++) //判断竖行是否连成五个子 { if(m_board[ny+i][nx]==m_turn) {count++;if(count==5) return m_turn;} else count=0; } count=0; for(i=-4;i<5;i++) //从左上到右下是否连成五个子 { if(m_board[ny+i][nx+i]==m_turn) {count++;if(count==5) return m_turn;} else count=0; } count=0; for(i=-4;i<5;i++) //从右上到右下是否连成五个子 { if(m_board[ny+i][nx-i]==m_turn) {count++;if(count==5) return m_turn;} else count=0; } count=0; return 0; } void CChess::DrawQp() //画棋盘 { dc->BitBlt(0,0,446,446,qp,0,0,SRCCOPY); //BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); //x,y为目的矩形左上角的坐标。nWidth, nHeight为图形的宽高,pSrcDC为资源位图或添加矩形的名字 //xSrc,ySrc为资源位图左上角的坐标。dwRop 光栅处理位图和资源图的结合的方法 //SRCCOPY:Copies the source bitmap to the destination bitmap } void CChess::DrawQz(int nx,int ny,int type) //画棋子 { if(type==0) { if(m_turn==1){dc->Ellipse(nx*29+7,ny*29+7,nx*29+34,ny*29+34); //BOOL Ellipse( int x1, int y1, int x2, int y2 ); //x1,y1为椭圆范围内矩形的左上角坐标,x2,y2为椭圆范围内矩形的右下角坐标 posinfo[posflag].x=nx; posinfo[posflag].y=ny; posinfo[posflag].flag=m_turn; posflag++;} else { CBrush *brush; CBrush brush1(RGB(0,0,0)); // RGB(nRedValue, nGreenValue, nBlueValue) brush=dc->SelectObject(&brush1); dc->Ellipse(nx*29+7,ny*29+7,nx*29+34,ny*29+34); posinfo[posflag].x=nx; posinfo[posflag].y=ny; posinfo[posflag].flag=m_turn; posflag++; dc->SelectObject(brush); } } else if(type==1) { dc->Ellipse(nx*29+7,ny*29+7,nx*29+34,ny*29+34); posinfo[posflag].x=nx; posinfo[posflag].y=ny; posinfo[posflag].flag=m_turn; posflag++; } else { CBrush *brush; CBrush brush1(RGB(0,0,0)); brush=dc->SelectObject(&brush1); dc->Ellipse(nx*29+7,ny*29+7,nx*29+34,ny*29+34); posinfo[posflag].x=nx; posinfo[posflag].y=ny; posinfo[posflag].flag=m_turn; posflag++; dc->SelectObject(brush); } } bool CChess::DownZi(int nx, int ny,int type,HWND hwnd) //下子函数,外不调用此函数 { int x,y; if(nx<0||nx>14||ny<0||ny>14) //先判断下子是否正确 { MessageBox(hwnd,"不正确的下子位置!", NULL,MB_OK); return false; } if(CChess::m_flag!=0)//已分出胜负 { if(m_flag==1){MessageBox(hwnd,"白棋获胜!", NULL,MB_OK);return true;} else{MessageBox(hwnd,"黑棋获胜!", NULL,MB_OK);return true;} } if(m_board[ny][nx]==0) { if(type==2)//人人对战 { m_board[ny][nx]=m_turn; DrawQz(nx,ny); m_flag=PanYing(nx,ny); m_turn=(m_turn==1?2:1); if(m_flag==1){MessageBox(hwnd,"白棋获胜!", NULL,MB_OK);return true;} if(m_flag==2){MessageBox(hwnd,"黑棋获胜!", NULL,MB_OK);return true;} return true; } else //人机对战 { m_board[ny][nx]=m_turn; DrawQz(nx,ny); m_flag=PanYing(nx,ny); m_turn=(m_turn==1?2:1); if(m_flag==1){MessageBox(hwnd,"白棋获胜!", NULL,MB_OK);return true;} if(m_flag==2){MessageBox(hwnd,"黑棋获胜!", NULL,MB_OK);return true;} CChess::AiGo(x,y); m_board[y][x]=m_turn; DrawQz(x,y); m_flag=PanYing(x,y); m_turn=(m_turn==1?2:1); if(m_flag==1){MessageBox(hwnd,"白棋获胜!", NULL,MB_OK);return true;} if(m_flag==2){MessageBox(hwnd,"黑棋获胜!", NULL,MB_OK);return true;} return true; } } return false; } void CChess::ReDraw() //从画函数 { DrawQp(); for(int i=0;i<15;i++) for(int j=0;j<15;j++) { if(m_board[i][j]==1){DrawQz(j,i,1);} if(m_board[i][j]==2){DrawQz(j,i,2);} } } void CChess::NewGame(int type) //新游戏 { memset(m_board,0,sizeof(m_board)); m_flag=0; m_turn=1; posflag=0; if(type==0){m_board[7][7]=1;m_turn=2; posinfo[posflag].x=7;posinfo[posflag].y=7;posinfo[posflag].flag=2; posflag++;} ReDraw(); } void CChess::SetDc(CDC* tqp, CDC *qz) //设置绘图 { qp=tqp; dc=qz; } void CChess::AiGo(int& t, int &h) // { int qiju[2][15][15][8][2]={0}; /* 棋型数组*/ int k,i,j,q,b=0,a=1,d,y1=0,y2=0,x1=0,x2=0; int a1[15][15]={0},a2[15][15]={0}; /****************为双方填写棋型表************/ for(k=0;k<2;k++) //k代表两方对弈者,k=0为白棋,k=1为黑棋。 for(i=0;i<15;i++) for(j=0;j<15;j++) { if(m_board[i][j]==0) //空位 { for(q=0;q<8;q++) //与空位相邻的八个方向上的位置 { if(k==0) d=1; //d=1代表一方 else d=2; //d=2代表另一方 if(q==1&&i>=0&&j>=0) //q=1 { for(;i-a>=0&&j-a>=0;) { if(m_board[i-a][j-a]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i-a][j-a]==0&&j-a>=0&&i-a>=0){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==2&&i>=0) //q=2 { for(;i-a>=0;) { if(m_board[i-a][j]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i-a][j]==0&&i-a>=0){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==3&&i>=0&&j<15) // q=3 { for(;i-a>=0&&j+a<15;) { if(m_board[i-a][j+a]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i-a][j+a]==0&&i-a>=0&&j+a<15){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==4&&j<15) //q=4 { for(;j+a<15;) { if(m_board[i][j+a]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i][j+a]==0&&j+a<15){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==5&&i<15&&j<15) //q=5 { for(;i+a<15&&j+a<15;) { if(m_board[i+a][j+a]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i+a][j+a]==0&&i+a<15&&j+a<15){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==6&&i<15) //q=6 { for(;i+a<15;) { if(m_board[i+a][j]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i+a][j]==0&&i+a<15){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } if(q==7&&j>=0&&i<15) //q=7 { for(;i+a<15&&j-a>=0;) { if(m_board[i+a][j-a]==d){b++;a++;continue;} else break; } qiju[k][i][j][q][0]=b;b=0; if(m_board[i+a][j-a]==0&&i+a<15&&j-a>=0){qiju[k][i][j][q][1]=1;a=1;} else {qiju[k][i][j][q][1]=0;a=1;} } } } } /******************根据评分规则对每一个空格评分***************/ for(k=0;k<2;k++) for(i=0;i<15;i++) for(j=0;j<15;j++) { if(k==0) /*为白棋评分*/ { for(q=0;q<4;q++) { if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==4 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=7000; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==3 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=301; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==2 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=43; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==1 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=11; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==4 &&((qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0))) b+=7000; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==3 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=63; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==2 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=6; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==1 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=1; } if(b==126||b==189||b==252) b=1500; if(b==106) b=1000; a1[i][j]=b;b=0; } if(k==1) /*为黑棋评分*/ { for(q=0;q<4;q++) { if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==4 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=30000; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==3 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=1500; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==2 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=51; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==1 &&qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==1) b+=16; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==4 &&((qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0))) b+=30000; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==3 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=71; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==2 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=7; if((qiju[k][i][j][q][0]+qiju[k][i][j][q+4][0])==1 &&((qiju[k][i][j][q][1]==1&&qiju[k][i][j][q+4][1]==0) ||(qiju[k][i][j][q][1]==0&&qiju[k][i][j][q+4][1]==1))) b+=2; } if(b==142||b==213||b==284) b=1500; if(b==122) b=1300; a2[i][j]=b;b=0; } } /****************算出分数最高的空位,填写坐标*********************/ for(i=0;i<15;i++) for(j=0;j<15;j++) { if(a1[y1][x1]=a1[y1][x1]) {t=x2;h=y2;} //找出空位分数是最高的 else {t=x1;h=y1;} } void CChess::BackGo() //悔棋 { m_board[posinfo[posflag-1].y][posinfo[posflag-1].x]=0; ReDraw(); }
2022-04-21 10:28:53 461KB MFC 五子棋
1
分享的是基于51单片机+TFT320240+按键设计的双人对战五子棋,小游戏,无聊的时候打发时间,也考验技术哦! 双人对战五子棋实现功能: 1)白棋,黑棋轮流下子 2)判断是否五子相连 3)判断是否和局 4)悔棋 5)重新开始游戏 下面是双人对战五子棋仿真图: 只上传了黑棋赢的,白棋赢和和局的有兴趣的自己下载下来试一下吧!!! 这里的TFTLCD320240模型是从网上下载的,在这里我也上传一份,需要的下载下来玩一下,module里面是TFTLCD320240的元件库,放在proteus安装目录下的library和module里面。
2022-04-21 02:21:34 455KB 51单片机 双人对战五子棋 电路方案
1
【毕业设计】pytorch训练AI自动玩小游戏代码合辑(含游戏代码)-AIGobang五子棋.zip
2022-04-18 17:05:18 10.8MB
VFP 小程序案例五子棋小游戏的源代码,适合一定的博弈论原理研究,非常适合计算机初学者或游戏开发初学者。
2022-04-17 16:03:34 49KB 小程序 开发语言 VFP 小游戏
1
五子棋、奔跑的小人、日食音量调节器、金山打字小游戏HTML5代码,复习用
2022-04-16 20:04:36 2.6MB html5 前端 html
1
五子棋游戏基于java环境工作,采用java相关技术进行五子棋游戏的开发(jdk模式即可),通过使用自适应算法实现游戏的主要和进阶功能。要求具有“布局设初始化、人机对战、难度选择、自适应AI难度管理、多步悔棋、积分管理”等功能,系统应采用通用简表配置程序文件,适应性和实用性强,具有良好的用户体验。 难度选择要有初级中级高级三个,玩家可以选择棋子颜色,重新开始”和“认输”
c++基于win32五子棋对下
2022-04-15 13:16:40 32KB c++ 对下 五子棋
1
系统功能主要分为五子棋棋盘设计、五子棋棋子设计、五子棋输赢判定,游戏基础按钮四个部分: 五子棋棋盘设计部分: 导入一个棋盘背景,绘制棋盘线 五子棋棋子设计部分: 在棋盘上的鼠标点击位置,显示一个棋子,黑子用一个实心的圆来表示,白子用一个空心的圆来表示。 五子棋输赢判定部分 判断是否有同一颜色的棋子横、竖、斜连成五个 游戏基础按钮部分 开始游戏:重新开始新的游戏 游戏设置:设置倒计时 游戏说明:用来说明游戏规则和操作 认输:表示某一方放弃游戏 关于:用来显示程序的作者相关信息 退出:结束程序