C语言小游戏之三子棋
三子棋又叫圈圈叉叉井字棋,初学c语言,我们可以尝试用c语言来实现这个小游戏。
一、基本思路
1.作为一个游戏自然需要一个菜单或者是目录供别人选择游玩还是退出,所以首先需要一个菜单。
2.创建棋盘并再每回合开始进行初始化。这里自然要使游戏能重复进行。
3.打印棋盘,以图形的方式打印出来才能更好的选择坐标。
4.玩家如何落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。电脑落子(随机位置落子) ,'o’表示电脑落子。
5.判定胜负关系。
有了基本思路后我们就可以着手实现这个小游戏了。
二、程序实现
1.菜单的制作
定义一个menu菜单函数来打印我们的菜单
void menu()
{
printf("***********************************\n");
printf("-----1、开始游戏 0、退出游戏-----\n");
printf("***********************************\n");
}
2.对玩家在菜单栏里面输入的字符进行判断
按照菜单栏输入 1 开始游戏,0退出游戏,输入其他则重新输入
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
if (input == 1)
{
printf("游戏开始\n");
game();
}
else if (input == 0)
{
printf("游戏结束");
}
else
printf("输入错误,请重新输入\n");
} while (input);
}
3.棋盘的建立
定义棋盘的行列,这里用宏定义提高代码可读性
#define max_row 3 //行数
#define max_col 3 //列数
void InitBoard(char board[max_row][max_col], int row, int col)
{
for (int i = 0; i < row; i++) //让所有的行列上位置为空格,方便区分后面填入的圈叉
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[max_row][max_col], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++) //打印棋盘列
{
if (j < col - 1)
{
printf(" %c |", board[i][j]);
}
else printf(" %c \n", board[i][j]);
}
if (i < row - 1)
{
for (int j = 0; j < col; j++)//打印棋盘行的分隔
{
if (j < col - 1)
{
printf("---|");
}
else printf("---\n");
}
}
}
}
使游戏每回合都能重新建立一个空棋盘
void game()
{
char board[max_row][max_col] = { 0 };
InitBoard(board, max_row, max_col); //建立空棋盘
DisplayBoard(board, max_row, max_col);//打印棋盘
while (1)
{
char ret = 0;
Player_move(board, max_row, max_col);
DisplayBoard(board, max_row, max_col);
ret = isWin(board, max_row, max_col);
if (ret == 'x')
{
printf("获胜!\n");
break;
}
else if (ret == 'q')
{
printf("平局!\n");
break;
}
Computer_move(board, max_row, max_col);
DisplayBoard(board, max_row, max_col);
ret = isWin(board, max_row, max_col);
if (ret == 'o')
{
printf("输了!\n");
break;
}
}
}
4.玩家的落子
使用’x’表示玩家落子。
判断玩家输入的坐标是否合法,注意几点
1.落子在棋盘范围内。
2.要在棋盘未使用的格子落子。
3.输入的坐标是否超出棋盘。
void Player_move(char board[max_row][max_col], int row, int col)
{
int x, y;
printf("轮到您了\n");
do
{
printf("请输入坐标>");
scanf("%d %d", &x, &y);
if ((x < 1 && x > 3) || (y < 1 && y > 3)) printf("输入错误,请重新输入\n");
else if (board[x - 1][y - 1] != ' ') printf("位置占用,请重新输入\n");
} while (x < 1 && x > 3 || y < 1 && y > 3 || board[x - 1][y - 1] != ' ');
board[x - 1][y - 1] = 'x'; //玩家所占位置用‘x’表示
}
5.电脑的落子
'o’表示电脑落子。
1.随机落子
2.判断落子地方是否为空
void Computer_move(char board[max_row][max_col], int row, int col)
{
int x, y = 0;
printf("电脑出手\n");
do
{
x = rand() % row;
y = rand() % col;
} while (board[x][y] != ' ');
board[x][y] = 'o'; //电脑用‘o’表示所占位置
6.判断胜负
通过对棋盘的返回值来判断胜负
char orWin(char board[max_row][max_col], int row, int col)
{
for (int i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) //行相等时
{
return board[i][0];
}
}
for (int j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j]) //列相等时
{
return board[0][j];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];
}
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
{
return board[1][1];
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < row; j++)
{
if (board[i][j] == ' ') return 'c'; //有空的返回c,表示继续
}
}
return 'q';
}
void game()
{
char board[max_row][max_col] = { 0 };
InitBoard(board, max_row, max_col); //首先要建立空棋盘
DisplayBoard(board, max_row, max_col);//打印棋盘
while (1)
{
char ret = 0;
Player_move(board, max_row, max_col);
DisplayBoard(board, max_row, max_col);
ret = isWin(board, max_row, max_col);
if (ret == 'x')
{
printf("获胜!\n"); //由玩家出手局数时获胜的只能是玩家
break;
}
else if (ret == 'q')
{
printf("平局!\n"); //最后一颗由先手玩家落子,所以这里判断棋盘是否填满,返回值q则平局
break;
}
Computer_move(board, max_row, max_col);
DisplayBoard(board, max_row, max_col);
ret = isWin(board, max_row, max_col);
if (ret == 'o')
{
printf("输了!\n"); //由电脑出手局获胜的则是电脑
break;
}
}
}
到此也算使这个小游戏能正常运转了当然还能进行深度优化,使电脑变得不那么“智障”始终立于不败之地,到此对于三子棋小游戏的初步实现完成。