井字棋c源代码(井字棋代码java逻辑)
admin 发布:2022-12-19 19:13 123
今天给各位分享井字棋c源代码的知识,其中也会对井字棋代码java逻辑进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、C++ 井字棋
- 2、C语言编写井字棋游戏 代码已有半成品
- 3、用c语言写井字棋游戏 求教一个问题
- 4、用C写一个井字棋程序,但第(1,1)格总是显示5,代码如下,望解答
- 5、C语言 怎么编程井字棋
- 6、求井字棋的源代码
C++ 井字棋
好了 所有要求都有了
#include iostream
#include string
using namespace std;
const int MAX_MOVES=9;
void printBoard(char board[3][3]);
void getNextMove(char board[3][3]);
void win(char board[3][3]);
void whowin(char key);
int foot = 0;
int main()
{
int i;
int n = 0;
char board[3][3]={ '7','8','9', '4','5','6', '1','2','3' };
printBoard(board);
for(i=0;iMAX_MOVES;i++)
{
getNextMove(board);
win(board);
n++;
}
if(n=MAX_MOVES)
cout"gameover";
system("PAUSE");
return 0;
}
void win(char a[3][3])
{
int i, j, k;
char key;
if((a[0][0] == a[1][1] a[1][1] == a[2][2] a[2][2] == a[0][0]) || (a[2][0] == a[1][1] a[1][1] == a[0][2] a[2][0] == a[0][2]))
{
key = a[0][0];
whowin(key);
}
else
{
for(i = 0; i 3; i++)
for(j = 0; j 3; j++)
if(a[i][j] == 15 || a[i][j] == 'X')
{
key = a[i][j];
for(k = 0; k 3; k++)
{
if(a[i][k] != key)
break;
}
if(k == 3)
whowin(key);
for(k = 0; k 3; k++)
{
if(a[k][j] != key)
break;
}
if(k == 3)
whowin(key);
}
}
}
void whowin(char key)
{
if(key == 15)
cout "P1 Win!" endl;
else
cout "P2 Win!" endl;
exit(0);
}
void printBoard(char board[3][3])
{
coutboard[0][0]" | "board[0][1]" | "board[0][2]endl;
cout"--+---+--"endl;
coutboard[1][0]" | "board[1][1]" | "board[1][2]endl;
cout"--+---+--"endl;
coutboard[2][0]" | "board[2][1]" | "board[2][2]endl;
}
void getNextMove(char board[3][3])
{
int i,j,s,t;
char m;
while(1)
{
s = -1;
t = -1;
cout"Make your move: ";
cinm;
for(i=0;i3;i++)
for(j=0;j3;j++)
if(board[i][j]==m)
{
s=i;
t=j;
}
if(s == -1 t == -1)
cout "that point already has a pawn!" endl;
else
break;
}
if(foot % 2 == 0)
board[s][t] = 15;
else
board[s][t] = 'X';
foot++;
system("cls");
printBoard(board);
}
C语言编写井字棋游戏 代码已有半成品
你初始化一个字符数组,里面都给他一样的初始值 E
X 下了就改成X ,O 下了就改成 O,下完以后判断横竖斜三条线有没有一样的,
一共就九个格子,下一步就少一步 ,下之前判断一下,如果等于E ,就是空的,可以放子。
下完一步总步数减一,你这样不就能确定还有几步可以走了。
九步都下完如果没有横竖斜都一样的不就是平局吗,所有数组元素的值都不等于E了不就结束了,或者九步完了也结束了
另外,少用GOTO ,变量定义最好有意义,写点注释
用c语言写井字棋游戏 求教一个问题
用char数组存棋盘,并记录当前是玩家1还是玩家2。
如果用户输入0,首先判断当前玩家是1还是2。如果是1,就board[0] = 'O';否则board[0] = 'X'。
伪代码就类似于:
char board[10] = " "; //初始为9个空格,并且多留一个位置放'\0'
int player = 1; //从玩家1开始,取值为1或2
int position; //玩家在哪个格子放O或X。取值为0~8
while(true) {
scanf("%d", position); //获取玩家输入
if (player == 1) { //对于玩家1,应该往棋盘上放O,下一次就轮到玩家2
board[position] = 'O';
player = 2;
} else { //对于玩家2,应该往棋盘上放X,下一次就轮到玩家1
board[position] = 'X';
player = 1;
}
print(board); //输出棋盘(需要另外实现)
if (gameOver(board)) { //检查输赢(需要另外实现)
//输出谁赢了并退出
break;
}
}
用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;
}
C语言 怎么编程井字棋
简单来说,定义数据结构(比如棋盘数组,棋盘格子以及棋子,双方玩家等相关的数据结构表示),定义规则(比如同一个位置不能放两颗棋子,三颗棋子连线放胜利)。
具体取决于需求,比如图形表示和AI(人工智能)等等。如果你只是想要简单的用命令行和文字输出表示,那么编写一个控制台应用程序就可以。如果需要图形等控制,需要借助一些图形以及UI库等。但是这些外部表示可以跟核心数据结构和规则,算法等分离开来。所以刚开始先用文字表示写出核心代码,后续可以逐渐加上UI图形,AI等。
求井字棋的源代码
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源代码和井字棋代码java逻辑的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-06代码源软件库(程序代码库)[20240506更新]
- 05-06点击弹出密码代码(点击弹出密码代码错误)[20240506更新]
- 05-06滚动导航代码(导航页面代码)[20240506更新]
- 05-06人脸识别源代码pdf的简单介绍[20240506更新]
- 05-06无间隔滚动代码(循环滚动代码)[20240506更新]
- 05-06jquery三级下拉菜单代码(jQuery下拉菜单)[20240506更新]
- 05-06透明css代码(css3透明)[20240506更新]
- 05-06微博设置完成获得嵌入代码(微博设置完成获得嵌入代码怎么弄)[20240506更新]
- 05-06包含超市管理系统java源代码的词条[20240506更新]
- 05-06图书馆代码查询(图书馆代码怎么看)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接