提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天我来为大家分享如何用二维数组来实现三子棋的通用版(棋盘的大小任意)
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码的实现
这里我们用多文件的方式进行处理
这里我们
用game.c文件来实现函数功能的实现
用test.c文件来管理游戏界面
用game.h文件来存放函数的申明,头文件的包含,宏的定义
game.c文件
#include "game.h"
void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}
void game()
{
//创建棋盘
char board[ROW][COL] = { 0 };
//记录落子的坐标,第一个元素是行,第二个元素是列
int location[2] = { 0 };
//记录游戏状态
char ret = 0;
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
PrintBoard(board,ROW,COL);
while (1)
{
//玩家落子
PlayMove(board, location, ROW, COL);
//打印棋盘
PrintBoard(board, ROW, COL);
//判断输赢
ret = IsWin(board, location,ROW,COL);
if (ret != 'C')
break;
//电脑随机落子
ComputerMove(board, location, ROW, COL);
//打印棋盘
PrintBoard(board, ROW, COL);
//判断输赢
ret = IsWin(board, location, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
//打印列
for (i = 2; i < row-2; i++)
{
int j = 0;
//打印行
for (j = 2; j < col-2; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 3)
printf("|");
}
printf("\n");
//打印行
if(i<row-3)
for (j = 2; j < col-2; j++)
{
printf("---");
if (j < col - 3)
printf("|");
}
printf("\n");
}
}
//玩家落子
void PlayMove(char board[ROW][COL], int location[], int row, int col)
{
//行
int i = 0;
//列
int j = 0;
while (1)
{
printf("请输入坐标,以空格分隔:>");
scanf("%d %d", &i, &j);
if (i >= 1 && i <= ROW_SHOW && j >= 1 && j <= COL_SHOW)
{
if (board[i+1][j+1] == ' ')
{
location[0] = i+1;
location[1] = j+1;
board[i+1][j+1] = '*';
break;
}
else
printf("坐标以被占用,请从新输入\n");
}
else
{
printf("输入错误,请从新输入\n");
}
}
}
//电脑随机落子
void ComputerMove(char board[ROW][COL], int location[], int row, int col)
{
printf("电脑落子\n");
while (1)
{
//行
int i = rand() % ROW_SHOW + 2;
//列
int j = rand() % COL_SHOW + 2;
if (board[i][j] == ' ')
{
location[0] = i;
location[1] = j;
board[i][j] = '#';
break;
}
}
}
//判断
char IsWin(char board[ROW][COL], int location[],int row,int col)
{
//行
int i = location[0];
//列
int j = location[1];
//计数器
int count = 0;
//行
int n = 0;
//列
int m = 0;
//行
count = 0;
for (n = i - 2; n <= i + 2; n++)
{
if (board[i][j] == board[n][j])
count++;
}
if (count == 3)
{
return board[i][j];
}
//列
count = 0;
for (m = j - 2; m <= j + 2; m++)
{
if (board[i][j] == board[i][m])
count++;
}
if (count == 3)
{
return board[i][j];
}
//正对角线
count = 0;
for (n = i - 2, m = j - 2; n <= i + 2; n++, m++)
{
if (board[i][j] == board[n][m])
count++;
}
if (count == 3)
{
return board[i][j];
}
//逆对角线
count = 0;
for (n = i - 2, m = j + 2; n <= i + 2; n++, m--)
{
if (board[i][j] == board[n][m])
count++;
}
if (count == 3)
{
return board[i][j];
}
//平局
if (Judge(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
//判断棋盘是否满了
int Judge(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 2; i < row - 2; i++)
{
int j = 0;
for (j = 2; j < col - 2; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
test.c文件
#include "game.h"
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入选项:>");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出游戏\n");
break;
case PLAY:
game();
break;
default:
printf("输入错误,请从新输入\n");
break;
}
} while (input);
return 0;
}
game.h文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW_SHOW 3//显示大小
#define COL_SHOW 3//显示大小
#define ROW ROW_SHOW+4//实际大小
#define COL ROW_SHOW+4//实际大小
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum
{
EXIT,
PLAY
};
//菜单
void menu(void);
//三子棋
void game(void);
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col);
//玩家落子
void PlayMove(char board[ROW][COL], int location[], int row, int col);
//电脑随机落子
void ComputerMove(char board[ROW][COL], int location[], int row, int col);
//判断输赢
//规定‘*’代表玩家赢
//规定‘#’代表电脑赢
//规定‘Q’代表平局
//规定‘C’代表继续
//判断
char IsWin(char board[ROW][COL], int location[],int row,int col);
//判断棋盘是否满了
int Judge(char board[ROW][COL], int row, int col);
二、思路讲解
假设我们先要完成的是33大小的三子棋游戏
在此我们先创建棋盘大小的为77,而我们只显示3*3的大小。然后我们在记录每次落子的坐标。
为什么要这么做?
这就有关于判断部分了。
在这里我的判断部分采用了计数的方法
如下:
(我们用0代表空格)
现在要判断刚落子坐标是(2,2)的点(用户眼中是(1,1)的点)时,游戏的状态。
现在我们从(2,2)向四周扩大2层
我们先进行行的判断
从(2,0),(2,1),(2,2),(2,3),(2,4)这五个点找有几个黑方框中的字符,如果有3个
黑方框中的字符,则代表是黑方框中的字符赢,如果小于三个则代表该字符没赢。
进行列的判断
从(0,2),(1,2),(2,2),(3,2),(4,2)这五个点找有几个黑方框中的字符,如果有3个
黑方框中的字符,则代表是黑方框中的字符赢,如果小于三个则代表该字符没赢。
进行正对角线的判断
从(0,0),(1,1),(2,2),(3,3),(4,4),这五个点找有几个黑方框中的字符,如果有3个
黑方框中的字符,则代表是黑方框中的字符赢,如果小于三个则代表该字符没赢。
进行逆对角线的判断
从(0,4),(1,3),(2,2),(3,1),(4,0)这五个点找有几个黑方框中的字符,如果有3个
黑方框中的字符,则代表是黑方框中的字符赢,如果小于三个则代表该字符没赢。
那如果是55大小的游戏。
我们只要创建实际大小是99的棋盘,显示5*5的就可以。
在采取一样的判断方法就可以。
三、结果
77大小
55大小
总结
以上就是我对于三子棋的实现方法