学了二维数组我们就可以试着写一个三子棋小游戏了,但电脑随机的 *** 作让整个游戏根本没难度,所以我给大家带来了一个不是那么笨的三子棋,将人的思维带给电脑,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#define ROW 3 //宏定义棋盘长宽
#define COL 3
void mvue() //打印游戏菜单函数
{
printf("*************************************\n");
printf("*********** 1.开始游戏 *************\n");
printf("*********** 0.退出游戏 *************\n");
printf("*************************************\n");
}
//******************棋盘内部置空******************************
void initialization(char disc[ROW][COL] )
{
int i = 0;
for (i = 0; i < ROW; i++)
{
int n = 0;
for (n = 0; n < COL; n++)
{
disc[i][n] = ' ';
}
}
}
//*****************创建棋盘外观,打印棋盘********************************
void print(char disc[ROW][COL] )
{
printf("+---+---+---+\n");
for (int row = 0; row < ROW; row++)
{
printf("| %c | %c | %c |\n", disc[row][0], disc[row][1], disc[row][2]);
printf("+---+---+---+\n");
}
}
//*****************玩家下棋******************************
void a_fallingseed(char disc[ROW][COL])
{
while (1)
{
printf("输入一个坐标(例2,2):");
int x = 0;
int y = 0;
scanf("%d,%d", &x, &y);
if ((x > 0 && x <= ROW) && (y > 0 && y <= COL))
{
if (disc[x - 1][y - 1] == ' ')
{
disc[x - 1][y - 1] = '*';
break;
}
else
printf("坐标已有棋子\n");
}
else
{
printf("坐标非法\n");
}
}
}
//********************电脑下棋****************************
int b_fallingseed(char disc[ROW][COL])//判断敌方横是否为2
{
for (int i = 0; i < ROW; i++)
{
int judge1 = 0;
int n = 0;
for ( n = 0; n < COL; n++)
{
if(disc[i][n] == '*')
judge1++;
}
if (judge1 == 2)
{
for (int max = 0; max < COL; max++)
{
if (disc[i][max] == ' ')
{
disc[i][max] = '#';
return 0;
}
}
}
}
//-------------------------------------------
for (int i = 0; i < COL; i++) //判断敌方纵是否为2
{
int judge2 = 0;
int n = 0;
for (n = 0; n < ROW; n++)
{
if(disc[n][i] == '*')
judge2++;
}
if (judge2 == 2)
{
for (int max = 0; max < COL; max++)
{
if (disc[max][i] == ' ')
{
disc[max][i] = '#';
return 0;
}
}
}
}
//----------------判断敌方右斜是否为2 ---------------------------
int pa = 0;
int pb = 0;
int judge3 = 0;
for (pa = 0; pa < ROW && pb < COL; pa++,pb++)
{
if (disc[pa][pb] == '*')
{
judge3++;
}
if (judge3 == 2)
{
if (disc[0][0] == ' ')
{
disc[0][0] = '#';
return 0;
}
else if (disc[1][1] == ' ')
{
disc[1][1] = '#';
return 0;
}
else
{
disc[2][2] = '#';
return 0;
}
}
}
//--------------判断敌方左斜是否为2 -------------------------
int judge4 = 0;
int pc = 0;
int pd = 0;
for (pc = 0, pd = COL - 1; pc < ROW && pd >= 0; pc++, pd--)
{
if (disc[pc][pd] == '*')
{
judge4++;
}
if (judge4 == 2)
{
if (disc[0][2] == ' ')
{
disc[0][2] = '#';
return 0;
}
else if (disc[1][1] == ' ')
{
disc[1][1] = '#';
return 0;
}
else
{
disc[2][0] = '#';
return 0;
}
}
}
if (disc[1][1] == ' ') //如果没有必走棋,抢中心位置
{
disc[1][1] = '#';
return 0;
}
else //如果中心位置已被占随机下一步棋
{ //这里的随机步还可以优化,让电脑随着你写的一个
// 算法落子,每一步占据最大优势,但是这里是最难的,所以我没写
while (1)
{
int row = rand() % ROW;
int col = rand() % COL;
if (disc[row][col] == ' ')
{
disc[row][col] = '#';
return 0;
}
}
}
}
int iswin(char disc[ROW][COL]) //判断继续游戏还是平局
{
int i = 0;
int y = 0;
for (i = 0; i < ROW; i++)
{
for (y = 0; y < COL; y++)
{
if (disc[i][y] == ' ')
return 1;
}
}
return 0;
}
//---------------------------------------------------
char Win(char disc[ROW][COL]) //判断输赢
{
for (int i = 0; i < ROW; i++)
{
if (disc[i][0] == disc[i][1] && disc[i][1] == disc[i][2] && disc[i][1] != ' ')
{
return disc[i][1];
}
}
for (int y = 0; y < COL; y++)
{
if (disc[0][y] == disc[1][y] && disc[1][y] == disc[2][y] && disc[1][y] != ' ')
{
return disc[0][y];
}
}
if (disc[0][0] == disc[1][1] && disc[1][1] == disc[2][2] && disc[1][1] != ' ')
{
return disc[1][1];
}
else if (disc[0][2] == disc[1][1] && disc[1][1] == disc[2][0] && disc[1][1] != ' ')
{
return disc[1][1];
}
else
{
int c = iswin(disc);
if (c == 0)
return 'Q';
else
return ' ';
}
}
void game() //游戏执行过程总函数
{
printf("玩家先(0)电脑先(1)\n");
int vit = 0;
scanf("%d", &vit);
if (vit == 0) //玩家先
{
char disc[ROW][COL] = { 0 };
initialization(disc);//初始化棋盘函数
print(disc, ROW, COL); //创建棋盘外观
char is = ' ';//判断根据
while (1)
{
a_fallingseed(disc);//玩家下棋*
print(disc, ROW, COL); //打印棋盘
is = Win(disc); //判断胜负
if (is != ' ')
{
break;
}
b_fallingseed(disc);//电脑下棋#
print(disc, ROW, COL);//打印棋盘
is = Win(disc); //判断胜负
if (is != ' ')
{
break;
}
}
if (is == '*')
{
printf("玩家胜利\n");
}
else if (is == '#')
{
printf("电脑胜利\n");
}
else if (is == 'Q')
printf("平局\n");
}
else if (vit == 1) //电脑先
{
char disc[ROW][COL] = { 0 };
initialization(disc);//初始化棋盘函数
//print(disc, ROW, COL); //创建棋盘外观
char is = ' ';//判断根据
while (1)
{
b_fallingseed(disc);//电脑下棋#
//print(disc, ROW, COL); //打印棋盘
is = Win(disc); //判断胜负
if (is != ' ')
{
break;
}
print(disc, ROW, COL);
a_fallingseed(disc);//玩家下棋*
//print(disc, ROW, COL);//打印棋盘
is = Win(disc); //判断胜负
if (is != ' ')
{
break;
}
}
if (is == '*')
{
printf("玩家胜利\n");
}
else if (is == '#')
{
printf("电脑胜利\n");
}
else if (is == 'Q')
printf("平局\n");
}
}
//*************************************************************
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//system("cls");
mvue();
scanf("%d", &input);
switch (input)
{
case 1:
game(); //逐步实现游戏过程的函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
目前最大的缺点就是随机落子那一块,整个代码只是让电脑不会输的太挫,能够正常 *** 作,如果解决电脑随机落子那一块那么电脑可以算是一个不错的对手了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)