井字棋源代码(java井字棋)
admin 发布:2022-12-19 23:11 114
今天给各位分享井字棋源代码的知识,其中也会对java井字棋进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
C语言编写井字棋游戏 代码已有半成品
你初始化一个字符数组,里面都给他一样的初始值 E
X 下了就改成X ,O 下了就改成 O,下完以后判断横竖斜三条线有没有一样的,
一共就九个格子,下一步就少一步 ,下之前判断一下,如果等于E ,就是空的,可以放子。
下完一步总步数减一,你这样不就能确定还有几步可以走了。
九步都下完如果没有横竖斜都一样的不就是平局吗,所有数组元素的值都不等于E了不就结束了,或者九步完了也结束了
另外,少用GOTO ,变量定义最好有意义,写点注释
求井字棋的源代码
CtictactoeView::CtictactoeView()//程序中关键变量赋初值
{
// TODO: 在此处添加构造代码
int i , j;
for( i = 0 ; i 3 ; i++ )
for( j = 0 ; j 3 ; j++ )
myGraph[i][j] = 0;
currX = -1;
currY = -1;
whosTurn = 1;
whosFirst = 1;
}
void CtictactoeView::OnDraw(CDC* pDC)//程序界面、游戏状态的显示
{
CtictactoeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CBitmap bitmap[9];
CBitmap *pOldBitmap;
CDC MemDC;
int i , j;
int myTop = 5;
int myLeft;
int mySize = 100;
MemDC.CreateCompatibleDC( pDC );
for( i = 0 ; i 3 ; i++ )
{
myTop = 5 + 105 * i;
myLeft = 5;
for( j = 0 ; j 3 ; j++ )
{
myLeft = 5 + 105 * j;
if( myGraph[i][j] == 0 )
{
bitmap[ 3 * i + j ].LoadBitmap( IDB_BACKGROUND );
}
else if( myGraph[i][j] == 1 )
{
bitmap[ 3 * i + j ].LoadBitmap( IDB_CROSS );
}
else if( myGraph[i][j] == 2 )
{
bitmap[ 3 * i + j ].LoadBitmap( IDB_ROUND );
}
else
{
bitmap[3 * i + j ].LoadBitmap( IDB_CHOOSE );
}
pOldBitmap = MemDC.SelectObject( bitmap[ 3 * i + j ] );
pDC-BitBlt( myLeft , myTop , mySize , mySize , MemDC , 0 , 0 , SRCCOPY );
MemDC.SelectObject( pOldBitmap );
}
}
}
void CtictactoeView::OnMouseMove(UINT nFlags, CPoint point)//跟踪鼠标位置
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
this-point = point;
int x , y;
x = -1;
y = -1;
if( point.x = 5 point.x = 105 )
x = 0;
else if( point.x = 110 point.x = 210 )
x = 1;
else if( point.x = 215 point.x = 315 )
x = 2;
if( point.y = 5 point.y = 105 )
y = 0;
else if( point.y = 110 point.y = 210 )
y = 1;
else if( point.y = 215 point.y = 315 )
y = 2;
CRect mRect;
if( currX == x currY == y )
return;
if( currX != -1 currY != -1 myGraph[currY][currX] == 3 )
{
myGraph[currY][currX] = 0;
mRect = CRect( 5 + currX * 105 , 5 + currY * 105 , 105 + currX * 105 , 105 + currY * 105 );
InvalidateRect( mRect );
currX = -1;
currY = -1;
}
if( x != -1 y != -1 myGraph[y][x] == 0 )
{
currX = x;
currY = y;
myGraph[y][x] = 3;
mRect = CRect( 5 + x * 105 , 5 + y * 105 , 105 + x * 105 , 105 + y * 105 );
InvalidateRect( mRect );
}
CView::OnMouseMove(nFlags, point);
}
void CtictactoeView::OnMouseX( CCmdUI *pCmdUI )//在状态栏中显示鼠标位置
{
CString cs;
cs.Format( "X=%d", point.x );
pCmdUI-SetText( cs );
}
void CtictactoeView::OnMouseY( CCmdUI *pCmdUI ) //在状态栏中显示鼠标位置
{
CString cs;
cs.Format( "Y=%d", point.y );
pCmdUI-SetText( cs );
}
void CtictactoeView::OnWhosFirst( CCmdUI *pCmdUI )//在状态栏中显示电脑先走还是人先走
{
if( whosFirst == 2 )
pCmdUI-SetText( "电脑先" );
else
pCmdUI-SetText( "用户先" );
}
void CtictactoeView::OnLButtonDown(UINT nFlags, CPoint point)//人走棋的输入部分
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if( currX == -1 || currY == -1 )
{
}
else
{
myGraph[currY][currX] = whosTurn;
CRect mRect;
mRect = CRect( 5 + currX * 105 , 5 + currY * 105 , 105 + currX * 105 , 105 + currY * 105 );
InvalidateRect( mRect );
if( whosTurn == 1 )
whosTurn = 2;
else
whosTurn = 1;
currX = -1;
currY = -1;
int ret = judgment();
if( ret == 0 )
computerPlay();
else
winner( ret );
}
CView::OnLButtonDown(nFlags, point);
}
void CtictactoeView::computerPlay(void) //电脑走棋的人工智能部分
{
long score[3][3];
long maxScore;
int x,y;
int i,j,k;
int me = 2;
int another = 1;
for( i = 0 ; i 3 ; i++ )
for( j = 0 ; j 3 ; j++ )
{
score[i][j] = 0;
if( myGraph[i][j] != 0 )
continue;
if( ( i + j ) % 2 == 0 )
score[i][j] += 10;
else
score[i][j] += 1;
if( i == 1 j == 1 )
score[i][j] += 90;
for( k = 0 ; k 3 ; k++ )
if( k != j )
{
if( myGraph[i][k] == me )
{
if( myGraph[i][3-j-k] == me )
score[i][j] += 100000;
else if( myGraph[i][3-j-k] == 0 )
score[i][j] += 1000;
break;
}
else if( myGraph[i][k] == another )
{
if( myGraph[i][3-j-k] == another )
score[i][j] += 10000;
else if( myGraph[i][3-j-k] == 0 )
score[i][j] += 750;
break;
}
}
for( k = 0 ; k 3 ; k++ )
if( k != i )
{
if( myGraph[k][j] == me )
{
if( myGraph[3-i-k][j] == me )
score[i][j] += 1000000;
else if( myGraph[3-i-k][j] == 0 )
score[i][j] += 1000;
break;
}
else if( myGraph[k][j] == another )
{
if( myGraph[3-i-k][j] == another )
score[i][j] += 10000;
else if( myGraph[3-i-k][j] == 0 )
score[i][j] += 750;
break;
}
}
if( i == j )
{
for( k = 0 ; k 3 ; k++ )
if( k != i )
{
if( myGraph[k][k] == me )
{
if( myGraph[3-i-k][3-i-k] == me )
score[i][j] += 1000000;
else if( myGraph[3-i-k][3-i-k] == 0 )
score[i][j] += 1000;
break;
}
else if( myGraph[k][k] == another )
{
if( myGraph[3-i-k][3-i-k] == another )
score[i][j] += 10000;
else if( myGraph[3-i-k][3-i-k] == 0 )
score[i][j] += 750;
break;
}
}
}
if( ( i + j ) == 2 )
{
for( k = 0 ; k 3 ; k++ )
if( k != i 2 - k != j )
{
if( myGraph[k][2-k] == me )
{
if( myGraph[3-i-k][i+k-1] == me )
score[i][j] += 1000000;
else if( myGraph[3-i-k][i+k-1] == 0 )
score[i][j] += 1000;
break;
}
else if( myGraph[k][2-k] == another )
{
if( myGraph[3-i-k][i+k-1] == another )
score[i][j] += 10000;
else if( myGraph[3-i-k][i+k-1] == 0 )
score[i][j] += 750;
break;
}
}
}
}
maxScore = 0;
for( i = 0 ; i 3 ; i++ )
for( j = 0 ; j 3 ; j++ )
if( score[i][j] maxScore )
{
maxScore = score[i][j];
x = i;
y = j;
}
CRect mRect;
mRect = CRect( 5 + y * 105 , 5 + x * 105 , 105 + y * 105 , 105 + x * 105 );
InvalidateRect( mRect );
myGraph[x][y] = whosTurn;
if( whosTurn == 1 )
whosTurn = 2;
else
whosTurn = 1;
int ret = judgment();
if( ret != 0 )
winner( ret );
}
int CtictactoeView::judgment()//判断是否已经结束游戏,判决谁赢得比赛
{
int who;
int i,j;
bool flag;
for( who = 1 ; who = 2 ; who++ )
{
//检查玩家who在行上是否成胜状态
for( i = 0 ; i 3 ; i++ )
{
flag = true;
for( j = 0 ; j 3 flag ;j++ )
if( myGraph[i][j] != who )
flag = false;
//如果有成胜状态,就可以返回了
if( flag )
return who;
}
for( j = 0 ; j 3 ; j++ )
{
flag = true;
for( i = 0 ; i 3 flag ; i++ )
if( myGraph[i][j] != who )
flag = false;
if( flag )
return who;
}
//检查斜列1有无成胜状态
flag = true;
for( i = 0 ; i 3 flag ; i++ )
if( myGraph[i][i] != who )
flag = false;
if( flag )
return who;
//检查斜列2有无成胜状态
flag = true;
for( i = 0 ; i 3 flag ; i++ )
if( myGraph[i][3-i-1] != who )
flag = false;
if( flag )
return who;
}
flag = true;
for( i = 0 ; i 3 flag ; i++ )
for( j = 0 ; j 3 flag ; j++ )
if( myGraph[i][j] == 0 )
flag = false;
if( flag )
return 3;
else
return 0;
return 0;
}
void CtictactoeView::winner( int who )//显示谁赢得比赛
{
switch( who )
{
case 1:
::AfxMessageBox( "祝贺你胜利啦!" );
break;
case 2:
::AfxMessageBox( "电脑胜利,你要加油噢!" );
break;
case 3:
::AfxMessageBox( "平局!" );
}
initGame();
}
void CtictactoeView::initGame(void)//一局游戏的初始化
{
int i , j;
for( i = 0 ; i 3 ; i++ )
for( j = 0 ; j 3 ; j++ )
myGraph[i][j] = 0;
currX = -1;
currY = -1;
CRect mRect;
mRect = CRect( 5 , 5 , 315 , 315 );
InvalidateRect( mRect );
if( whosFirst == 1 )
{
whosFirst = 2;
whosTurn = 2;
computerPlay();
}
else
{
whosFirst = 1;
whosTurn = 1;
}
}
void CtictactoeView::OnNewgame()//开始新的游戏
{
// TODO: 在此添加命令处理程序代码
initGame();
}
本文来自CSDN博客,转载请标明出处:
用C写一个井字棋程序,但第(1,1)格总是显示5,代码如下,望解答
#includestdio.h
#includectype.h
#includeconio.h
int n=9, z=0, qp[10]={0};
int chkwin(int t[], int w)
{if (t[1]==w t[1]==t[2] t[2]==t[3]) return(w);
if (t[4]==w t[4]==t[5] t[5]==t[6]) return(w);
if (t[7]==w t[7]==t[8] t[8]==t[9]) return(w);
if (t[1]==w t[1]==t[4] t[4]==t[7]) return(w);
if (t[2]==w t[2]==t[5] t[5]==t[8]) return(w);
if (t[3]==w t[3]==t[6] t[6]==t[9]) return(w);
if (t[1]==w t[1]==t[5] t[5]==t[9]) return(w);
if (t[3]==w t[3]==t[5] t[5]==t[7]) return(w);
return(0);
}
long search(int n, int k, int t[])
{int i, h, f, g;
long j;
if (n==0) return(chkwin(t,k));
for (f=0, j=0,i=1; i10; i++)
if (t[i]==0)
{t[i]=k; h=chkwin(t,k);
if (h==k) f++;
else j+=search(n-1,k*-1,t);
t[i]=0;
}
if (fz) for (j=k, g=n; g0; j*=g--);
return(j);
}
/* 电脑选位置走棋,择位原则1.当前位置必须为空 */
/* 2.若走当前位置电脑能赢,则走这一步,否则转(3) */
/* 3.若当前位置被人走电脑会输,则走这一步,否则转(4) */
/* 4.试走当前位置并调用 search()函数,求走当前位置电脑的有利程度 */
/* 5.找对电脑有利程度最大的位置走 */
void cgo()
{int i, ti=0;
long j=-8000000, t=0;
for (ti=1; ti-2; ti-=2) /*ti=1,先看自己能否赢;ti=-1,看对受能否赢*/
for (i=1; i10; i++)
if (qp[i]==0)
{qp[i]=ti;
if (chkwin(qp, ti)!=0) {n--; qp[i]=1; return;}
qp[i]=0;
}
for (i=1; i10;i++)
if (qp[i]==0)
{qp[i]=1; t=search(n-1,-1,qp);
if (tj) {j=t; ti=i;}
qp[i]=0;
}
n--; qp[ti]=1;
}
/* 函数mgo(),人输入走棋位置 */
void mgo()
{int c=0;
printf ("\nPlease enter the Num to go: ");
for (c=getche(); ; printf("\n"), c=getche() )
if (isdigit(c) c!='0' qp[c-48]==0)
{n--; qp[c-48]=-1; return;
} }
/* 屏幕输出函数display,在屏幕上输出当前的棋盘 */
void display(int x)
{int i;
char t[10]={0};
for (i=1; i10; i++)
{if (qp[i]0) t[i]=88;
if (qp[i]0) t[i]=79;
}
printf ("\n%c|%c|%c\n-----\n%c|%c", t[1], t[2], t[3], t[4], t[5]);
printf ("|%c\n-----\n%c|%c|%c\n", t[6], t[7], t[8], t[9]);
if (x==0) printf("\ndraw! \n");
if (x==1) printf("\ncomputer win!\n");
if (x==2) printf("\ncontinue \n");
}
main()
{char c;
printf ("\nGo first? [Y/N]:"); /*选择谁先走*/
for (c=getche(); c!='Y'c!='y'c!='N'c!='n'; c=getche());
if (c=='N'||c=='n') {cgo(); z=1; display(2);}
while (1)
{mgo(); if (!n) {display(0); break;} /*人走,若不是最后一步,继续;否则跳出*/
cgo(); if (chkwin(qp,1)) {display(1); break;} /*电脑走,若没赢,继续;否则跳出*/
if (n) display(2); /*还没走到最后一步,继续;否则跳出*/
else {display(0); break;}
}
getchar();
return 0;
}
井字棋源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java井字棋、井字棋源代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:云播放源代码(直播源 码云)
- 下一篇:包含易语言xuetr源代码的词条
相关推荐
- 05-07pb超级报表源代码(pb报表工具)[20240507更新]
- 05-07简历源代码可以上传照片的简单介绍[20240507更新]
- 05-07广告切换源代码免费下载(广告切换源代码免费下载安装)[20240507更新]
- 05-06阁楼网源代码(阁楼是什么网站)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
- 05-06人脸识别源代码pdf的简单介绍[20240506更新]
- 05-06包含超市管理系统java源代码的词条[20240506更新]
- 05-06商城app源代码免费(商城App源码)[20240506更新]
- 05-06包含游戏源代码不同的模式的词条[20240506更新]
- 05-06matlab写的图象灰度切分源代码(matlab灰度图像分段线性变换)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接