目录
一、规划代码文件
1. test.c - 测试游戏程序逻辑
2. game.c - 实现游戏项目里运用的函数
3. game.h - 包含游戏项目所需的声明
二、实现代码
1.test.c - 测试游戏程序逻辑
#define _CRT_SECURE_NO_WARNINGS 1
//测试游戏程序逻辑
#include"game.h"
void menu()
{
printf(" < M E N U > \n");
printf("*******************************\n");
printf("********* 1.play **********\n");
printf("********* 0.exit **********\n");
printf("*******************************\n");
}
void game()
{
//创建三子棋棋盘 - 二维数组3*3
char board[ROW][COL] = { 0 };
//初始化棋盘 - 数组里面放空格
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("< YOU WIN!! >\n");
}
else if ('#'==ret)
{
printf("< YOU LOSE!! >\n");
}
else if('Q'==ret)
{
printf("< 平局 >\n");
}
}
int main()
{
//随机函数srand只需要调用一次,所以放在主函数了
srand((unsigned int)time(NULL));
int input = 0;
do
{
//打印菜单
menu();
//玩家选择
printf("请玩家选择游戏菜单:>");
scanf("%d", &input);
//判断玩家选择
switch (input)
{
case 1:
printf(" < 开始游戏 >\n\n");
//开始游戏
game();
break;
case 0:
printf(" < 退出游戏 >\n");
break;
default:
printf("< 选择错误,请重新选择菜单!! >\n");
break;
}
} while (input);
return 0;
}
2.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] = ' ';
}
}
//memset(&board[0][0], ' ', row * col * sizeof(board[0][0]);
}
//显示棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
//打印一行 %c | %c | %c
//打印一个 %c 再打印 |
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
//当打印完最后一个 %c 之后,不打印 | 了
if (j < col - 1)
printf("|");
}
//换行
printf("\n");
//打印一行 ---|---|---
//当打印完最后一个行 %c | %c | %c之后,不打印 ---|---|--- 了
if (i < row - 1)
{
//打印一组 --- 再打印 |
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");
//printf("%d %d\n", x, y);
while (1)
{
//随机生成0-2的数字,生成随机坐标
int x = rand() % row;
int y = rand() % col;
//判断坐标是否占用
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘占满 - 有无空格
int IsFull(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++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;//满了
}
//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
//赢 - 返回赢家的符号'*'或者'#'
//行连字赢
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//列连字赢
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//斜线赢
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//平局 -
//棋盘被占满
if (IsFull(board,row,col))
{
return 'Q';
}
//游戏继续
return 'C';
}
3.game.h - 包含游戏项目所需的声明
#define _CRT_SECURE_NO_WARNINGS 1
//包含游戏项目所需的声明
//定义变量
#define ROW 3
#define COL 3
//头文件包含
#include<stdio.h>
#include<string.h> /* memset */
#include<stdlib.h>/* rand、srand*/
#include<time.h>/* time*/
//函数声明
//初始化棋盘
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);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//判断棋盘占满
int IsFull(char board[ROW][COL], int row, int col);