You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
3.5 KiB

#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "math.h"
#include "time.h"
// 判断所选位置是否可下 不能下返回-1 可以下返回0
int IsNULL ( int a[3][3], int x, int y )
{
if ( a[x][y] == 0 ) return 0;
return -1;
}
// 打印棋盘
void Print ( int a[3][3] )
{
system( "cls" );
int i, j;
printf ( "\n\n\t井 字 棋 游 戏\n" );
for ( i = 0; i < 3; i ++ )
{
printf ( "\n\t+-+-+-+\n\t|" );
for ( j = 0; j < 3; j ++ )
{
if ( a[i][j] == 0 ) printf( " " );
if ( a[i][j] == 1 ) printf( "X" );
if ( a[i][j] == -1 ) printf( "O" );
printf( "|" );
}
}
printf ( "\n\t+-+-+-+\n\n" );
}
// 电脑下子
int GO ( int a[3][3] )
{
int i, t;
int k;
for ( i = 0; i < 3; i ++ )
{
t = a[i][0] + a[i][1] + a[i][2];
if ( t == -2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[i][k] == 0 )
{
a[i][k] = -1;
return 0;
}
}
}
}
for ( i = 0; i < 3; i ++ )
{
t = a[0][i] + a[1][i] + a[2][i];
if ( t == -2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][i] == 0 )
{
a[k][i] = -1;
return 0;
}
}
}
}
int j = 0; t = 0;
for ( i = 0; i < 3; i ++ )
{
j += a[i][i];
t += a[i][2-i];
}
if ( t == -2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][2-k] == 0 )
{
a[k][2-k] = -1;
return 0;
}
}
}
if ( j == -2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][k] == 0 )
{
a[k][k] = -1;
return 0;
}
}
}
for ( i = 0; i < 3; i ++ )
{
t = a[i][0] + a[i][1] + a[i][2];
if ( t == 2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[i][k] == 0 )
{
a[i][k] = -1;
return 0;
}
}
}
}
for ( i = 0; i < 3; i ++ )
{
t = a[0][i] + a[1][i] + a[2][i];
if ( t == 2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][i] == 0 )
{
a[k][i] = -1;
return 0;
}
}
}
}
j = 0; t = 0;
for ( i = 0; i < 3; i ++ )
{
j += a[i][i];
t += a[i][2-i];
}
if ( t == 2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][2-k] == 0 )
{
a[k][2-k] = -1;
return 0;
}
}
}
if ( j == 2 )
{
for ( k = 0; k < 3; k ++ )
{
if ( a[k][k] == 0 )
{
a[k][k] = -1;
return 0;
}
}
}
while ( 1 )
{
srand ( time ( 0 ) );
i = rand ( ) % 3;
j = rand ( ) % 3;
if ( IsNULL ( a, i, j ) == 0 )
{
a[i][j] = -1;
break;
}
}
return 0;
}
// 平局返回0;正方胜返回1;负反胜利返回-1;否则返回6;
int Check ( int a[3][3] )
{
int i, t;
for ( i = 0; i < 3; i ++ )
{
t = a[i][0] + a[i][1] + a[i][2];
if ( t == -3 ) return -1;
if ( t == 3 ) return 1;
}
for ( i = 0; i < 3; i ++ )
{
t = a[0][i] + a[1][i] + a[2][i];
if ( t == -3 ) return -1;
if ( t == 3 ) return 1;
}
int j = 0; t = 0;
for ( i = 0; i < 3; i ++ )
{
j += a[i][i];
t += a[i][2-i];
}
if ( t == -3 || j == -3 ) return -1;
if ( t == 3 || j == 3 ) return 1;
for ( i = 0; i < 3; i ++ )
{
for ( j = 0; j < 3; j ++ )
{
if ( a[i][j] == 0 ) return 6;
}
}
return 0;
}
int CP ( int a[3][3] )
{
int t = Check ( a );
Print ( a );
if ( t == 0 )
{
printf ( "\t 平局!");
system ( "pause" );
return 0;
}
if ( t == 1 )
{
printf ( "\t 你赢了! ");
system ( "pause" );
return 0;
}
if ( t == -1 )
{
printf ( "\t 你输了! ");
system ( "pause" );
return 0;
}
return -1;
}
int main ( )
{
system ( "井字棋游戏设计" );
int a[3][3];
memset ( a, 0, sizeof ( a ) );
Print ( a );
int x, y, t;
while ( 1 )
{
scanf ( "%d %d", &x, &y );
x --;
y --;
a[x][y] = 1;
t = CP ( a );
if ( t == 0 ) return 0;
GO ( a );
t = CP ( a );
if ( t == 0 ) return 0;
}
return 0;
}