C语言实现简易井字棋游戏

以下是“C语言实现简易井字棋游戏”的完整攻略:

1. 游戏规则

井字棋是一种双人对弈的游戏,棋盘为3*3格的矩阵。其中一方使用“O”标记,而另一方使用“X”标记。棋子分别放在棋盘的空白处,直到一方成功地在水平、垂直或者对角线上连成三个棋子为止,就获得胜利。

2. 程序架构

本程序的程序架构可以分为如下几个部分:

  1. 定义变量:包括棋盘和游戏状态等变量。
  2. 初始化棋盘:将每个格子都赋值为空。
  3. 游戏主体:在每个回合中,询问当前玩家落子的位置,判断是否胜利,最终返回胜利者的标记。
  4. 输出结果:根据胜利者的标记输出对应的信息。

3. 代码实现

下面以代码实现的方式来详细讲解。

定义变量

首先需要定义需要使用的变量:

char board[3][3]; // 棋盘
char player1 = 'X'; // 玩家1的标记
char player2 = 'O'; // 玩家2的标记
int currentPlayer = 1; // 当前玩家,1表示玩家1,2表示玩家2
int gameState = 0; // 游戏状态,0表示游戏未结束,1表示玩家1胜利,2表示玩家2胜利,3表示平局

初始化棋盘

定义一个函数init_board()来初始化棋盘:

void init_board() {
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            board[i][j] = ' ';
        }
    }
}

游戏主体

定义一个函数play_game()来进行游戏:

int play_game() {
    while(1) {
        // 输出当前棋盘状态
        printf("Current board:\n");
        printf(" %c | %c | %c \n", board[0][0], board[0][1], board[0][2]);
        printf("---|---|---\n");
        printf(" %c | %c | %c \n", board[1][0], board[1][1], board[1][2]);
        printf("---|---|---\n");
        printf(" %c | %c | %c \n", board[2][0], board[2][1], board[2][2]);

        // 询问当前玩家落子的位置
        int row, col;
        printf("Player %d, enter row (1-3): ", currentPlayer);
        scanf("%d", &row);
        printf("Player %d, enter column (1-3): ", currentPlayer);
        scanf("%d", &col);

        // 判断当前位置是否为空
        if(board[row-1][col-1] == ' ') {
            // 棋盘更新为当前玩家的标记
            if(currentPlayer == 1) {
                board[row-1][col-1] = player1;
            }
            else {
                board[row-1][col-1] = player2;
            }

            // 判断是否胜利
            // 检查行
            for(int i=0; i<3; i++) {
                if(board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
                    if(currentPlayer == 1) {
                        gameState = 1;
                    }
                    else {
                        gameState = 2;
                    }
                    return gameState;
                }
            }
            // 检查列
            for(int i=0; i<3; i++) {
                if(board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
                    if(currentPlayer == 1) {
                        gameState = 1;
                    }
                    else {
                        gameState = 2;
                    }
                    return gameState;
                }
            }
            // 检查对角线
            if(board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
                if(currentPlayer == 1) {
                    gameState = 1;
                }
                else {
                    gameState = 2;
                }
                return gameState;
            }
            if(board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
                if(currentPlayer == 1) {
                    gameState = 1;
                }
                else {
                    gameState = 2;
                }
                return gameState;
            }

            // 判断是否平局
            int count = 0;
            for(int i=0; i<3; i++) {
                for(int j=0; j<3; j++) {
                    if(board[i][j] != ' ') {
                        count++;
                    }
                }
            }
            if(count == 9) {
                gameState = 3;
                return gameState;
            }

            // 切换到下一个玩家
            if(currentPlayer == 1) {
                currentPlayer = 2;
            }
            else {
                currentPlayer = 1;
            }
        }
        else {
            printf("This position is not empty. Try another one.\n");
        }
    }
}

输出结果

定义一个函数print_result()来根据游戏状态输出对应的信息:

void print_result(int gameState) {
    if(gameState == 1) {
        printf("Player 1 wins!\n");
    }
    else if(gameState == 2) {
        printf("Player 2 wins!\n");
    }
    else {
        printf("It's a tie!\n");
    }
}

示例说明

将上述代码整合到一个完整的程序中,下面给出两个示例:

示例1

Current board:
   |   |   
---|---|---
   |   |   
---|---|---
   |   |   
Player 1, enter row (1-3): 2
Player 1, enter column (1-3): 2
Current board:
   |   |   
---|---|---
   | X |   
---|---|---
   |   |   
Player 2, enter row (1-3): 1
Player 2, enter column (1-3): 1
Current board:
 O |   |   
---|---|---
   | X |   
---|---|---
   |   |   
Player 1, enter row (1-3): 2
Player 1, enter column (1-3): 3
Current board:
 O |   |   
---|---|---
   | X | X 
---|---|---
   |   |   
Player 2, enter row (1-3): 1
Player 2, enter column (1-3): 2
Current board:
 O |   |   
---|---|---
 O | X | X 
---|---|---
   |   |   
Player 1, enter row (1-3): 3
Player 1, enter column (1-3): 1
Current board:
 O |   |   
---|---|---
 O | X | X 
---|---|---
 X |   |   
Player 1 wins!

示例2

Current board:
   |   |   
---|---|---
   |   |   
---|---|---
   |   |   
Player 1, enter row (1-3): 1
Player 1, enter column (1-3): 1
Current board:
 X |   |   
---|---|---
   |   |   
---|---|---
   |   |   
Player 2, enter row (1-3): 1
Player 2, enter column (1-3): 2
Current board:
 X | O |   
---|---|---
   |   |   
---|---|---
   |   |   
Player 1, enter row (1-3): 2
Player 1, enter column (1-3): 2
Current board:
 X | O |   
---|---|---
   | X |   
---|---|---
   |   |   
Player 2, enter row (1-3): 1
Player 2, enter column (1-3): 3
Current board:
 X | O | O 
---|---|---
   | X |   
---|---|---
   |   |   
Player 1, enter row (1-3): 3
Player 1, enter column (1-3): 1
Current board:
 X | O | O 
---|---|---
   | X |   
---|---|---
 X |   |   
Player 2, enter row (1-3): 2
Player 2, enter column (1-3): 1
Current board:
 X | O | O 
---|---|---
 O | X |   
---|---|---
 X |   |   
Player 2 wins!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现简易井字棋游戏 - Python技术站

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

相关文章

  • 单链表的实现【02】:Student-Management-System

    一、问题引入 单链表的实现【01】:Student-Management-System 只体现了项目功能实现,未对代码部分做出说明。故新增随笔进行补充说明代码部分。 重构代码,迭代版本:Student Mangement System(Version 2.0) 二、解决过程 基于单链表实现就离不开链表的几个重要概念:头结点、首元结点、头指针 2-1 链表概念…

    C语言 2023年4月18日
    00
  • C语言实现宿舍管理系统设计

    C语言实现宿舍管理系统设计 1. 项目简介 本项目是一个基于C语言的宿舍管理系统,具有学生管理、宿舍管理、归寝管理、公告管理等多个功能。系统通过命令行界面进行操作,主要针对大学的学生宿舍进行管理。宿舍管理员可以通过此系统方便地对宿舍进行管理,包括学生信息的添加、删除、修改,宿舍信息的查询、修改等。 2. 实现思路 本项目的实现主要包括以下几个部分: 2.1 …

    C 2023年5月23日
    00
  • 教你用Python为二年级的学生批量生成数学题

    我会提供一份完整的教程,教读者用Python批量生成数学题的过程。 1. 概述 在本次教程中,我们将使用Python编写程序来批量生成数学题。通过阅读本文,您将学会以下技能: 使用python实现数学运算 生成随机数 生成word文档并写入数据 2. 开始 如果你没有Python开发环境,你需要首先安装Python和需要的依赖包。我们在本教程中使用pytho…

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

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

    C 2023年5月22日
    00
  • C语言指针和多维数组

    关于C语言指针和多维数组的使用攻略,我们分两部分来讲解。 C语言指针的使用攻略 C语言中的指针可以说是一个比较重要的概念,它是一种变量,其值为另一个变量的地址。因为可以通过指针访问变量的地址,所以我们在进行一些操作时,指针会大显身手。下面是一些指针的基本使用: 指针变量的定义 指针变量在定义时必须在变量名前面加上“*”号,如下所示: int *p; 这里定义…

    C 2023年5月9日
    00
  • Java Lambda表达式超详细介绍

    Java Lambda表达式超详细介绍 什么是Lambda表达式 Lambda表达式是Java 8中引入的新特性,它是一种简洁的语法格式,用于创建函数式接口实例的方法。通过Lambda表达式,可以把函数式接口作为函数参数传递或将其作为返回值返回。 Lambda表达式的语法格式 Lambda表达式的语法格式如下: (parameters) -> expr…

    C 2023年5月22日
    00
  • C 程序 使用递归查找数字的阶乘

    C程序 使用递归查找数字的阶乘 问题描述 给定一个正整数n,求n的阶乘,即$n! = n * (n-1) * (n-2) * … * 1$。使用递归方式实现阶乘的计算。 思路分析 递归计算阶乘是一个经典的问题,可以使用递归函数实现。具体思路可以分为两步: 判断递归结束的条件。在本问题中,当n等于1时,阶乘的值就是1 使用递归计算n-1的阶乘,然后再将结果…

    C 2023年5月9日
    00
  • C++中各种可调用对象深入讲解

    C++中可调用对象的深入讲解 什么是可调用对象? 在C++中,可调用对象是指可以被调用、执行的实体。常见的可调用对象包括函数、类成员函数、lambda表达式等。C++中的可调用对象都可以作为函数参数或返回值进行传递。 函数指针作为可调用对象 在C++中,函数指针也是可调用对象之一。定义函数指针的方式如下: int (*funcPtr)(int, int); …

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