C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言三子棋

基于C语言实现三子棋游戏的示例代码

作者:小刘同学L

这篇文章主要为大家详细介绍了如何利用C语言数组实现简单的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.创建文件 

test.c (游戏的测试逻辑)game.c(游戏的实现逻辑)gane.h(游戏实现函数的声明)

game.c 和game.h属于游戏实现 test.c属于游戏测试

test.c 源文件(源文件添加)——game.c 源文件(源文件添加)——game.h(头文件添加)

三个文件 

2.首先在test.c文件写一个主函数,主函数里面有一个测试函数,测试函数里面写菜单、进入游戏、退出游戏

代码展示:

void menu()
{
    printf("***************************\n");
    printf("********  1.play   ********\n");
    printf("********  0.exit   ********\n");
    printf("***************************\n");
}
 
void test()
{
    int input = 0;
    do
    {
        menu();
        printf("请选择:->");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("三子棋\n");
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}
 
#include <stdio.h>
int main()
{
    test();
    return 0;
}

注意:

(1)一般用do while (游戏可能会玩很多次,最少一次)

(2)先打印一个菜单

(3)switch语句,要记得break,要记得default

接下来 把printf("三子棋\n")  改成 game(); 然后开始写游戏部分。 

3.三子棋代码

思路:(\n 不要忘记写)

(1)棋盘用数组

(2)假设玩家走用' * ',电脑走用' # ',所以用字符类型的数组(3*3的)

row 中文意思是行 column 中文意思是列   init 英文最初的简写

引用自己写的文件 把#include < >改成 #include " "

(3)棋盘初始化

函数的声明在头文件里

(4)打印棋盘 (打印数据、分割行),把数据行和分割行看做一大部分,最后一部分没有分割行而已。

(5)玩家下棋,打印棋盘,电脑下棋,打印棋盘。

(6)每下一步棋后,会有四种结果 玩家赢,电脑赢,平局,继续玩 。所以要进行判断。

玩家赢 ‘*’,电脑赢‘#’,平局‘Q’,继续 ‘C’

game.h 部分代码展示

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
#define ROW 3
#define COL 3
 
//初始化棋盘
void Initboard(char board[ROW][COL], int row, int col);//define 定义的ROW,COL是常量,而这里的row,col都是变量,所以不能替代
void Displayboard(char board[ROW][COL], int row, int col);//打印棋盘
void player_move(char board[ROW][COL], int row, int col);//玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//电脑下棋
 
char is_win(char board[ROW][COL], int row, int col);//判断输赢以及平局和继续玩

game.c代码展示

#include "game.h"
 
 
void Initboard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}
 
void Displayboard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        //打印数据
        //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//固定的数字0,1,2 会把棋盘给固定住,所以不能这样写
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)
                printf("|");
        }
        printf("\n");
        //打印分割行
        if (i < row - 1)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
    
}
 
int is_full(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}
 
void player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("请输入坐标:->");
    while (1)
    {
        scanf("%d %d", &x, &y);
        //判断坐标是否在棋盘范围
        if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("该坐标被占用,请重新输入!\n");
            }
        }
        else
        {
            printf("坐标非法\n");
        }
    }
}
 
//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑下棋\n");
    while (1)
    {
        x = rand() % row;
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
//判断每一步棋后是输赢,还是平局,还是继续玩
char is_win(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][0];
        }
    }
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    {
        return board[0][0];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    int a = is_full(board, row, col);
    if (1 == a)
    {
        return 'Q';
    }
    return 'C';
}

test.c 部分代码展示

#include "game.h"
 
void menu()
{
    printf("***************************\n");
    printf("********  1.play   ********\n");
    printf("********  0.exit   ********\n");
    printf("***************************\n");
}
 
void game()
{
    char board[ROW][COL] = { 0 };
    Initboard(board, ROW, COL);//棋盘初始化,内容为空格
    Displayboard(board, ROW, COL);//打印棋盘
    char ret = 0;
    //下棋
    while (1)
    {
        player_move(board, ROW, COL);
        Displayboard(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        computer_move(board, ROW, COL);
        Displayboard(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("恭喜你,取得胜利!\n");
    }
    else if (ret == 'Q')
    {
        printf("平局\n");
    }
    else
    {
        printf("你输了\n");
    }
}
 
void test()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择:->");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}
 
 
int main()
{
    test();
    return 0;
}

以上就是基于C语言实现三子棋游戏的示例代码的详细内容,更多关于C语言三子棋的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文