C语言 进阶版三子棋小游戏

目录

前言

游戏运行效果:

游戏代码:

1.test.c文件

2.  game.h头文件 

3.  game.c 

一.框架部分

二.游戏函数实现

1.创建数组并初始化

2.打印数组 

3.玩家下棋 

4.电脑判断然后下棋 

5.判断游戏胜负 

总结 


前言

用C语言写出进阶三子棋程序,电脑会根据玩家的操作进行判断,最大限度的战胜玩家或者平局。那么首先有一个大体框架,可以执行开始游戏,退出游戏,以及输入错误提示,然后进行打印棋盘,玩家和电脑下棋,并判断胜负。

游戏运行效果:

游戏代码:

写在test.c(测试) ,game.c(游戏),game.h(头文件)

1.test.c文件

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void menu()
{
    printf("------------------------------------------------------\n");
    printf("----------1.开始游戏--------0.退出游戏----------------\n");
    printf("------------------------------------------------------\n");

}
void game()
{
    
    int ret = 0;
    char arr[ROW][COL] = { 0 };//创建一个数组
    Initializ(arr, ROW, COL);//对数组进行初始化
    disprint(arr, ROW, COL);//打印棋盘
    while (1)
    {
        
        Computermove(arr, ROW, COL);//电脑下棋
        disprint(arr, ROW, COL);//打印棋盘
        ret = Judge_win(arr, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        Playermove(arr, ROW, COL);//玩家下棋
        disprint(arr, ROW, COL);//打印棋盘
        ret = Judge_win(arr, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("玩家赢\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢\n");
    }
    else if (ret == 'Q')
    {
        printf("平局\n");
    }
    
}
void test()
{
    int input = 0;
    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;
}

 

2.  game.h头文件

#define ROW 3//行
#define COL 3//列
#include<stdio.h>
#include<stdlib.h>//头文件
#include<time.h>

void Initializ(char arr[ROW][COL], int row, int col);//初始化
void disprint(char arr[ROW][COL], int row, int col);//打印
void Playermove(char arr[ROW][COL], int row, int col);//玩家移动
void Computermove(char arr[ROW][COL], int row, int col);//电脑移动
char Judge_win(char arr[ROW][COL], int row, int col);//判断胜负
int Judge_com(char arr[ROW][COL], int row, int col, int z);//电脑判断自己能否赢
int Judge_player(char arr[ROW][COL], int row, int col,int z);//电脑判断玩家是否要赢,进行拦截

 

3.  game.c  

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initializ(char arr[ROW][COL], int row, int col)//初始化数组
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';
        }
    }
}
void disprint(char arr[ROW][COL], int row, int col)//打印棋盘
{
    int i = 0;
    int j = 0;
    printf("------------");
    printf("\n");
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            printf(" %c ", arr[i][j]);
            
            printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            int s = 0;
            for (s = 0; s < col; s++)
            {
                printf("---");
            
                printf("|");
            }
            printf("\n");
        }
    }
    
    printf("------------\n");
    
}
int is_full(char arr[ROW][COL], int row, int col)//判断是否平局
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            if (arr[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

void Playermove(char arr[ROW][COL], int row, int col)//玩家下棋
{
    
    int x = 0;
    int y = 0;
    int d = 0;
    printf("请玩家下棋:>");
    while (1)
    {
        scanf("%d%d", &x, &y);
        
        if (x >= 1 && x <= ROW&&y >= 1 && y <= COL)
        {
            if (arr[x - 1][y - 1] == ' ')
            {
                arr[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("输入错误,请重新输入:>");
            }
        }
        else
        {
            printf("输入错误,请重新输入:>");
        }
    }
    
}
void Computermove(char arr[ROW][COL], int row, int col)//电脑下棋
{
    int x = 0;
    int y = 0;
    int z = 0;
    printf("电脑下棋\n");
    z = Judge_com(arr, ROW, COL, z);//电脑判断自己能否赢
    while (z == 0)
    {
        x = rand() % ROW;
        y = rand() % COL;
        if (arr[x][y] == ' ')
        {
            arr[x][y] = '#';
            break;
        }
    }
}
char Judge_win(char arr[ROW][COL], int row, int col)//判断胜负
{
    int i = 0;
    //判断3行

    
    for (i = 0; i < row; i++)
    {
        if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
        {
            return arr[i][0];
        }

    }
    //判断三列
    for (i = 0; i < col; i++)
    {
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
        {
            return arr[0][i];
        }
    }
    //判断2个斜线
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
    {
        return arr[0][0];
    }
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
    {
        return arr[0][2];
    }

    //判断是否下满,是否平局
    int len = 0;
    len=is_full(arr, ROW, COL);
    if (len == 1)
    {
        return 'Q';
    }
    else
    {
        return 'C';
    }
}
int Judge_com(char arr[ROW][COL], int row, int col,int z)//电脑判断自己能否胜利
{
    while (z == 0)
    {
        int i = 0;
        for (i = 0; i < row; i++)//判断三行是否有两个‘#’
        {
            if (arr[i][0] == arr[i][1] && arr[i][1] == '#'&&arr[i][2] == ' ')
            {
                z = 1;
                arr[i][2] = '#';
                break;
            }
            if (arr[i][1] == arr[i][2] && arr[i][2] == '#'&&arr[i][0] == ' ')
            {
                z = 1;
                arr[i][0] = '#';
                break;
            }
            if (arr[i][0] == arr[i][2] && arr[i][2] == '#'&&arr[i][1] == ' ')
            {
                z = 1;
                arr[i][1] = '#';
                break;
            }
        }
        if (z != 0)
            break;
        for (i = 0; i < col; i++)//判断三列是否有两个‘#’
        {
            if (arr[0][i] == arr[1][i] && arr[1][i] == '#'&&arr[2][i] == ' ')
            {
                z = 1;
                arr[2][i] = '#';
                break;
            }
            if (arr[1][i] == arr[2][i] && arr[2][i] == '#'&&arr[0][i] == ' ')
            {
                z = 1;
                arr[0][i] = '#';
                break;
            }
            if (arr[0][i] == arr[2][i] && arr[2][i] == '#'&&arr[1][i] == ' ')
            {
                z = 1;
                arr[1][i] = '#';
                break;
            }
        }
        break;
    }
        while (z == 0)//判断两个竖线是否有两个‘#’
        {
            if (arr[0][0] == arr[1][1] && arr[1][1] == '#'&&arr[2][2] == ' ')
            {
                z = 1;
                arr[2][2] = '#';
                break;
            }
            if (arr[0][0] == arr[2][2] && arr[2][2] == '#'&&arr[1][1] == ' ')
            {
                z = 1;
                arr[1][1] = '#';
                break;
            }
            if (arr[1][1] == arr[2][2] && arr[1][1] == '#'&&arr[0][0] == ' ')
            {
                z = 1;
                arr[0][0] = '#';
                break;
            }

            if (arr[0][2] == arr[1][1] && arr[1][1] == '#'&&arr[2][0] == ' ')
            {
                z = 1;
                arr[2][0] = '#';
                break;
            }
            if (arr[0][2] == arr[2][0] && arr[0][2] == '#'&&arr[1][1] == ' ')
            {
                z = 1;
                arr[1][1] = '#';
                break;
            }
            if (arr[1][1] == arr[2][0] && arr[1][1] == '#'&&arr[0][2] == ' ')
            {
                z = 1;
                arr[0][2] = '#';
                break;
            }
            break;
        }
        z = Judge_player(arr, ROW, COL,z);//判断玩家是否要赢,进行拦截
    return z;
}
int Judge_player(char arr[ROW][COL], int row, int col,int z)//判断玩家是否要赢,进行拦截
{
    while (z == 0)
    {
        int i = 0;
        for (i = 0; i < row; i++)//判断玩家3行
        {
            if (arr[i][0] == arr[i][1] && arr[i][1] == '*'&&arr[i][2] == ' ')
            {
                z = 1;
                arr[i][2] = '#';
                break;
            }
            if (arr[i][1] == arr[i][2] && arr[i][2] == '*'&&arr[i][0] == ' ')
            {
                z = 1;
                arr[i][0] = '#';
                break;
            }
            if (arr[i][0] == arr[i][2] && arr[i][2] == '*'&&arr[i][1] == ' ')
            {
                z = 1;
                arr[i][1] = '#';
                break;
            }
        }
        if (z != 0)
            break;
        for (i = 0; i < col; i++)//判断玩家3列
        {
            if (arr[0][i] == arr[1][i] && arr[1][i] == '*'&&arr[2][i] == ' ')
            {
                z = 1;
                arr[2][i] = '#';
                break;
            }
            if (arr[1][i] == arr[2][i] && arr[2][i] == '*'&&arr[0][i] == ' ')
            {
                z = 1;
                arr[0][i] = '#';
                break;
            }
            if (arr[0][i] == arr[2][i] && arr[2][i] == '*'&&arr[1][i] == ' ')
            {
                z = 1;
                arr[1][i] = '#';
                break;
            }
        }
        break;
    }
    while (z == 0)//判断两个斜线
    {
        if (arr[0][0] == arr[1][1] && arr[1][1] == '*'&&arr[2][2] == ' ')
        {
            z = 1;
            arr[2][2] = '#';
            break;
        }
        if (arr[0][0] == arr[2][2] && arr[2][2] == '*'&&arr[1][1] == ' ')
        {
            z = 1;
            arr[1][1] = '#';
            break;
        }
        if (arr[1][1] == arr[2][2] && arr[1][1] == '*'&&arr[0][0] == ' ')
        {
            z = 1;
            arr[0][0] = '#';
            break;
        }

        if (arr[0][2] == arr[1][1] && arr[1][1] == '*'&&arr[2][0] == ' ')
        {
            z = 1;
            arr[2][0] = '#';
            break;
        }
        if (arr[0][2] == arr[2][0] && arr[0][2] == '*'&&arr[1][1] == ' ')
        {
            z = 1;
            arr[1][1] = '#';
            break;
        }
        if (arr[1][1] == arr[2][0] && arr[1][1] == '*'&&arr[0][2] == ' ')
        {
            z = 1;
            arr[0][2] = '#';
            break;
        }
        break;
    }
    return z;
}

 


一.框架部分

使用do...while循环,来实现3种不同的情况:进入游戏,退出游戏,输入错误。

调用一个菜单函数进行选择,选择1进入game()函数,选择0退出游戏,如果不是0或1就提示重新输入。

二.游戏函数实现

在函数内部要进行1.创建二维数组 2.对数组进行初始化,初始化为空格 3.打印数组  4.玩家进行下棋  5.电脑判断后进行下棋 6.判断胜负 

1.创建数组并初始化

为了更加直观,数组的行和列用#define定义

初始棋盘什么都不显示,将数组初始化成空格 

2.打印数组 

所想棋盘为井字,利用|,-  将棋盘打印出来,使用for循环打印出来 

 

3.玩家下棋 

所画棋盘是3*3的格子,为3行3列,数组下标是0,1,2,但为了下棋时坐标更为直观,写成1到3,然后在下子时-1就会得到数组下标。

x为行,y为列,下棋时用while(1)死循环,如果输入错误或者重复下一个地方,进行提示,让玩家重新下棋,如果正确就将棋子放到里面,然后跳出循环,让电脑下棋。

4.电脑判断然后下棋 

到电脑下棋时,电脑首先要判断自己是否可以胜利,如果已有两个子那么就下到第三个地方,完成3子连起来,然后判断玩家当前棋子,如果有两个就进行拦截,如果以上条件都不成立,那么就生成随机坐标进行下棋,每次下棋之前都进行判断 

调用函数来判断,z接收返回值,如果是0,那么条件并不成立,生成随机坐标,如果是1就进行以下操作:

以上判断过之后,进入判断玩家是否要赢的函数,如果玩家在一行,一列,斜线,有两个棋子,电脑判断后进行拦截

5.判断游戏胜负 

游戏时,有4种情况,1.平局,2,电脑胜利,3.玩家胜利,4.继续。那么我们定义平局为“Q”,玩家赢为“*”,电脑赢为“#”,平局为“C”。

调用一个判断胜负的函数,利用返回的字符来判断以上情况

最后调用is_full()函数来判断棋盘是否下满,如果下满返回“Q”(平局),否则返回“C”继续下棋 

 

总结 

以上就是进阶版三子棋的全部内容了 ,程序还存在不足的地方,欢迎指出,有待改进。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值