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语言手写集合List的示例代码

    下面是详细讲解如何手写C语言的集合List,并附带两个示例。 什么是集合List? 集合是一种数据结构,它可以存储任意类型的数据,并且可以动态地添加、删除和查询数据。其中最常见的集合是列表(List),它可以存储一组相同或不同类型的数据,并且可以根据需要进行扩展和缩减。 List的实现 下面介绍一下如何使用C语言手写一个List。一个List由一个指针和一个…

    C 2023年5月24日
    00
  • JS中的Error对象及使用JSON.stringify()序列化Error问题

    JS中的Error对象是用于处理和抛出错误的一种内置类型,它有以下几个属性: name:Error对象的名称,默认为“Error”。 message:错误消息,通常是人类可读的信息。 stack:当前调用栈的字符串表示,用于调试目的。 当发生错误时,可以使用以下语法创建一个Error对象: throw new Error(‘错误消息’); 这会把错误消息作为…

    C 2023年5月23日
    00
  • C++如何将vector数字写入到txt文件中

    C++ 中可以使用 fstream 类来进行文件操作,包括读取和写入操作。在将 vector 数组写入文本文件中时,需要打开一个输出文件流,然后逐个将 vector 数组中的元素写入文件中即可。 以下是代码示例: 示例一 #include <fstream> #include <vector> #include <iostrea…

    C 2023年5月23日
    00
  • VSCode插件开发全攻略之package.json详解

    下面我会详细讲解“VSCode插件开发全攻略之package.json详解”的完整攻略。 前言 package.json是Node.js项目中的配置文件,也是VSCode插件开发中必不可少的一部分。它用于描述插件的信息、依赖项、命令脚本等,同时也是发布插件到市场上所必需的信息之一。这篇攻略将为大家详细讲解package.json的全部内容,从而帮助开发者更好…

    C 2023年5月23日
    00
  • C语言打印各种图案实例代码

    下面是详细的“C语言打印各种图案实例代码”的攻略。 1. 程序基本框架 首先我们需要定义一个函数,用于打印图案。函数的返回值为void,函数名为printPattern,传入两个参数,分别是打印的行数和列数。函数内部使用循环语句打印出需求的图案。在主函数中调用printPattern函数,传入相应的行数和列数。 示例代码如下: #include <st…

    C 2023年5月24日
    00
  • C/C++ 中extern关键字详解

    C/C++ 中extern关键字详解 在 C/C++ 中,extern 是一个很常见的关键字,常用于声明全局变量或函数。本文将对 extern 关键字进行详细讲解。 1. 变量声明 当在多个源文件中引用同一全局变量时,需要在其中一个源文件中定义该全局变量,然后在其它源文件中使用 extern 关键字声明该变量。这样确保了在多文件编译时,每个文件都将引用同一变…

    C 2023年5月23日
    00
  • 如何将JSON字符串数组转对象集合

    将JSON字符串数组转变成对象集合有以下三个步骤: 解析JSON字符串数组成JSON对象 遍历JSON对象,将每个JSON对象转化成目标对象 将转化好的目标对象添加到集合中 下面用JavaScript语言提供两种实现的示例: 示例 1 如下所示的JSON字符串数组: var jsonStrArray = [ ‘{"name":"…

    C 2023年5月23日
    00
  • Qt使用流处理XML文件的示例代码

    下面我将详细讲解Qt如何使用流处理XML文件。 步骤一:设置XML文件 在使用Qt流处理XML文件之前,首先需要构造XML文件。 我们可以使用Qt提供的QFile类来将XML文件写入磁盘中。例如: QFile file("test.xml"); // 文件名 if(!file.open(QIODevice::WriteOnly | QIO…

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