用C语言制作三子棋(井字棋)

        三子棋,我相信许多人都有玩过,曾经晚自习无聊时就拿张稿子,画个井字就可以和同桌愉快的博弈了。但是一张稿纸只能玩几次就被画满了,十分的浪费纸张,而用C语言只需要利用一个循坏就可以玩到你不想玩。

        首先,我们先写一个main()函数,用来控制这整个程序,你是否想玩利用mune()函数进行控制,而游戏的过程由game()函数负责实施。

        如图,当mune()的返回值为2时,结束程序,否则就是不断的循环进行游戏,每次游戏结束进行一次清屏,保证屏幕的干净整洁。

        mune()函数进行菜单的打印,以及接受玩家的选择并作出相应的处理,如果输入1||2以外的数字,就会陷入循环,知道输入1||2为止。

        game()函数就开始对游戏过程的具体实施,其中qipan()函数进行对棋盘的打印,panding函数进行对胜负的判定,以及对现在轮到谁下进行提醒,因为三子棋最多只能走9步,所以在k=10(第10步)退出循环,如果在循环中为判定出胜负,则为平局,应为最快也要先手走3步,后手走两步才能分出胜负,所以可以在第5步及以后的每一步进行胜负的判定。 

        

        棋盘的效果如图。 

        三子棋的胜负就这8种情况,虽然str数组开始被我全部赋值为' '(空格),但是这里绝对要对该三连珠进行判定,保证其不为空格,如果没有这个判定,则在实际游戏过程中,当你实际连成的三连珠的判定在一个空的三连珠的判定后面时,程序无法判定胜负。

         这是一次游戏的截图。

        以下为源码:

#include <stdio.h>
int mune()
{
    printf("------------------------\n");
    printf("     欢迎来到三子棋     \n");
    printf("       1.开始游戏       \n");
    printf("       2.退出游戏       \n");
    printf("------------------------\n");
    choice:
    while(1)
    {
        int control;
        scanf("%d",&control);
        switch(control)
        {
            case 1:return 1;
            case 2:return 2;
            default:printf("输出错误,请重新输入\n");
        }
    }
}
void game()
{
    char str[3][3]={0};
    int p=' ';
    int i,j,k;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            str[i][j]=' ';
    for(k=1;k<=9;k++)
    {
        system("cls");
        printf("轮到");
        if(k%2==1)
            printf("先手下\n");
        else
            printf("后手下\n");
        qipan(str);
        chongxia:
        printf("请输入要下的位置;");
        scanf("%d%d",&i,&j);
        if(str[i-1][j-1]!=' ')
        {
            printf("该位置已有棋子,请重下\n");goto chongxia;
        }
        if(k%2==1)
            str[i-1][j-1]='O';
        else
            str[i-1][j-1]='X';
        if(k>=5)
        {
            p=panding(str);
            if(p=='O')
            {
                system("cls");qipan(str);printf("先手胜,按回车键继续\n");getchar();getchar();return;
            }
            if(p=='X')
            {
                system("cls");qipan(str);printf("后手胜,按回车键继续\n");getchar();getchar();return;
            }
        }
    }
    printf("平局,按回车键继续\n");
    getchar();
    getchar();
}
void qipan(char str[3][3])
{
    printf("  -------------\n");
    printf("3 | %c | %c | %c |\n",str[2][0],str[2][1],str[2][2]);
    printf("  -------------\n");
    printf("2 | %c | %c | %c |\n",str[1][0],str[1][1],str[1][2]);
    printf("  -------------\n");
    printf("1 | %c | %c | %c |\n",str[0][0],str[0][1],str[0][2]);
    printf("  -------------\n");
    printf("    1   2   3  \n");
}
int panding(char str[3][3])
{
    if(str[0][0]==str[1][1]&&str[1][1]==str[2][2]&&str[1][1]!=' ')
        return str[1][1];
    if(str[0][2]==str[1][1]&&str[1][1]==str[2][0]&&str[1][1]!=' ')
        return str[1][1];
    if(str[0][1]==str[1][1]&&str[1][1]==str[2][1]&&str[1][1]!=' ')
        return str[1][1];
    if(str[1][0]==str[1][1]&&str[1][1]==str[2][1]&&str[1][1]!=' ')
        return str[1][1];
    if(str[0][0]==str[0][1]&&str[0][1]==str[0][2]&&str[0][0]!=' ')
        return str[0][1];
    if(str[0][0]==str[1][0]&&str[1][0]==str[2][0]&&str[0][0]!=' ')
        return str[1][0];
    if(str[2][2]==str[2][1]&&str[2][1]==str[2][0]&&str[2][2]!=' ')
        return str[2][1];
    if(str[2][2]==str[1][2]&&str[1][2]==str[0][2]&&str[2][2]!=' ')
        return str[1][2];
    return ' ';
}
int main()
{
    int control=0;
    while(1)
    {
        system("cls");
        control=mune();
        switch(control)
        {
            case 1:
            {
                game();
                break;
            }
            case 2:return 0;
        }
    }
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值