纯c语言实现三子棋玩法(分别有,与电脑对战,与玩家2对战)

该文章是一个C语言程序,用于实现一个简单的三子棋游戏。程序包括创建和初始化棋盘、打印棋盘、玩家和电脑轮流落子,以及判断游戏结果(玩家胜利、电脑胜利或和棋)。代码中包含了不同级别的棋盘打印方法,并有对玩家输入的坐标合法性检查。然而,电脑玩家的落子功能尚未完全实现,存在死循环的问题。

//自己敲一个
//思路
//一、问题描述
//二、基本流程
//三、步骤
//1.菜单界面
//2.创建棋盘
//3.棋盘初始化
//4.打印棋盘
//(1)简陋方法:
//(2)美观方法:
//5.玩家落子
//6.电脑落子
//7.判断胜负
//四、结果演示
//1.玩家胜利
//2.电脑胜利
//3.和棋 
#include<stdio.h>
#define ROW 3
#define COL 3//在这里弄方便后期改变 
#include<stdlib.h>//rand的头文件 
#include<time.h>//time头文件 
//放在主函数的上头 
void chushihua(char qipan[ROW][COL],int row,int col)
//不理解在这个形参这里居然定义会出现相同变量导致错误 
{
    //目的实现三子棋的九方格全为空的格式
    int i=0,j=0;
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            qipan[i][j]=' ';//放入空格 
        }
     } 
}
void dayinqp(char qipan[ROW][COL],int row,int col)
{
    int i=0,j=0;
    //1.粗略的空棋盘 
    /*printf("+----+----+----+\n");
    for(i=0;i<row;i++)
    {
        //printf("+----+----+----+\n");
        printf("|    |    |    |\n");
        printf("+----+----+----+\n");
        */
        /*for(j=0;j<col-1;j++)
        {
            printf("+----+----+----+\n");
            printf("| %c | %c | %c |\n",qipan[i][j]);
            printf("+----+----+----+\n");
        }
    
    }*/
        /*//2.有点手法的棋盘
            printf("+---+---+---+\n");
        for(i=0;i<row;i++)
        {
            printf("| %c | %c | %c |\n",qipan[i][0],qipan[i][1],qipan[i][2]);
            printf("+---+---+---+\n");
         } 
         //这个写法的话,如果改变行和列,打印出来的列依然不会改变只能改变行,因为上面%c已经固定了;
         */
         //3.继续优化写法 
         //思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行 
             //printf("+---+---+---+\n");
         //这个算法可以实现格式各样的格子了 
         for(j=0;j<col;j++)//这个在首行弄封闭 
                 {
                     if(j==0)
                     printf("|");
                 
                     printf("---");
                     if(j<col) 
                         printf("+");
                     }
        printf("\n");
         for(i=0;i<row;i++)
         {
             
             
             for(j=0;j<col;j++)
             
             {
                 if(j==0)//在前面来一个竖线封
                     printf("|");
                 //打印一行的数据 
                 
                 printf(" %c ",qipan[i][j]);
                 if(j<col)
                 printf("|"); 
                 
                 
             }
             printf("\n");
             
             if(i<row)
             {
                 for(j=0;j<col;j++)
                 {
                     if(j==0)//前面打印 |封闭 
                         printf("|");    
                     
                 
                     printf("---");
                     if(j<col) 
                         printf("+");
                     
                 
                 }
                 printf("\n");
             }
             
             
          } 
         
}
//玩家落棋 
void wanjia(char qipan[ROW][COL],int row,int col)
{
    //1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
    //2.也得考虑 那个位置是否已经下了 
    int y=0,x=0;
    while(1)
    {
        //printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
        //printf("请输入你要落棋的位置:(横纵坐标)\n");
        printf("玩家1出手\n");
         scanf("%d%d",&x,&y);
    
         if(x>=1&&x<=row && y>=1&&y<=col)//在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入 
     {
         //判断这个位置是否为空 
         if(qipan[x-1][y-1]==' ')//在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
        {
            qipan[x-1][y-1]='*'; 
            break;
          }  
         else
         {
             printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
         }
         
     }
     else
     printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
    }
    
}
//int  diannao(char qipan[ROW][COL],int row,int col)
/*void  diannao(char qipan[ROW][COL],int row,int col)
{
    int x=0;
    int y=0;
    //x=rand()%row;//磨横纵保证范围在0到2的范围 
    //y=rand()%col; 
    //这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
    while(1)
    {
          //我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对 
          x=rand()%row;//磨横纵保证范围在0到2的范围 
        y=rand()%col; 
        //printf("ok\n");//这个拿来调试看看哪步有问题 
        if(qipan[x][y]==' ')//在这里因为是电脑操作不需要人为因此不用设置x-1形式 
            {
                qipan[x][y]='o'; 
                //printf("ok\n");
                break;
                //continue;
              }  
    }
    //printf("ok\n");
    
}*/
//玩家2落棋 
void wanjia2(char qipan[ROW][COL],int row,int col)
{
    //1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
    //2.也得考虑 那个位置是否已经下了 
    int y=0,x=0;
    while(1)
    {
        //printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
        //printf("请输入你要落棋的位置:(横纵坐标)\n");
         scanf("%d%d",&x,&y);
    
         if(x>=1&&x<=row && y>=1&&y<=col)//在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入 
     {
         //判断这个位置是否为空 
         if(qipan[x-1][y-1]==' ')//在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
        {
            qipan[x-1][y-1]='o'; 
            break;
          }  
         else
         {
             printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
         }
         
     }
     else
     printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
    }
    
}
int pingju(char qipan[ROW][COL],int row,int col)
{
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            if(qipan[i][j]==' ')
                return 0;
            
        }
     } 
     return 1;
}
char jieju(char qipan[ROW][COL],int row,int col)
{
    //赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
     int i=0;
     for(i=0;i<row;i++)//判断三行 
     {
         if(qipan[i][0]==qipan[i][1] && qipan[i][1]==qipan[i][2] && qipan[i][0]!=' ')
         {
             return qipan[i][1];
         }
      } 
      
      for(i=0;i<row;i++)//判断竖三列 
     {
         if(qipan[0][i]==qipan[1][i] && qipan[1][i]==qipan[2][i] && qipan[1][i]!=' ')
         {
             return qipan[1][i];
         }
      } 
      //两个对角线 
      if(qipan[0][0]==qipan[1][1] && qipan[1][1]==qipan[2][2] && qipan[2][2]!=' ') 
              return qipan[1][1];
      if(qipan[2][0]==qipan[1][1] && qipan[1][1]==qipan[0][2] && qipan[0][2]!=' ') 
              return qipan[1][1];
    //判断平局
    int a=pingju(qipan,ROW,COL);
    if(a==1)
    {
        return 'p';
    }
     
    
    
}
void game()
{
    //开始弄棋盘,九宫格的样式,二维数组便于填坐标
    printf("2.创建棋盘\n");
    char qipan[ROW][COL]={0};//rou行坐标,col纵坐标
    printf("3.初始化棋盘\n");
    chushihua(qipan,ROW,COL);
    printf("4.打印棋盘\n");
    dayinqp(qipan,ROW,COL); 
    printf("5.阿祥落棋\n");
    printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
    printf("请输入你要落棋的位置:(横纵坐标)\n");
    srand((unsigned int)time(0)); //这里不太明白还有加s 
    char kun;
    while(1)
    {
        
        //system("cls");    
        wanjia(qipan,ROW,COL); 
        //打印一下现在棋盘的情况;
        printf("目前棋盘的情况如下表:\n") ;
        dayinqp(qipan,ROW,COL); 
        //判断输赢平,继续
        kun=jieju(qipan,ROW,COL) ;
        printf("%c\n",kun);
        //printf("赢 'y'平'p'继续'j'\n");
        
        if(kun=='*')
            break;
        if(kun=='p')
            break;
        
        //电脑落子,我感觉要用到库函数实现随机填充
        //printf("电脑仔出手\n"); 
        printf("玩家2出手\n"); 
        //目前剩四个空格电脑就会死; 
        //diannao(qipan,ROW,COL);//死在这里 
        //printf("11\n"); 
        wanjia2(qipan,ROW,COL);
        dayinqp(qipan,ROW,COL);
        //判断输赢平,继续,每一步都得判断 
        kun=jieju(qipan,ROW,COL);
        if(kun=='o')
            break;
        if(kun=='p')
            break;
         
        
    }
    if(kun=='*')
        printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
    if(kun=='o')
        //printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
        printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
    if(kun=='p')
         printf("恭喜,你两平手\n");
    
     
     
 } 
void caidan()
{
    printf("1.菜单界面实现\n");
    printf("******************************\n");
    printf("********输入1进入游戏*********\n");
    printf("********输入0退出游戏*********\n");
    printf("********输入其他奖励再来亿次**\n");
    printf("******************************\n");
    printf("请作出你的选择\n");
    //printf("2.创建棋盘\n");
    
    
    //chushihua(choose);
}
void zongxt()
{
    //do..while 好处是必执行一次,也就是有一次选择;
    int choose=1,i=0;//在这里choose需要放在do..while上头,不然无法识别 
    do
    {
        caidan();
         
        //在这里设计一个选择只能0和1其他错误重新选择的情况; 
        /*for( i=0; ;i++)
        {
            scanf("%d",&choose);
            if(choose==0)
            {
                printf("已退出游戏\n");
                break;
                //在这里输入0的话就会结束循环; 
            }
            
            if(choose==1)
            {
                printf("成功进入游戏\n");
                break;
            }
                
            if(choose!=0||choose!=1)//或,有一个成立即可,但凡输入的不为0和1就错误
             {
                 printf("输入错误请重新输入:\n"); 
             }
            
            
        }*/
        //我用switch实现 
        
        scanf("%d",&choose);
        switch(choose)
        {
            
            case 1:
                printf("成功进入游戏\n");
                game();//开始进入游戏板块 
                break;
            case 0:
                printf("已退出游戏\n");
                break;
            default :
                printf("输入错误,请重新输入,谢谢配合,不然你自己看着办\n");
                 break;
        }
        
        
    }
    while(choose);//这里需要分号 
}

int main()
{
    printf("阿祥玩三子棋\n");
    zongxt(); 
    printf("阿祥敲完历时两年半\n");
    //问题1.电脑玩家死循环,死在电脑玩家函数里面 ,在diannao函数已经解释明白了 
        //2.结果出不来,这个第一个问题解决这个也可以了 
        //3.只能是我赢,无法弄好电脑赢的情况,修改 
    //想法1.双人对战 
        //2.改为五子棋或者四子棋 
    //system("pause");
    return 0;
 } 

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化数据处理的自动化,以提升日常教学管理工作的效率准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值