C语言实现简单三子棋程序

C语言实现简单三子棋程序的完整攻略包括以下步骤:

  1. 定义游戏规则和棋盘

首先需要定义游戏规则,规定每个玩家的棋子形状和放置的位置等信息。同时需要定义一个3x3的棋盘数组,用于记录每个位置上的棋子情况。

#include <stdio.h>

#define ROW 3
#define COL 3

// 定义棋盘
char board[ROW][COL] = {
    {' ', ' ', ' '},
    {' ', ' ', ' '},
    {' ', ' ', ' '}
};

void print_board()
{
    printf("  1   2   3\n");
    printf("1 %c | %c | %c \n", board[0][0], board[0][1], board[0][2]);
    printf(" ---|---|---\n");
    printf("2 %c | %c | %c \n", board[1][0], board[1][1], board[1][2]);
    printf(" ---|---|---\n");
    printf("3 %c | %c | %c \n", board[2][0], board[2][1], board[2][2]);
}
  1. 实现玩家交替落子

按照游戏规则和棋盘的定义,玩家交替进行游戏。需要实现一个函数,根据玩家输入的行列数目,判断该位置是否可以下子,如果可以,就在对应位置上放置该玩家的棋子,并更新棋盘。同时需要判断游戏是否结束,如果棋盘已经填满或者某个玩家已经连成三个棋子,就宣告游戏结束。

int is_full()
{
    int i, j;
    for (i = 0; i < ROW; i++) {
        for (j = 0; j < COL; j++) {
            if (board[i][j] == ' ')
                return 0;
        }
    }
    return 1;
}

int check_win(char c)
{
    int i;
    for (i = 0; i < ROW; i++) {
        if (board[i][0] == c && board[i][1] == c && board[i][2] == c)
            return 1;
        if (board[0][i] == c && board[1][i] == c && board[2][i] == c)
            return 1;
    }
    if (board[0][0] == c && board[1][1] == c && board[2][2] == c)
        return 1;
    if (board[0][2] == c && board[1][1] == c && board[2][0] == c)
        return 1;
    return 0;
}

void play_game()
{
    int row, col;
    char c = 'X';

    while (1) {
        printf("Player %c's turn:\n", c);
        printf("Please input row and col (e.g. 1 2):\n");
        scanf("%d %d", &row, &col);

        if (row < 1 || row > 3 || col < 1 || col > 3) {
            printf("Invalid input, please input valid row and col (1~3):\n");
            continue;
        }

        if (board[row-1][col-1] != ' ') {
            printf("The place has already been taken, please input again:\n");
            continue;
        }

        board[row-1][col-1] = c;
        print_board();

        if (check_win(c)) {
            printf("Player %c wins!\n", c);
            break;
        }

        if (is_full()) {
            printf("Game ends in a draw!\n");
            break;
        }

        if (c == 'X')
            c = 'O';
        else
            c = 'X';
    }
}
  1. 进行游戏并输出结果

在主函数中,调用上述三个子函数,依次执行游戏规则、玩家交替落子和胜负判断等操作。

int main(void)
{
    printf("Welcome to the 3x3 Tic-tac-toe game!\n");
    print_board();
    play_game();
    return 0;
}
  1. 示例1

假设玩家1执黑子,玩家2执白子,依次放置棋子如下:

Welcome to the 3x3 Tic-tac-toe game!
  1   2   3
1   |   |   
 ---|---|---
2   |   |   
 ---|---|---
3   |   |   
Player X's turn:
Please input row and col (e.g. 1 2):
1 1
  1   2   3
1 X |   |   
 ---|---|---
2   |   |   
 ---|---|---
3   |   |   
Player O's turn:
Please input row and col (e.g. 1 2):
2 2
  1   2   3
1 X |   |   
 ---|---|---
2   | O |   
 ---|---|---
3   |   |   
Player X's turn:
Please input row and col (e.g. 1 2):
1 2
  1   2   3
1 X | X |   
 ---|---|---
2   | O |   
 ---|---|---
3   |   |   
Player O's turn:
Please input row and col (e.g. 1 2):
3 3
  1   2   3
1 X | X |   
 ---|---|---
2   | O |   
 ---|---|---
3   |   | O 
Player X's turn:
Please input row and col (e.g. 1 2):
2 3
  1   2   3
1 X | X |   
 ---|---|---
2   | O | X 
 ---|---|---
3   |   | O 
Player O's turn:
Please input row and col (e.g. 1 2):
3 1
  1   2   3
1 X | X |   
 ---|---|---
2   | O | X 
 ---|---|---
3 O |   | O 
Player X's turn:
Please input row and col (e.g. 1 2):
2 1
  1   2   3
1 X | X |   
 ---|---|---
2 X | O | X 
 ---|---|---
3 O |   | O 
Player X wins!

输出结果为“Player X wins!”,表示玩家1胜利。

  1. 示例2

假设玩家1执白子,玩家2执黑子,依次放置棋子如下:

Welcome to the 3x3 Tic-tac-toe game!
  1   2   3
1   |   |   
 ---|---|---
2   |   |   
 ---|---|---
3   |   |   
Player O's turn:
Please input row and col (e.g. 1 2):
1 1
  1   2   3
1 O |   |   
 ---|---|---
2   |   |   
 ---|---|---
3   |   |   
Player X's turn:
Please input row and col (e.g. 1 2):
2 2
  1   2   3
1 O |   |   
 ---|---|---
2   | X |   
 ---|---|---
3   |   |   
Player O's turn:
Please input row and col (e.g. 1 2):
1 2
  1   2   3
1 O | O |   
 ---|---|---
2   | X |   
 ---|---|---
3   |   |   
Player X's turn:
Please input row and col (e.g. 1 2):
2 1
  1   2   3
1 O | O |   
 ---|---|---
2 X | X |   
 ---|---|---
3   |   |   
Player O's turn:
Please input row and col (e.g. 1 2):
1 3
  1   2   3
1 O | O | O 
 ---|---|---
2 X | X |   
 ---|---|---
3   |   |   
Player O wins!

输出结果为“Player O wins!”,表示玩家1失败。

以上就是用C语言实现简单三子棋程序的完整攻略。

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

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

相关文章

  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情 为什么需要JSON序列化 在程序开发过程中,我们通常需要将内存中的数据序列化并存储到文件或者网络中进行传输。JSON作为一种轻量级的数据交换格式,因其具有易读性、易存储、易解析等优点,被广泛应用于前后端数据交互、移动设备数据传输等领域。C++社区相关的JSON库也有很多,但有些过于庞大,并不适用于轻量级数据的处理。因…

    C 2023年5月22日
    00
  • C++编译/编辑器对OIer的必要功能(推荐)

    C++编译/编辑器对OIer的必要功能(推荐) C++编译/编辑器是开发者进行编程时必要的工具,对于OIer而言,这些工具是必不可少的辅助设备。以下是编译/编辑器应该具备的必要功能以及一些推荐的C++编译/编辑器。 必要功能 代码高亮 —— 代码高亮可以使得代码更加美观易读,同时也方便调试。有些编辑器支持自定义语法高亮。 代码补全 —— 代码补全可以自动完成…

    C 2023年5月23日
    00
  • C 程序 查找字符的 ASCII 值

    为了查找字符的ASCII值,我们可以使用C程序来完成。下面是使用攻略: 准备工作 在开始使用C语言编写程序之前,需要先安装一些开发环境,包括GCC编译器,以及一个代码编辑器,比如Visual Studio Code等。 步骤如下: 输入需要查找ASCII值的字符 首先,我们需要通过键盘输入需要查找ASCII值的字符,使用C语言中的字符变量来存储输入的字符。比…

    C 2023年5月9日
    00
  • C语言如何在字符数组中插入一个字符

    以下是使用C语言在字符数组中插入一个字符的详细攻略: 1. 按照索引位置分割字符数组 首先,我们需要对原始的字符数组进行分割,将需要插入字符的位置之前和之后的部分分别提取出来。 具体而言,对于一个字符数组 str 和需要插入字符的索引位置 index,我们可以分别使用 strncpy() 函数和指针运算来完成分割: char str[MAX_SIZE] = …

    C 2023年5月23日
    00
  • 解决@Transactional注解事务不回滚不起作用的问题

    解决@Transactional注解事务不回滚不起作用的问题的详细攻略如下: 问题描述 在进行数据库操作时,我们通常会使用@Transactional注解来保证事务的原子性,但在使用过程中可能会出现事务不回滚不起作用的问题,导致数据一旦出现异常就无法恢复。这种情况通常是因为注解失效或者配置不正确导致的。 解决方案 1. 配置文件中开启事务管理器 我们可以在配…

    C 2023年5月23日
    00
  • C语言函数多个返回值方式

    C语言函数多个返回值方式 在C语言中,函数通常只能返回一个返回值。这可能会限制一些操作的实现,特别是在需要返回多个值的情况下。然而,C语言提供了多种方式来解决这个问题。 方式一:结构体 一种实现方式是通过使用结构体返回多个值。结构体通常定义了相​​关字段,而每个字段都可以看作是一个返回值。 typedef struct { int a; char b; fl…

    C 2023年5月23日
    00
  • C++逐步介绍日期类的使用

    C++逐步介绍日期类的使用 前言 日期类是一种常见的数据类型,它在很多应用中经常被用到。在C++中,日期类可以通过自定义类来实现。在本文中,我们将逐步介绍日期类的使用方法。 基本定义 首先,我们定义一个日期类,包含年、月、日三个属性。这个类的基本定义如下: class Date { public: Date(int year, int month, int …

    C 2023年5月23日
    00
  • C++11并发编程关于原子操作atomic的代码示例

    首先,为了保证代码并发时的正确性和可靠性,C++提供了原子操作atomic,它允许程序员指定特定的操作符进行原子操作。本文将详细讲解使用C++11原子操作的代码示例以及相关的攻略。 原子操作atomic 原子操作atomic是一种保证并发编程安全的工具,在多线程的情况下,可以保证一些关键代码块执行过程中的原子操作。原子操作可以避免竞态条件(Race Cond…

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