当前位置:首页 > 代码 > 正文

井字棋源代码(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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/29483.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载