先简单介绍一下三子棋的规则:
在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
按照我们以前玩的游戏进入页面首先得有菜单,那给我们的游戏也来个简单的菜单,提示用户操作!!!
int Menu()
{
printf("**********************************\n");
printf("************* 1.play *************\n");
printf("************* 0.exit *************\n");
printf("**********************************\n");
int choose;
printf("请选择:");
scanf("%d", &choose);
return (choose);
}
要想开始游戏就得有棋盘,那就写个函数来实现棋盘,刚开始棋盘上是没有棋子的哦,就初始化之,让棋盘为空。
//初始化
void InitBoard(char arr[ROW][COL], int row, int col) //产生一个3*3数组,初始化为空格。
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
arr[i][j] = ' ';
}
}
//显示棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < 3; i++)
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
if (i != 2)
printf("---|---|---\n");
}
}
有了棋盘就可以开始下棋了,电脑又该如何走呢?电脑走需要让电脑产生随机坐标,然后在数组的这个坐标位置放入一个“X”作为电脑的棋子。
//电脑走
void ComputerMove(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋中!!!\n");
srand((unsigned)time(NULL));//产生随机数
while (1)
{
int x = rand() % 3;//对3取余赋给数组的下标
int y = rand() % 3;
if (arr[x][y] == ' ')
{
arr[x][y] = 'X';
break;
}
}
DisplayBoard(arr, ROW, COL);
}
电脑下完,就该人下了。
//人走
void PlayerMOve(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
do
{
printf("请输入你棋子的坐标>");
scanf("%d%d", &x, &y);
if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) //人们不习惯(0,0)这个坐标,而是习惯输入(1,1)。
{
if (arr[x - 1][y - 1] == ' ')//再把传参减一
{
arr[x - 1][y - 1] = 'O';
break;
}
else printf("你放到别人的棋子上了\n");
}
else printf(" 输入有误请重新输入>");
} while (arr[x][y] == ' ');
DisplayBoard(arr, ROW, COL);//显示棋盘
}
电脑和人都下完了,就要判断输赢了 。根据前面提到的规则,来写我们的判断函数。
//判断输赢
char IsWin(char arr[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] )//判断列是否相同
{
if (arr[i][1] == 'X')
{
printf("你连电脑都打不过好菜!!!\n");
return 1;
}
if (arr[i][1] == 'O')
{
printf("恭喜你你赢了!!!\n");
return 1;
}
}
}
for (i = 0; i < col; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] ==arr[2][i] )//判断行是否相同
{
if (arr[1][i] == 'X')
{
printf("你连电脑都打不过好菜!!!\n");
return 1;
}
if (arr[1][i] == 'O')
{
printf("恭喜你你赢了!!!\n");
return 1;
}
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1])//判断左斜线是否相同
{
if (arr[1][1] == 'X')
{
printf("你连电脑都打不过好菜!!!\n");
return 1;
}
if (arr[1][1] == 'O')
{
printf("恭喜你你赢了!!!\n");
return 1;
}
}
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1])//判断右斜线是否相同
{
if (arr[1][1] == 'X')
{
printf("你连电脑都打不过好菜!!!\n");
return 1;
}
if (arr[1][1] == 'O')
{
printf("恭喜你你赢了!!!\n");
return 1;
}
}
else if (IsFull(arr, row, col))
return 0;
}
由于可能出现棋盘下满,却没人获胜的情况,
所以我们需要在其中判断一下平局的情况,我们就写个IsFull函数来判断棋盘是否下满。
//判断棋盘是否下满
int IsFull(char arr[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
上面的都是零散的功能模块,如果要让整个程序正常运行起来,就把它们组合起来。
void Game()
{
int i = 0;
int ret = 0;
char arr[ROW][COL];
InitBoard(arr, ROW, COL);
DisplayBoard(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
printf("请选择谁先走< 1.电脑先走 2.我先走 >");
int choose;
scanf("%d", &choose);
if (choose == 2)
{
while (1)
{
PlayerMOve(arr, ROW, COL);
ComputerMove(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (ret == 1)
break;
}
}
else if (choose == 1)
{
while (1)
{
ComputerMove(arr, ROW, COL);
PlayerMOve(arr, ROW, COL);
ret = IsWin(arr, ROW, COL);
if (ret == 1)
break;
}
}
if (ret == 0)
{
printf("平局\n");
}
}
把上边的这些函数都放在一个头文件里
# ifndef __SANZIQI_H__
# define __SANZIQI_H__
# define ROW 3
# define COL 3
//初始化
void InitBoard(char arr[ROW][COL], int row, int col);
//显示棋盘
void DisplayBoard(char arr[ROW][COL], int row, int col);
//电脑走
void ComputerMove(char arr[ROW][COL], int row, int col);
//人走
void PlayerMOve(char arr[ROW][COL], int row, int col);
//判断输赢
char IsWin(char arr[ROW][COL], int row, int col);
//判断棋盘是否下满
int IsFull(char arr[ROW][COL], int row, int col);
//游戏
void Game();
//菜单
int Menu();
# endif
最后再写个游戏测试部分
# include <stdio.h>
# include <stdlib.h>
# include "三子棋.h"
int main()
{
int choose = 0;
do
{
choose = Menu();
switch(choose)
{
case 1:
Game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误\n");
break;
}
} while (choose);
system("pause");
return 0;
}