奇妙的三子棋之旅

用C语言实现三子棋游戏,不论人或者电脑哪一方连成一条直线就算是赢

       相信大家小时候都玩过三子棋游戏,双方只要连成一条线就算是赢,那仫如何用C语言去实现这个小游戏呢?

    一. 拿到这样的一道题如何去分析呢?这才是我们要关心的问题,三子棋首先需要一定的棋盘可是如何去实现并打印这样的棋盘呢?C语言的二维数组为我们提供了极好的解决方法,用一个for循环控制语句就可以打印出相应的棋盘了。下面我们先来实现打印棋盘的部分功能:

      

void print_chess()
{
  int i=0;
  for(i=0;i<3;i++)
  {
    printf("_%c_|_%c_|_%c_\n",arr[i][0],arr[i][1],arr[i][2]);
  }
}

     二. 接下来的问题就是人如何输入自己要走的步数了?首先要对人输入的下标进行判断,在我的游戏中我设置的人输入的下标为0,1,2,如果正确就将对应位置赋成#号,代表人已经输入正确;如果输入下标不满足0,1,2就再次调用player()函数,重新输入下标直到输入正确的数组下标。下面我们就来实现人下棋的部分功能:

      

void player()
{
  printf("请输入你要走的坐标行号和列号:\n");
  scanf("%d %d",&x,&y);
  if((x<0 || x>=3 || y<0 || y>=3) && arr[x][y] != 0)
  {
    printf("请重新输入\n");
    player();
  }
  else
  {
    arr[x][y]='#';
    sz--;
  }
}


        三.然后就是电脑如何输入自己要走的步数,在我的游戏设置里使用了随机数来产生电脑所对应的数组下标,同样需要对下标进行一定的控制只有当该下标对应的数组中没有元素的时候电脑才可以输入对应的符号@,在程序中使用了do{}while循环,每当电脑或者人输入对应的符号时sz(数组初始长度)就减一,以便于判断当数组是否还有空位置的情况。下面我们就来实现电脑下棋的部分结果:

       

void comper()
{
  do
  {
    srand((unsigned)time(NULL));
    x=rand()%3;
    y=rand()%3;
  }while (arr[x][y] != 0);
  sz--;
  arr[x][y] = '@';
}

 

    四. 接下来就是如何判断游戏的结果了了,很明显可能会出现三种情况:1.当sz(数组初始长度)减为0时说明没有空位置了,当然游戏就可以结束了,此时是平局;2.当横着三行,竖着三行或者交叉两行连成一条直线的时候游戏也可以结束,如果对应符号时#则玩家赢否则是电脑赢。

       

char winner()
{
  int i=0;
  for(i=0;i<3;i++)
  {
    if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != 0)
    {
      return arr[i][0];
    }
  }
  for(i=0;i<3;i++)
  {
    if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != 0)
    {
      return arr[2][i];
    }
  }
  if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != 0)
  {
    return arr[0][0];
  }
  if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != 0 )
  {
    return arr[0][2];
  }
  if(sz == 0)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}


       五. 最后当然就是主函数如何去调用这些函数啦!用w来接收判断输赢函数的返回值,由上面判断可知,当返回值为0时说明数组中还存在空位置,可以进入循环,即分别调用print_chess()函数,player()函数,只有当sz不为0说明存在空位置则可以再次调用comper()函数和winner(),至此游戏就可以结束了。


    在这里附上程序源代码,方便理解:

    

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LINE 3
#define MAX 3
char arr[LINE][MAX]={0};
int sz=sizeof(arr)/sizeof(arr[0][0]);
int x=0;
int y=0;

void print_chess()
{
  int i=0;
  for(i=0;i<3;i++)
  {
    printf("_%c_|_%c_|_%c_\n",arr[i][0],arr[i][1],arr[i][2]);
  }
}

void player()
{
  printf("请输入你要走的坐标行号和列号:\n");
  scanf("%d %d",&x,&y);
  if((x<0 || x>=3 || y<0 || y>=3) && arr[x][y] != 0)
  {
    printf("请重新输入\n");
    player();
  }
  else
  {
    arr[x][y]='#';
    sz--;
  }
}

void comper()
{
  do
  {
    srand((unsigned)time(NULL));
    x=rand()%3;
    y=rand()%3;
  }while (arr[x][y] != 0);
  sz--;
  arr[x][y] = '@';
}

char winner()
{
  int i=0;
  for(i=0;i<3;i++)
  {
    if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != 0)
    {
      return arr[i][0];
    }
  }
  for(i=0;i<3;i++)
  {
    if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != 0)
    {
      return arr[2][i];
    }
  }
  if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != 0)
  {
    return arr[0][0];
  }
  if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != 0 )
  {
    return arr[0][2];
  }
  if(sz == 0)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

int main()
{
  int i=0;
  char w = 0;
  while (w == 0)
  {

    print_chess();
    player();
    if (sz != 0) 
 {
  comper();
        w=winner();
 }
  }

  print_chess();
  if(w == '#')
  {
    printf("玩家赢\n");
  }
  else if (w == 1)
  {
    printf("平局\n");
  }
  else
  {
    printf("电脑赢\n");
  }
  system("pause");
}

    那仫这个游戏是不是能达到我们预期的效果呢?下面我们就来看一组下棋的示例:

   

   看到这里千万不要以为只有人可以赢,电脑也是可以赢得呢!

  

     在这个游戏中电脑下棋使用的是用时间生成的种子,其实存在一定的缺陷,如果程序没有运行到你要指定的程序部分,那仫你就需要等待一定的时间才能生成随机数。

     


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值