分享我的#C语言学习之路

家人们,进击的菜鸟又学到一个三子棋游戏,很好玩;不要被代码的数量所困惑,一个算法一个算法的实现,真的不是很难,虽然当代码出错的时候会有崩溃的感觉,但是代码运行成功后,还是非常有成就感的。非常建议从主函数出发,然后根据函数调用的顺序找思路。

整体思路是:游戏菜单选择——>数组初始化——>打印棋盘——>玩家下棋,电脑下棋——>判断输赢情况

#define _CRT_SECURE_NO_WARNINGS 1
//定义行数和列数
#define R 3
#define C 3
#include <time.h>//time函数
#include <stdlib.h>//srand函数
#include <stdio.h>


//不管开始输入的值是什么,都会给棋盘初始化
void Initboard(char board[R][C],int r, int c)
{
    int i=0;
    int j=0;
    { for(i=0;i<r;i++)
        for(j=0;j<c;j++)
        {    
            board[i][j]=' ';
        }
    }

}

//前后空格,中间数据           |   |   
//打印---|                 ---|---|---
//打印---|                 ---|---|---
//前后空格,中间数据           |   |
void dayinboard(char board[R][C],int m,int n)
{
    int i=0;
    int j=0;
    for(i=0;i<m;i++)
      {   
          //打印空里面的数据加右边的"|"
          for(j=0;j<n;j++)
            {printf(" %c ",board[i][j]);
             if(j<n-1)//表示不要最后一列的"|"
             printf("|");}
      printf("\n");//表示打印一行就换行
      if(i<m-1)//最后一行不用打印"---"
      {
          //打印"---|"
          for(j=0;j<n;j++)
        {  printf("---");
          if(j<n-1)//表示不要最后一列的"|"
          printf("|");
      }}
      printf("\n"); //打印完一行就换行;
    }
}

//玩家下子;
void playmove(char board[R][C],int o,int p)
{
    int x,y;
    printf("玩家走:>\n");
    while(1)
    {
    printf("请输入要下的坐标: > ");
    scanf("%d%d",&x,&y);
    //判断x,y坐标的合法性;玩家下意识的认为第一个格子的坐标为(1,1),而实际的数组坐标为(0,0)
    if(x>=1&&x<=o && y>=1&&y<=p)
       {
        if(board[x-1][y-1]==' ')
         {board[x-1][y-1]='*';
             break;
         }
        else
            printf("该坐标已被占用\n");
        }
    else
       {
        printf("没有此坐标,请重新输入\n");
        }
    }
}


//电脑随机下子;
void computermove(char board[R][C],int d,int e )
{
    //电脑随机走 
    int x,y;
    printf("电脑走:>\n");
    while(1)
    {
        x=rand()%d;//随机坐标的行;
        y=rand()%e;//随机坐标的列;
        if(board[x][y]==' ')
        {board[x][y]='#';
         break;}
    }
}

//返回1表示棋盘满了;
int full(char board[R][C],int m,int n)
{
    int x,y;
    for(x=0;x<m;x++)
    {
       for(y=0;y<n;y++)
        {if(board[x][y]==' ')
           {return 0;}//没有满

        }
    }
    return 1;//满了
}


//判断输赢的情况,'*'代表玩家赢了,'#'代表电脑赢了,'P'代表平局,'G'表示继续游戏;
char win(char board[R][C],int f,int i)
{
    int j=0;
    int k=0;
    //行有三个一样的棋子
    for(j=0;j<f;j++)
        {if(board[j][0]==board[j][1] && board[j][1]==board[j][2] && board[j][1] !=' ')
           {    return board[j][0];}
        }
    //列有三个一样的棋子
    for(k=0;k<i;k++)
    {
       if(board[0][k]=board[1][k] && board[1][k]==board[2][k] && board[1][k]!=' ')
           {return board[0][k];}
    }
    //两个对角线
    if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board [1][1] !=' ')
    {return board[1][1];}
    if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ')
    {return board[1][1];}
    //判断是否平局
    if(full(board,R,C)==1)
    {    return 'P';}
    return 'G';
}


//显示游戏菜单界面
void mune()
{
  printf("*************************\n");
  printf("****** 1.play 0.exit*****\n");
  printf("*************************\n");
}
void game()

    char ret=0;
    char board[R][C]={0};//数组存放走出的棋盘信息,然后初始赋值为0;
    Initboard( board, R , C);//初始化棋盘;
    dayinboard( board,R ,C);//打印棋盘;
    while(1)//下棋
    {
    //玩家下棋
    playmove(board,R ,C);
    dayinboard(board,R ,C);//打印棋盘;
    ret= win(board,R,C);//判断玩家是否赢
    if(ret !='G')
    {
       break;
    }
    //电脑下棋
    computermove(board,R,C);//传行和列,生成随机数下表时控制它的范围
    dayinboard(board,R ,C);//打印棋盘;
    ret=win(board,R,C);//判断电脑是否赢
    if(ret !='G')
      {
       break;
      }
    }
    if(ret=='*')
    {printf("玩家赢\n");}
    else if(ret=='#')
    {printf("电脑赢\n");}
    else
        {printf("平局\n");}
}

void xuanze()//游戏选择
{
    int input=0;
    srand((unsigned int) time (NULL));//time函数的参数给空指针,然后将返回类型强制转换成整型;
    do
   { 
       mune();
       printf("请选择: >");
       scanf("%d",&input);
       switch(input)
       {
       case 1:
           {printf("请开始游戏\n");
           game();
           break;}
       case 0:
           {printf("退出游戏\n");
           break;}
       default:
           {printf("选择错误,请重新选择\n");
           break;}
       }
   }
   while(input);
}

//主函数以上都是函数调用;
int main()
{
    xuanze();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fighting787

一起加油,一起成功!

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

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

打赏作者

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

抵扣说明:

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

余额充值