C语言实现三子棋实例代码

C语言实现三子棋实例代码攻略

一、实现思路

  1. 三子棋的棋盘大小为3x3,可以定义一个3x3的二维数组表示;
  2. 玩家和电脑轮流下棋,可以用一个变量记录当前下棋方,如0代表玩家,1代表电脑;
  3. 玩家可以通过输入坐标来下棋,电脑可以随机生成坐标;
  4. 每下一步棋都需要检查胜负情况,即检查当前是否有连续的3个棋子相连。

二、实现代码

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

// 定义棋盘大小
#define ROW 3
#define COL 3

// 定义棋子类型
#define PLAYER 'X'
#define COMPUTER 'O'
#define EMPTY ' '

// 打印棋盘
void print_board(char board[ROW][COL]) {
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            printf("%c |", board[i][j]);
        }
        printf("\n----------\n");
    }
}

// 判断当前位置是否可下棋
int is_valid_move(char board[ROW][COL], int row, int col) {
    if (row < 0 || row >= ROW || col < 0 || col >= COL) {
        return 0;
    } else if (board[row][col] != EMPTY) {
        return 0;
    } else {
        return 1;
    }
}

// 判断是否有连续的3个相同棋子
int check_winner(char board[ROW][COL], char player) {
    // 判断行
    for (int i = 0; i < ROW; i++) {
        if (board[i][0] == player && board[i][1] == player && board[i][2] == player) {
            return 1;
        }
    }
    // 判断列
    for (int j = 0; j < COL; j++) {
        if (board[0][j] == player && board[1][j] == player && board[2][j] == player) {
            return 1;
        }
    }
    // 判断对角线
    if (board[0][0] == player && board[1][1] == player && board[2][2] == player) {
        return 1;
    } else if (board[0][2] == player && board[1][1] == player && board[2][0] == player) {
        return 1;
    }
    return 0;
}

// 玩家下棋
void player_move(char board[ROW][COL]) {
    int row, col;
    printf("请输入下棋的坐标(以逗号分隔):");
    scanf("%d,%d", &row, &col);
    if (is_valid_move(board, row, col)) {
        board[row][col] = PLAYER;
    } else {
        printf("该位置不可下棋,请重新输入\n");
        player_move(board);
    }
}

// 电脑下棋
void computer_move(char board[ROW][COL]) {
    int row, col;
    srand(time(NULL));
    do {
        row = rand() % ROW;
        col = rand() % COL;
    } while (!is_valid_move(board, row, col));
    printf("电脑下棋坐标为:%d,%d\n", row, col);
    board[row][col] = COMPUTER;
}

// 判断是否棋盘已满
int is_full(char board[ROW][COL]) {
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            if (board[i][j] == EMPTY) {
                return 0;
            }
        }
    }
    return 1;
}

// 游戏主循环
void game_loop(char board[ROW][COL]) {
    int turn = 0;
    while (1) {
        print_board(board);
        if (turn % 2 == 0) {
            player_move(board);
            if (check_winner(board, PLAYER)) {
                print_board(board);
                printf("恭喜你获得胜利!\n");
                break;
            }
        } else {
            computer_move(board);
            if (check_winner(board, COMPUTER)) {
                print_board(board);
                printf("很遗憾,电脑获胜!\n");
                break;
            }
        }
        turn++;
        if (is_full(board)) {
            print_board(board);
            printf("平局!\n");
            break;
        }
    }
}

// 主函数
int main() {
    char board[ROW][COL] = {
        {EMPTY, EMPTY, EMPTY},
        {EMPTY, EMPTY, EMPTY},
        {EMPTY, EMPTY, EMPTY},
    };
    game_loop(board);
    return 0;
}

三、示例说明

示例1:玩家输入非法坐标

请输入下棋的坐标(以逗号分隔):3,0
该位置不可下棋,请重新输入
请输入下棋的坐标(以逗号分隔):

示例2:玩家获胜

  X |   |  
----------
    | X | O
----------
    | O | X
----------
  X |   |  
----------
    | X | O
----------
    | O | X
----------
恭喜你获得胜利!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现三子棋实例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言简单实现门禁系统

    C语言简单实现门禁系统攻略 简介 门禁系统是现代化安全管理的一个必要设备,在学校、企业、小区等有着广泛的应用。本教程将介绍使用C语言实现一个简单的门禁系统的过程。 硬件设备 首先需要准备一些硬件设备: 1个Arduino主板 1个LED 1个继电器 1个磁铁传感器 1个蜂鸣器(可选) 软件准备 除了硬件设备,还需要软件支持: Arduino IDE软件(用于…

    C 2023年5月22日
    00
  • 基于c++中的默认拷贝函数的使用详解

    基于C++中的默认拷贝函数的使用详解 在C++中,当我们定义了一个类,并对其进行实例化时,如果没有手动定义拷贝构造函数或拷贝赋值运算符,那么编译器会自动为该类提供默认的拷贝构造函数和拷贝赋值运算符。本文将详细讲解这两种默认拷贝函数的使用。 默认拷贝函数的定义 默认拷贝函数的定义如下: class MyClass { public: MyClass(const…

    C 2023年5月22日
    00
  • C语言教程之数组详解

    C语言教程之数组详解 数组概述 数组是一组相同类型数据的集合,它们按照一定的先后顺序排列,每个数组元素可以通过一个下标访问。 在C语言中,数组元素是按照线性顺序存储在内存中的,数组下标从0开始,可以是整数、字符、枚举类型。 声明数组 在C语言中,可以使用以下方式来声明数组: type arrayName[arraySize]; 其中type为数组元素类型,a…

    C 2023年5月23日
    00
  • C语言实现电子时钟程序

    首先,我们需要了解一下电子时钟的实现原理。电子时钟的核心就是使用计数器来计时,然后将时间显示出来。这里我们将时分秒分别作为计数器的计数值,在每次计数器加1的同时更新时分秒的显示值。那么,下面就是实现电子时钟程序的详细步骤: 步骤一:初始化 首先,需要进行一些初始化工作,比如设置时钟起始时间、设置计数器的计数范围等等。在C语言中,我们可以使用结构体来定义时钟的…

    C 2023年5月23日
    00
  • C语言MFC导出dll回调函数方法详解

    C语言MFC导出dll回调函数方法详解 在C语言MFC程序开发中,可能会需要用到回调函数,用于向调用方传递处理结果。而MFC导出dll的方式,可以让我们在其他程序中使用该函数。下面是导出dll回调函数的详细攻略。 步骤1:定义回调函数 首先需要定义回调函数,在函数名前加上__declspec(dllexport)关键字。以下是一个示例: __declspec…

    C 2023年5月23日
    00
  • C 头文件

    下面详细讲解一下 C 头文件的完整使用攻略。 什么是 C 头文件 在 C 语言中,头文件是一种特殊的文件,它包含了一些函数和变量的声明,可以被其他源文件引用。头文件的作用就是让代码更好维护和组织,可以将程序中的一些常用的函数和变量声明都放在头文件中,便于管理和使用。 如何使用 C 头文件 C 头文件通常包含两个部分:宏定义和函数声明。其中,宏定义是用来定义一…

    C 2023年5月10日
    00
  • C语言强制类型转换规则实例详解

    C语言强制类型转换规则实例详解 什么是强制类型转换? 在C语言中,当我们需要将不同类型的数据进行运算或者赋值的时候,需要进行类型转换。C语言中有两种类型转换,一种是自动类型转换,另一种是强制类型转换。强制类型转换可以将一种类型的数据强制转换成另一种类型的数据,以便实现我们需要的功能。在C语言中,强制类型转换使用强制转换运算符进行实现。强制转换运算符的语法格式…

    C 2023年5月23日
    00
  • C语言实现循环队列基本操作

    C语言实现循环队列基本操作 循环队列是一种常用的队列数据结构,其基本结构与普通队列类似,只不过队列的尾指针位置是循环的。即当尾指针指向队列的最后一个位置时,再有新的元素进入队列时,尾指针会回到队列头的位置。 在C语言中,我们可以通过使用数组与指针的结合,来实现循环队列的基本操作。下面我们就来详细讲解一下C语言实现循环队列的完整攻略。 定义循环队列 我们首先需…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部