首先我们先创建一个头文件来专门存放我们需要的库函数,以及声明我们需要自己定义的函数,在此文章中头文件名为outside.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.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 ComptuerMove(char board[ROW][COL], int row, int col);//电脑下棋
char Win(char board[ROW][COL], int row, int col);//判断胜利条件
在创建一个专门存放函数的源文件,此文章为outside.c
首先我们需要一个函数来初始化棋盘,为棋盘清空
void InitBoard(char board[ROW][COL], int row, int col) {
int i,j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
board[i][j] = ' ';
}
显示棋盘
void DisplayBoard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//打印棋子
printf("|");//打印|
}
printf("\n");//换行
for (int x = 0; x < row; x++)//打印---
{
if (i < row - 1)
printf("--- ");
}
printf("\n");//换行
}
printf("\n\n\n");
}
玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col) {
int x, y;
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 ComptuerMove(char board[ROW][COL], int row, int col) {
int x, y;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '@';
printf("%d,%d\n", x, y);
break;
}
}
}
判断是否胜利条件
char Win(char board[ROW][COL], int row, int col) {
int i = 0;
//竖列对比
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') {
return board[1][i];
break;
}
}
//横列对比
for (i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') {
return board[i][0];
break;
}
}
//对角线对比
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 (Full(board,ROW,COL)==1) {
return 'd';
}
return 'c';
}
如果返回d,这证明此句为平局,调用函数Full()
int Full(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
我们还有一个主函数main.c
#include"outside.h"
void menu() {
printf("*********************************\n");
printf("*********************************\n");
printf("*****1.play 2.exit*****\n");
printf("*********************************\n");
printf("*********************************\n");
}
void game() {
char board[ROW][COL] = { 0 };
char w;
InitBoard(board,ROW,COL);//初始化数组
printf("游戏开始!\n");
DisplayBoard(board,ROW, COL);//显示棋盘
while (1)
{
PlayerMove(board, ROW, COL);//玩家
DisplayBoard(board, ROW, COL);//显示棋盘
w=Win(board, ROW, COL);
if (w!='c') {
break;
}
ComptuerMove(board, ROW, COL);//电脑
DisplayBoard(board, ROW, COL);//显示棋盘
w=Win(board, ROW, COL);
if (w!='c') {
break;
}
}
if (w == '*')
printf("恭喜你赢了!\n");
else if (w == '@')
printf("很遗憾失败了.\n");
else
printf("平局\n");
}
void test() {
int input;
srand((unsigned int)time(NULL));//随机值
do {
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
{game();
break; }
case 2:
{printf("退出\n");
break; }
default:
{printf("输入错误,请重新输入\n");
break; }
}
} while (input);
}
int main() {
test();
return 0;
}
此时我们理一下逻辑,outside.h专门用来存储库函数,及自定义函数的声明,outside.c用来实现函数的书写,最后使用main函数来调用。
最后我们来运行一下我们的三子棋吧
hhh,我们居然输了,各位自己试一试吧.
三子棋源码https://download.csdn.net/download/weixin_44681167/22359083?spm=1001.2014.3001.5501