三子棋小游戏c语言实现

2024-04-30 16:58
文章标签 语言 实现 三子 小游戏

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

# define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<time.h>

 #define max_row 3
 #define max_col 3
//初始化
void init(char board[max_row][max_col]) {
    for (int row = 0; row < max_row; row++) {
        for (int col = 0; col < max_col; col++) {
            board[row][col] = ' ';
        }
    }
    //设置随机种子
    srand((unsigned int)time(0));
}
//打印棋盘
void printBoard(char board[max_row][max_col]) {
    system("cls");
    for (int row = 0; row < max_row; row++) {
        printf("+---+---+---+\n");
        for (int col = 0; col < max_col; col++) {
            printf("| %c ", board[row][col]);
        }
        printf("|");
        printf("\n");
    }
    printf("+---+---+---+\n");
}
//玩家移动
void playerMove(char board[max_row][max_col]) {
    printf("请玩家落子\n");
    while (1) {
        printf("请输入落子的位置(row,col)");
        int row = 0, col = 0;
        scanf("%d %d", &row, &col);
        if (row < 0 || row >= max_row || col < 0 || col >= max_col) {
            printf("输入有误,请重新输入\n");
            continue;
        }
        if (board[row][col] != ' ') {
            printf("当前位置已经有子了,无法落子\n");
            continue;
        }
        board[row][col] = 'x';
        break;
    }
}

void computerMove(char board[max_row][max_col]) {
    //轮到电脑落子
    while (1) {
        if (isFull(board)) {
            break;
        }
        int row = rand() % max_row;
        int col = rand() % max_col;
        if (board[row][col] != ' ') {
            //说明位置已经有子了
            continue;
        }
        board[row][col] = 'o';
        printBoard(board);
        break;
    }
}

int isFull(char board[max_row][max_col]) {
    //棋盘里面有空格就是没满,没空格就是满了
    for (int row = 0; row < max_row; row++) {
        for (int col = 0; col < max_col; col++) {
            if (board[row][col] == ' ') {
                return 0;
            }
        }
    }
    return 1;
}
char checkWinner(char board[max_row][max_col]) {
    //1.检测所有行
    for (int row = 0; row < max_row; row++) {
        if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][1] == board[row][2]) {
            return board[row][0];
        }
    }
    //2.检查所有列
    for (int col = 0; col < max_col; col++) {
        if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[1][col] == board[2][col]) {
            return board[0][col];
        }
    }
    //3.检查所有对角线
    if (board[0][0] != ' ' && board[0][0] == board[1][1]
        && board[0][0] == board[2][2]
        ) {
        return board[0][0];
    }
    if (board[2][0] != ' ' && board[2][0] == board[1][1]
        && board[2][0] == board[0][2]
        ) {
        return board[2][0];
    }
    //4.检查是否和棋
    if (isFull(board)) {
        return 'q';
    }
    return ' ';
}
int main() {
    //1.初始化棋盘
    char board[max_row][max_col] = { 0 };
    init(board);
    char winner = ' ';
    // 2.打印棋盘
    printBoard(board);
    while (1) {
        //玩家落子
        playerMove(board);
        //电脑落子
        computerMove(board);
        //判定胜负 玩家胜返回x,电脑胜返回'o',和棋返回'q',胜负未分返回' '
        winner = checkWinner(board);
        if (winner == 'x') {
            printf("玩家获胜");
        }
         if (winner == 'o') {
            printf("电脑获胜");
        }
         if (winner == 'q') {
             printf("和棋");
         }
         if (winner != ' ') {
             //胜负已分 结束游戏
             break;
         }
    }
    
    return 0;
}

基本的功能是ok的,但是还有一些地方有些小问题,就是判断结束的时候

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



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

相关文章

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重