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.首先,我们需要设计游戏界面。游戏界面应该包括一个文本框、一个文本输入框和一个“开始”按钮。用户需要在文本输入框中输入键盘上的单词,按下…

    C 2023年5月23日
    00
  • 用C语言实现2048游戏

    用C语言实现2048游戏攻略 一、游戏规则分析 2048游戏是一款数字拼图游戏,玩家通过交换数字方块来使它们相加成为2048。游戏规则如下: 游戏以一个4×4的棋盘为基础。 初始状态有两个数已知,值为2或4。 玩家每次可以选择上、下、左、右其中一方向进行滑动,若滑动时有相同数字的方块相遇,则它们将相加并合并成一个数。 每次滑动后,系统会在空白处生成一个数字,…

    C 2023年5月23日
    00
  • UltraEdit技巧总结

    UltraEdit 技巧总结攻略 简介 UltraEdit 是一款功能强大的文本编辑器,被广泛应用于程序员、系统管理员、DBA 等专业人群的日常工作中。UltraEdit 不仅仅是一个文本编辑器,还拥有丰富的编码、调试、FTP/SFTP 等功能。本文旨在总结 UltraEdit 的常见技巧,帮助使用者提高使用效率和体验。 使用技巧 以下是使用 UltraEd…

    C 2023年5月22日
    00
  • C语言函数返回指针

    C语言中的函数可以返回不同的数据类型,包括指针类型。函数返回指针类型可以让我们更加灵活地操作内存,提高代码的重用性和可维护性。 在函数定义的时候,我们需要用指针类型作为返回值类型,并在函数体中返回指向目标数据的指针。以下是函数返回指针的基本语法: int* myFunction() { int* ptr = malloc(sizeof(int)); *ptr…

    C 2023年5月9日
    00
  • C/C++ Qt 数据库与TableView实现多组件联动

    下面我将为你详细讲解如何使用 C/C++ Qt 实现数据库和 TableView 的联动。 准备工作 在开始之前,我们需要先准备好以下工具和环境: Qt:这是一个跨平台的 C++ 应用程序开发框架,我们将使用 Qt 来开发我们的程序。 MySQL:一个关系型数据库管理系统,我们将使用它来存储和管理我们的数据。 Qt Creator:这是一个供 Qt 开发者使…

    C 2023年5月22日
    00
  • C语言实现数独游戏

    C语言实现数独游戏攻略 介绍 数独是一种逻辑填数游戏,通过在九宫格中填入数字1-9,使得每行、每列、每个九宫格内的数字都没有重复。C语言可以实现数独游戏,并对玩家的答案进行检测。 步骤 1. 定义九宫格 首先需要定义一个二维数组来表示数独的九宫格。在C语言中,可以使用如下代码定义一个9×9的九宫格: int grid[9][9]; 2. 初始化九宫格 在定义…

    C 2023年5月23日
    00
  • C++11的future和promise、parkged_task使用

    C++11的future和promise,以及packaged_task的使用是实现多线程和异步操作的重要方式之一。接下来我将详细讲解这三种机制的用法和特点。 std::future std::future是C++11提供的一个用于异步操作的机制,它允许我们在一个线程中启动一个异步操作,在另一个线程中等待该操作完成,并从操作中获取结果。 下面是一个简单的例子…

    C 2023年5月23日
    00
  • C语言 指针综合解析

    C语言指针综合解析攻略 什么是指针 指针是C语言中一个重要的概念,它可以让我们间接地访问和修改内存中的数据。 指针实际上是一个地址,这个地址是指向内存中一个特定的位置,它可以让我们对该位置的数据进行各种操作。 如何定义指针 在C语言中定义指针需要使用星号符号 *,这个符号在定义指针时放在变量名前面,例如: int *p; 上面的代码定义了一个指向 int 类…

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