三子棋(C语言实现)

2024-02-12 16:48
文章标签 语言 实现 三子

本文主要是介绍三子棋(C语言实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 实现思路
    • 1、存储棋盘
    • 2、初始化
    • 3、用户落子
    • 4、判断检查
    • 5、判断本局游戏的状态
    • 6、电脑落子
    • 7、判断检查
    • 8、判断本局游戏的状态
  • 具体完整代码如下

三子棋实现
三子棋是一个很古老的民间传统游戏,玩起来也非常便捷。三子棋也叫做OOXX棋,井字棋等,用“井”字分出3×3的格子,双方轮流下棋子(可以用O或者X来区别),只要将自己的棋子连成直线就赢了。

实现思路

注:以下每一个步骤或多或少用到了宏定义,在此做一说明

#define ROW 3
#define COL 3
#define INIT ' '
#define WHITE 'X'
#define BLACK 'O'
#define NEXT 'D'
#define DRAW 0

1、存储棋盘

用二维数组char board[3][3] 实现

char board[ROW][COL];

2、初始化

从用户角度来看,游戏开始时展现的棋盘应该为空,故而用字符空格‘ ’对其进行初始化操作

static void Init(char board[][COL],int row ,int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = INIT;}}
}

3、用户落子

初始化完成后用户先进行落子,落子的具体操作是用户输入对应的坐标,系统为其对应位置写入X代表用户落子成功。

4、判断检查

检查用户落子位置是否合法,若合法进行下一步操作做,若不合法返回上一步

用户层面判断落子是否合法有两方面:
第一:判断用户输入的坐标是否在定义的二维数组内
第二:判断用户输入的坐标所对应的位置能不能放入对应的字符(判断对应位置是否为空格,若是,就可以落子,否则不行)

static void PlayerMove(char board[][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("Please Enter Your  Position<x,y>#\n");scanf("%d %d", &x, &y);if (x<1 || x>3 || y<1 || y>3){printf("Enter Error! Try Again\n");continue;}if (board[x - 1][y - 1] == INIT){board[x - 1][y - 1] = WHITE;break;}else{printf("This position is not empty,please enter again!\n");}}
}

5、判断本局游戏的状态

一局游戏有四种状态,赢、输、平局、继续
通过对棋盘的每一行每一列以及每一条对角线判断,进而得到本局游戏的状态

static char IsEnd(char board[][COL], int row, int col)
{//判断行for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && \board[i][1] == board[i][2] && \board[i][0] != INIT){return board[i][0];}}//判断列for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && \board[1][j] == board[2][j] && \board[0][j] != INIT){return board[0][j];}}//判断对角线if (board[0][0] == board[1][1] && \board[1][1] == board[2][2] && \board[1][1] != INIT){return board[1][1];}if (board[0][2] == board[1][1] && \board[1][1] == board[2][0] && \board[1][1] != INIT){return board[1][1];}//若以上条件均不满足,说明该局游戏应继续return NEXT;
}

6、电脑落子

电脑落子是由系统产生随机坐标值并在对应的二维数组中填入相应的字符O

7、判断检查

检查用户落子位置是否合法,若合法进行下一步操作做,若不合法返回上一步
电脑落子判断
随机数通过模运算之后得到的坐标值一定在二维数组内,所以只需要判断坐标对应的二维数组中的位置是否为空格即可

static void ComputerMove(char board[][COL], int row, int col)
{while (1){int x = rand() % ROW;int y = rand() % COL;if (board[x][y] == INIT){board[x][y] = BLACK;break;}}	
}

8、判断本局游戏的状态

一局游戏有四种状态,赢、输、平局、继续
通过对棋盘的每一行每一列以及每一条对角线判断,进而得到本局游戏的状态(此次操作与步骤5一致)

具体完整代码如下

采用多文件模式
game.h文件

# pragma once
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>#define ROW 3
#define COL 3
#define INIT ' '
#define WHITE 'X'
#define BLACK 'O'
#define NEXT 'D'
#define DRAW 0extern void Game();
extern void menu();

game.c文件

#include "game.h"void Menu()
{printf("+----------------------+\n");printf("|1.play          2.exit|\n");printf("+----------------------+\n");
}
//初始化棋盘
static void Init(char board[][COL],int row ,int col)
{for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){board[i][j] = INIT;}}
}
static void Showbard(char board[][COL], int row, int col)
{system("cls");printf(" ");for (int i = 0; i <col; i++){printf("%4d",i+1);}printf("\n----------------\n");for (int i = 0; i < row; i++){printf("%-2d", i+1);for (int j = 0; j < col; j++){printf("| %c ", board[i][j]);}printf("\n----------------\n");}
}
static void PlayerMove(char board[][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("Please Enter Your  Position<x,y>#\n");scanf("%d %d", &x, &y);if (x<1 || x>3 || y<1 || y>3){printf("Enter Error! Try Again\n");continue;}if (board[x - 1][y - 1] == INIT){board[x - 1][y - 1] = WHITE;break;}else{printf("This position is not empty,please enter again!\n");}}
}static char IsEnd(char board[][COL], int row, int col)
{//判断行for (int i = 0; i < row; i++){if (board[i][0] == board[i][1] && \board[i][1] == board[i][2] && \board[i][0] != INIT){return board[i][0];}}//判断列for (int j = 0; j < col; j++){if (board[0][j] == board[1][j] && \board[1][j] == board[2][j] && \board[0][j] != INIT){return board[0][j];}}//判断对角线if (board[0][0] == board[1][1] && \board[1][1] == board[2][2] && \board[1][1] != INIT){return board[1][1];}if (board[0][2] == board[1][1] && \board[1][1] == board[2][0] && \board[1][1] != INIT){return board[1][1];}return NEXT;
}static void ComputerMove(char board[][COL], int row, int col)
{while (1){int x = rand() % ROW;int y = rand() % COL;if (board[x][y] == INIT){board[x][y] = BLACK;break;}}	
}void Game()
{srand((unsigned long)time(NULL));char board[ROW][COL];Init(board, ROW, COL);char result = 0;while (1){Showbard(board, ROW, COL);PlayerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}Showbard(board, ROW, COL);ComputerMove(board, ROW, COL);result = IsEnd(board, ROW, COL);if (result != NEXT){break;}}Showbard(board, ROW, COL);switch (result){case WHITE:printf("You Win\n");break;case BLACK:printf("You lose\n");break;case DRAW:printf("you == computer\n");break;default:printf("Bug!\n");break;}
}

main.c文件

#include "game.h"int main()
{int quit = 0;while (!quit){Menu();int select = 0;printf("Please Enter Your Choose#");scanf("%d", &select);switch (select){case 1:Game();break;case 0:printf("ByeBye!\n");quit = 1;break;default:printf("Bug!\n");break;}}system("pause");return 0;
}

最后贴张运行截图
这只是玩到最后的结果,读者有兴趣可以直接在自己的环境下运行体验一下
在这里插入图片描述

这篇关于三子棋(C语言实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703084

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求