C语言实现简单的三子棋游戏源码

下面是“ C语言实现简单的三子棋游戏源码”的完整攻略:

一、三子棋游戏规则

三子棋又叫井字棋游戏,是一款传统的二人对弈类游戏。双方玩家交替将自己的棋子放置在 3x3 的棋盘格子上,先连成一条线(直线、横线、斜线)的为胜者。

二、游戏实现思路

1. 程序结构

本游戏程序的基本框架由以下几个部分构成:

/*
 *  三子棋游戏
 *  main函数
 *  初始化棋盘
 *  显示棋盘
 *  玩家下子
 *  判断游戏是否结束
 *  电脑下子
 *  判断游戏是否结束
*/
int main(){
    //省略
}

void print_board(){
    //省略
}

int player_move(){
    //省略
}

int computer_move(){
    //省略
}

2. 初始化棋盘

首先,我们需要初始化一个3×3的棋盘,用二维数组表示。每个位置默认为空(设为' ')。

示例代码:

char board[3][3];

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

3. 显示棋盘

接下来,实现一个函数,将当前的棋盘状态进行打印。

示例代码:

void print_board(){
    //显示棋盘行号
    printf("  1 2 3 \n");
    //分割线
    printf(" -------\n");
    for(int i=0;i<3;i++){
        //显示列号
        printf("%d|", i+1);
        for(int j=0;j<3;j++){
            printf("%c|",board[i][j]);
        }
        printf("\n");
        //分割线
        printf(" -------\n");
    }
}

4. 玩家下子

接下来,实现玩家下子的函数。该函数获取玩家输入的坐标,检查输入是否合法并更新棋盘状态。

示例代码:

int player_move(){
    int row,col;
    while(1){
        printf("请输入您要下的坐标(例:1 2):");
        //获取坐标
        scanf("%d %d",&row,&col);
        //判断坐标是否合法
        if(row<1 || row>3 || col<1 || col>3){
            printf("坐标输入有误,请重新输入!\n");
        }
        else if(board[row-1][col-1] != ' '){
            printf("该位置已有棋子,请重新输入!\n");
        }
        else{
            //更新棋盘
            board[row-1][col-1] = 'X';
            return check_game_over();
        }
    }
}

int check_game_over(){
    //判断是否有一方胜出
    for(int i=0;i<3;i++){
        if(board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]){
            return 1;
        }
        if(board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]){
            return 1;
        }
    }
    if(board[1][1] != ' ' && ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))){
        return 1;
    }
    //判断是否平局
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(board[i][j] == ' '){
                return 0;
            }
        }
    }
    return 2;
}

5. 电脑下子

最后,实现电脑下子的函数。该函数随机生成一个坐标,在棋盘上落子。

示例代码:

int computer_move(){
    int row,col;
    while(1){
        row = rand() % 3;
        col = rand() % 3;
        if(board[row][col] == ' '){
            board[row][col] = 'O';
            return check_game_over();
        }
    }
}

三、完整源码

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

//三子棋棋盘
char board[3][3];

//初始化棋盘
void init_board(){
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            board[i][j] = ' ';
        }
    }
}

//显示棋盘
void print_board(){
    //显示棋盘行号
    printf("  1 2 3 \n");
    //分割线
    printf(" -------\n");
    for(int i=0;i<3;i++){
        //显示列号
        printf("%d|", i+1);
        for(int j=0;j<3;j++){
            printf("%c|",board[i][j]);
        }
        printf("\n");
        //分割线
        printf(" -------\n");
    }
}

//玩家下子
int player_move(){
    int row,col;
    while(1){
        printf("请输入您要下的坐标(例:1 2):");
        //获取坐标
        scanf("%d %d",&row,&col);
        //判断坐标是否合法
        if(row<1 || row>3 || col<1 || col>3){
            printf("坐标输入有误,请重新输入!\n");
        }
        else if(board[row-1][col-1] != ' '){
            printf("该位置已有棋子,请重新输入!\n");
        }
        else{
            //更新棋盘
            board[row-1][col-1] = 'X';
            return check_game_over();
        }
    }
}

//判断游戏是否结束
int check_game_over(){
    //判断是否有一方胜出
    for(int i=0;i<3;i++){
        if(board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]){
            return 1;
        }
        if(board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]){
            return 1;
        }
    }
    if(board[1][1] != ' ' && ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))){
        return 1;
    }
    //判断是否平局
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(board[i][j] == ' '){
                return 0;
            }
        }
    }
    return 2;
}

//电脑下子
int computer_move(){
    int row,col;
    while(1){
        row = rand() % 3;
        col = rand() % 3;
        if(board[row][col] == ' '){
            board[row][col] = 'O';
            return check_game_over();
        }
    }
}

//三子棋游戏主函数
int main(){
    int result = 0,player_turn = 1;
    //初始化随机数种子
    srand(time(NULL));
    init_board();
    print_board();
    while(1){
        if(player_turn){
            result = player_move();
            print_board();
            if(result == 1){
                printf("您赢了!\n");
                break;
            }
            else if(result == 2){
                printf("平局!\n");
                break;
            }
            player_turn = 0;
        }
        else{
            printf("电脑下子:\n");
            result = computer_move();
            print_board();
            if(result == 1){
                printf("电脑赢了!\n");
                break;
            }
            else if(result == 2){
                printf("平局!\n");
                break;
            }
            player_turn = 1;
        }
    }
    return 0;
}

四、示例说明

示例一

三子棋游戏
  1 2 3 
 -------
1| | | |
 -------
2| | | |
 -------
3| | | |
 -------
请输入您要下的坐标(例:1 2):2 2
  1 2 3 
 -------
1| | | |
 -------
2| |X| |
 -------
3| | | |
 -------
电脑下子:
  1 2 3 
 -------
1| | | |
 -------
2|O|X| |
 -------
3| | | |
 -------
请输入您要下的坐标(例:1 2):3 1
  1 2 3 
 -------
1| | | |
 -------
2|O|X| |
 -------
3|X| | |
 -------
电脑下子:
  1 2 3 
 -------
1| | | |
 -------
2|O|X| |
 -------
3|X| |O|
 -------
请输入您要下的坐标(例:1 2):2 1
  1 2 3 
 -------
1| | | |
 -------
2|O|X| |
 -------
3|X|X|O|
 -------
电脑下子:
  1 2 3 
 -------
1|O| | |
 -------
2|O|X| |
 -------
3|X|X|O|
 -------
电脑赢了!

示例二

三子棋游戏
  1 2 3 
 -------
1| | | |
 -------
2| | | |
 -------
3| | | |
 -------
请输入您要下的坐标(例:1 2):2 2
  1 2 3 
 -------
1| | | |
 -------
2| |X| |
 -------
3| | | |
 -------
电脑下子:
  1 2 3 
 -------
1| | | |
 -------
2| |X| |
 -------
3|O| | |
 -------
请输入您要下的坐标(例:1 2):3 1
  1 2 3 
 -------
1| | | |
 -------
2| |X| |
 -------
3|O| |X|
 -------
电脑下子:
  1 2 3 
 -------
1|O| | |
 -------
2| |X| |
 -------
3|O| |X|
 -------
请输入您要下的坐标(例:1 2):2 3
  1 2 3 
 -------
1|O| | |
 -------
2| |X|X|
 -------
3|O| |X|
 -------
平局!

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

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

相关文章

  • C++中头文件的概念与基本编写方法

    C++ 中的头文件是指包含程序中可重用的函数、变量和常量等定义的文件。头文件在程序编写中起到很重要的作用,可以避免在代码中重复定义和声明,提高代码的可读性和可维护性,同时也可以加速编译速度。 下面就详细讲解 C++ 中头文件的概念与基本编写方法: 概念 在 C++ 中,头文件可以分为系统头文件和自定义头文件两种类型。系统头文件是由编译器提供的,包含了一些常用…

    C 2023年5月23日
    00
  • C语言的数字游戏算法效率问题探讨实例

    C语言的数字游戏算法效率问题探讨实例 简介 本篇文章主要探讨C语言中数字游戏算法的效率问题,包括算法的理解和实现方法、时间和空间复杂度分析以及优化过程。 算法理解 首先,我们需要理解什么是数字游戏算法。它包含以下三个要素: 初始状态:即初始的数字序列 目标状态:即目标的数字序列 可以进行的操作:例如交换两个数字、反转一段区间等 那么如何才能将初始状态变为目标…

    C 2023年5月22日
    00
  • 详谈C++何时需要定义赋值/复制构造函数

    当我们在C++中定义一个类时,编译器会自动生成默认的赋值/复制构造函数。但是,有时我们需要自己来定义这些函数。本文将为你详细讲解何时需要定义自己的赋值/复制构造函数。 一、什么是复制构造函数和赋值操作符? 在开始之前,我们先来简单介绍一下复制构造函数和赋值操作符。 复制构造函数:在创建一个新的类对象时,可以使用另一个对象作为它的初始值。这种情况下,会自动调用…

    C 2023年5月22日
    00
  • C语言求字符串长度的四种方法实例代码

    下面是针对“C语言求字符串长度的四种方法实例代码”这个主题的完整攻略: 一、背景 在C语言中,获取字符串长度是一个比较基础的操作,它在很多情况下都非常有用。本文将介绍四种常见的C语言获取字符串长度的方法,逐一进行讲解和实例演示。 二、方法一:使用strlen()函数 strlen()函数是C语言中用于获取字符串长度的标准函数,它的使用非常简单,直接传入字符串…

    C 2023年5月24日
    00
  • C语言中如何进行静态链接库编程?

    C语言中静态链接库编程主要包括三个步骤:编写代码、编译成目标文件、将目标文件打包成静态链接库。下面我将详细讲解每一步骤。 编写代码 首先,我们需要编写需要包含在静态链接库中的函数代码。下面是一个简单的示例: // mylib.h #ifndef MYLIB_H #define MYLIB_H int add(int x, int y); int sub(in…

    C 2023年4月27日
    00
  • C++ move()函数案例详解

    C++ move()函数案例详解 什么是move()函数? move()函数是C++11中提供的一种对于对象进行右值引用(Rvalue Reference)的操作。该函数能够将对象转换成右值引用,实现对象的移动(Move)而非拷贝(Copy)。 为什么需要move()函数? 在C++的编程过程中,我们经常需要对于对象进行拷贝操作,以便进行如参数传递、返回值传…

    C 2023年5月22日
    00
  • 深入理解C++模板如何实现多态思想

    深入理解C++模板如何实现多态思想 C++模板是一种高度通用化的编程工具,除了可以用来实现代码复用之外,还可以用来实现多态的编程思想。在这里,我将详细介绍如何使用C++模板来实现多态的思想,涵盖泛型编程、函数模板、类模板等方面。 一、泛型编程泛型编程是C++模板多态思想的最基本组成部分,其核心思想是将数据类型与算法分离,从而实现代码的通用化。在使用C++模板…

    C 2023年5月23日
    00
  • C语言实现学生信息管理系统(多文件)

    C语言实现学生信息管理系统(多文件)攻略 1. 项目概述 该项目是一个基于C语言的学生信息管理系统,实现了学生的增删改查等功能,使用了多文件的方式组织代码,提高了代码的可维护性。 2. 实现步骤 2.1 文件结构 首先建立项目文件夹,并在文件夹中创建如下的文件: main.c:包含主函数和系统的核心功能代码; student.c:包含学生信息相关的实现代码;…

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