整个结构分为三个部分
test.c 测试游戏逻辑
- Do while逻辑
- menu菜单函数
- 选择变量input
- Switch结构
- game函数实现
- 棋盘数组
- 初始化棋盘
- 打印棋盘
- 玩家下棋
- 电脑下棋
- 判断输赢
game.c 游戏函数体
- InitBoard函数进行初始化,参数为棋盘数组,行,列的实现
- 可以用双层循环,也可以用memset进行初始化
- displayboard函数打印棋盘,参数为棋盘,行,列
- playermove玩家下棋,参数为棋盘,行列,
- 指示下棋坐标
- 两个变量存储坐标
- 我们要判断坐标的有效性(坐标是否符合范围,下棋坐标处是否被占用)
- 以上三个部分为循环,直到下棋成功在跳出
- Computermove电脑下棋,参数为棋盘,行和列
- 需要两个坐标,随机下
- x=rand()%row;
- y=rand ()%col;
- 要使用rand我们就要调用srand函数,使用时间戳去生成随机数 stand((unsigned int)time(null));要注意包含头文件
- bcd三步采用循环
- IsWin参数为棋盘,行列
- 玩家赢 返回"*"
- 电脑赢返回"#"
- 平局"Q",Isfull遍历棋盘是否还有空格
- 继续"C"
- 分别判断三行元素是否相等,三列元素是否相等对角线是否相等,并且不是空格则有人胜利,直接返回元素符号类型
game.h 游戏函数声明
- #define 定义行和列,方便到时候改
- 对函数进行声明
- 头文件的包含
代码详情
test.c文件
#include "game.h"
void menu()
{
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("****************\n");
}
void game()
{
char ret;
char board[ROW][COL] = { 0 };
srand(time(NULL));
IntBoard(board, ROW, COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
while (1)
{
//玩家下棋
PlayMove(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");
}
}
int main()
{
int input;
do{
menu();
printf("请选择>:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("game over!\n");
break;
default:
printf("选择错误,请重新选择>:\n");
break;
}
} while (input);
return 0;
}
game.h文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//初始化棋盘
void IntBoard(char board[ROW][COL],int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row, int col);
//玩家操作
void PlayMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL],int row, int col);
//电脑操作
void ComputerMove(char board[ROW][COL], int row, int col);
game.c文件
#include"game.h"
//初始化棋盘
void IntBoard(char board[ROW][COL], int row, int col)
{
int i = 0,j=0;
for (i = 0; i <row; i++)
{
for (j = 0; j <col; j++)
board[i][j] =' ';
}
printf("初始化结束\n");
}
//显示棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 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("---|---|---");
}
printf("\n");*/
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家操作
void PlayMove(char board[ROW][COL], int row, int col)
{
printf("玩家下棋\n");
printf("请输入坐标>:");
while (1)
{
int x, y;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("棋盘已被占用,请重新输入>");
}
}
else
{
printf("坐标非法,请重新输入>");
}
}
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
while (1)
{
int x, y;
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断输赢
char 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 'C';
}
}
return 'Q';
}
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0, j = 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 (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j]== board[2][j]&& board[0][j] != ' ')
return board[0][j];
}
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];
return IsFull(board, row, col);
}