简易的三子棋!
文章目录
前言
一、三字棋是什么?
三字棋是一个基于二维数组为模板制作的简单vs游戏,在九宫格上下棋和电脑获得胜利!
二、具体步骤
1.引入头文件
1.各个函数的定义
代码如下(示例):
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 3
#define COLS 3
void InitBoard(char Board[ROWS][COLS], int rows, int cols);//初始化棋盘
void DisplayBoard(char Board[ROWS][COLS], int rows, int cols);//显示棋盘
void PlayMove(char Board[ROWS][COLS], int rows, int cols);//玩家移动
void ComputerMove(char Board[ROWS][COLS], int rows, int cols);//电脑移动
char CheckWin(char Board[ROWS][COLS], int rows, int cols);//判断输赢
2.引入声明文件实现各个功能
1.初始化棋盘!
首先初始化创建一个以ROWS为行,COLS为列的二维数组作为棋盘,再把棋盘初始化。
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char Board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
Board[i][j] = ' ';
}
}
}
2.显示棋盘!
2.显示棋盘:打印行和列,棋盘如图3行3列,定义两个for循环,用 | 和- - -来分隔三个数据。
void DisplayBoard(char Board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
printf(" %c ", Board[i][j]);
if (j < cols - 1)
{
printf("|");
}
}
printf("\n");
if (i < rows -1)
{
for (j = 0; j < cols; j++)
{
printf("---");
if (j < cols - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
3.玩家移动!
玩家在棋盘上输入一个坐标判断坐标合法性,玩家移动一步符号设置为*。
void PlayMove(char Board[ROWS][COLS], int rows, int cols)
{
int x = 0;
int y = 0;
printf("玩家走!\n");
while (1)
{
printf("请输入一个坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= rows && y>=1 && y <= cols)
{
if (Board[x-1][y-1] != ' ')
{
printf("坐标已被输入,请重新输入!\n");
}
else
{
Board[x - 1][y - 1] = '*';
break;
}
}
else
{
printf("输入坐标不合法,请重新输入!\n");
}
}
}
4.电脑移动!
电脑根据时间戳随机生成的行和列的坐标移动,电脑走一步则那一步设置为符号#。
void ComputerMove(char Board[ROWS][COLS], int rows, int cols)
{
printf("电脑走:\n");
while (1)
{
int x = rand() % rows;
int y = rand() % cols;
if (Board[x][y] == ' ')
{
Board[x][y] = '#';
break;
}
}
}
5.判断输赢!
用横三行竖三行和两边对角线来判断输赢,只要三个符号一样即成功!
char CheckWin(char Board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; 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 < cols; 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[0][0]!=' ')
{
return Board[0][0];
}
if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[2][0]!=' ')
{
return Board[0][2];
}
if (IsFull(Board,rows,cols) == 1)
{
return 'Q'; //主程序平局设置为符号Q
}
return 'C';//主程序玩家电脑未分胜负设置为符号C
}
6.判断棋盘是否平局!
如果棋盘内没有空位置并且玩家电脑都没有赢则平局。
int IsFull(char Board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j<cols; j++)
{
if (Board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
3.引入主程序文件
1.main函数
在main函数中设置一个do…while循环来决定游戏是否一直玩。
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//打印游戏界面
printf("请输入你的选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//进行游戏函数
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("你选择的有错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
2.menu函数
menu函数负责打印游戏界面如图:

void menu()
{
printf("**************************\n");
printf("******** 1.play ****\n");
printf("******** 0.exit ****\n");
printf("**************************\n");
}
3.game函数
定义一个二维数组来当棋盘,在用一个while循环包含各种函数的使用,设置符号*玩家赢,符号#电脑赢,符号Q则平局,符号C则未分胜负。
void game()
{
char ret = 0;
char Board[ROWS][COLS] = { 0 };
InitBoard(Board, ROWS, COLS);
DisplayBoard(Board, ROWS, COLS);
while (1)
{
PlayMove(Board, ROWS, COLS);
ret = CheckWin(Board, ROWS, COLS);
if (ret != 'C')
{
break;
}
DisplayBoard(Board, ROWS, COLS);
ComputerMove(Board, ROWS, COLS);
ret = CheckWin(Board, ROWS, COLS);
if (ret != "C")
{
break;
}
DisplayBoard(Board, ROWS, COLS);
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret ,== '#')
{
printf("电脑赢!\n");
}
else if (ret == 'Q')
{
printf("平局!\n");
}
DisplayBoard(Board, ROWS, COLS);
}
结果
如图所示:

以上就是今天要完成的内容,一个简易的三字棋程序,本文仅仅简单介绍了二维数组的使用和各个函数的的使用,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。

5893





