三子棋(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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、