三子棋游戏,哟西。

今天来分享我的三子棋算法,会对其中的一些地方进行讲解,帮助大家避坑,犹如代码比较粗糙,只是一遍打的,不建议新手模仿。

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

#define ROW 3
#define COL 3

void menu(void)
{
    printf("____________________\n");
    printf("  1 开始精彩的三字棋游戏\n");
    printf("  0   退出           \n");
    printf("____________________\n");
}

void print(int a[ROW][COL])
{
    int i=0;
    int j=0;
    int x=0;
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            printf("%c",a[i][j]);
            if(j==2)
            {
                break;
            }
            printf("|");
        }
        printf("\n");
        if(i==2)
        {
            break;
        }
        for(x=0;x<ROW;x++)
        {
            printf("一");
        }
        printf("\n");
    }
}

void person(int a[ROW][COL])
{
    int i=0;
    int j=0;
    while(1)
    {
        scanf("%d %d",&i,&j);
        if(i>=1&&i<=3&&j>=1&&j<=3&&a[i-1][j-1]==' ')
        {
            a[i-1][j-1]='*';
            break;
        }
        else
        {
            printf("输入错误");
        }
    }
}

void computer(int a[ROW][COL])
{
    while(1)
    {
        int i=rand()%ROW+1;
        int j=rand()%COL+1;
        if(i>=1&&i<=3&&j>=1&&j<+3&&a[i-1][j-1]==' ')
        {
            a[i-1][j-1]='+';
            break;
        }
    }
}

void judge(int a[ROW][COL])
{
    if(a[0][0]=='*'&&a[0][1]=='*'&&a[0][2]=='*')
    {
        printf("person win\n");
        exit(-1);
    }
    if(a[1][1]=='*'&&a[1][0]=='*'&&a[1][2]=='*')
    {
        printf("person win\n");
        exit(-1);
    }
    if(a[2][0]=='*'&&a[2][1]=='*'&&a[2][2]=='*')
    {
        printf("person win\n");
        exit(-1);
    }
    if(a[0][0]=='+'&&a[0][1]=='+'&&a[0][2]=='+')
    {
        printf("computer win\n");
        exit(-1);
    }
    if(a[1][1]=='+'&&a[1][0]=='+'&&a[1][2]=='+')
    {
        printf("computer win\n");
        exit(-1);
    }
    if(a[2][0]=='+'&&a[2][1]=='+'&&a[2][2]=='+')
    {
        printf("computer win\n");
        exit(-1);
    }
    if(a[0][0]=='*'&&a[1][1]=='*'&&a[2][2]=='*')
    {
        printf("person win\n");
        exit(-1);
    }
    if(a[0][2]=='*'&&a[1][1]=='*'&&a[2][0]=='*')
    {
        printf("person win\n");
        exit(-1);
    }
    if(a[0][0]=='+'&&a[1][1]=='+'&&a[2][2]=='+')
    {
        printf("computer win\n");
        exit(-1);
    }
    if(a[0][2]=='+'&&a[1][1]=='+'&&a[2][0]=='+')
    {
        printf("computer win\n");
        exit(-1);
    }
}

void game(int a[ROW][COL])
{
    while(1)
    {
        person(a);
        print(a);
        printf("\n");
        judge(a);
        computer(a);
        print(a);
        printf("\n");
        judge(a);
    }
}


int main()
{
    int a[ROW][COL]={0};
    int i=0;
    int j=0;
    for(i=0;i<ROW;i++)
    {
        for(j=0;j<COL;j++)
        {
            a[i][j]=' ';
        }
    }
    
    menu();
    int n=0;
    do
    {
        scanf("%d",&n);
        switch(n)
        {
            case 1:
                game(a);
                break;
            case 0:
                break;
            default:
                printf("输入错误,笨狗");
        }
    }while(n);
    return 0;
}


上面就是我所打出来的代码,可以轻而易举的看到有些地方方法过于复杂,一眼就能看出来的部分就是判断谁赢了的时候,这是非常繁琐的,例如一行为相同的时候赢得时候完全可以借用for循环,听过使行不变,其余向数组后面遍历,并且通过两个简单的if语句就可以判断谁赢了游戏。
在这里插入图片描述
由于本人比较懒,也就不把调试好的简易版本呈上了,有时间会发在评论区(实际上根本不会)。
在这里插入图片描述
上面就是为了能够不断进行游戏,无论是玩家还是电脑选好地方填入后都会打印一次并且进行一次判断,防止有人赢了都不知道。
在这里插入图片描述
主函数就比较简单,三子棋就创建一个三位数组,并且把每一个元素都变成空格,方便后面填入,并且需要一个数来表明玩家的心意,也就是你到底玩不玩,不玩就可以退出,如果你输错,就会叫你笨狗。
在这里插入图片描述
玩家如果填错,必须得有机会才行,不能一棍打死,要让你再次输入,所以必须用一个while循环,并且要一直进行,如果填对了,就要走出循环,用一个break正好,computer也是如此,毕竟他是随机填入,可能需要填写好几次才能填对。
在这里插入图片描述
在这里插入图片描述
可以看到i和j,他们分别是除余,只可能会有0,1,2存在,不会有三,这就不行,因为玩家可能不理解内部程序,只会以为这只是普通游戏一样,一就代表第一行,这显然不行,所以后面的加一显得尤为重要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值