代码思路:
(1)void menu() - 打印出游戏的菜单,让用户选择是玩游戏还是退出。
(2)void game() - 游戏函数
- 使用一个二维字符数组
board
来存储棋盘的状态。 - 调用
InitBoard
函数初始化棋盘(这里假设棋盘是ROW
行COL
列。 - 通过循环让玩家和电脑交替下棋,直到游戏结束(有人赢或平局)。
- 使用
PlayerMove
和ComputerMove
函数来让玩家和电脑下棋。 - 使用
IsWin
函数来检查游戏是否结束(玩家赢、电脑赢或平局)。 - 最后,根据
IsWin
的返回值打印游戏结果。
(3)int main() - 主函数
- 使用
do-while
循环显示菜单,并根据用户的选择调用game
函数或退出游戏。 - 使用
srand
和time
函数为随机数生成器设置种子,这对于电脑下棋时的随机性很重要。 - 根据用户的选择执行相应的操作,并处理无效输入。
下面为具体函数实现:
main.c文件:主函数 - 实现三子棋游戏的基本框架
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void menu()
{
printf("*************************\n");
printf("******** 1. play ********\n");
printf("******** 2. exit ********\n");
printf("*************************\n");
}
void game()
{
//存储数据 - 二维数组
char board[ROW][COL];
//初始化棋盘 - 都为空格
InitBoard(board, ROW, COL);
//打印一下棋盘 - 本质是打印数组的内容
DisplayBoard(board, ROW, COL);
char ret = 0; //获取游戏状态
//走棋
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家赢得游戏
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家赢得游戏
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家赢!!!\n");
}
else if (ret == '#')
{
printf("电脑赢!!!\n");
}
else
{
printf("平局!!!\n");
}
DisplayBoard(board, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
printf("三子棋游戏\n");
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!!!\n");
break;
}
} while(input);
return 0;
}
game.c文件:包括游戏实现的函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
//(1)下面这个代码不够通用,只适用于3列的棋盘
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
// int i = 0;
// for (i = 0; i < row; i++)
// {
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// if (i < row - 1)
// {
// printf("---|---|---\n");
// }
//
// }
//}
//(2)改造
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//下面是一行的打印
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家下棋代码
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走!!!\n");
while (1)
{
printf("请输入下棋的坐标:");
scanf("%d %d", &x, &y);
//判断坐标合法性
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//下棋
//判断坐标是否被占用
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标错误,请重新输入\n");
}
}
}
//电脑下棋代码:随即下
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋!!!\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
//判断占用
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
game.h文件:头文件的声明
//关于游戏相关的函数声明,符号声明
//头文件的包含
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//符号的定义
#define ROW 3 //行
#define COL 3 //列
//函数的声明
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
//1.电脑赢 - *
//2.电脑赢 - #
//3.平局 - Q
//4. 游戏继续 - C
char IsWin(char board[ROW][COL], int row, int col);