C语言小游戏——三子棋(二)

简介: 大家好,在介绍了之前的猜数字游戏后,大家是不是意犹未尽呢?为了锻炼大家的编程能力与培养大家的编程兴趣,今天小编给大家带来了更加有难度的小游戏——三子棋,希望大家跟着小编的思路,灵活应用,提高自己的编程水平。

2.4 电脑下棋

 电脑下棋就是对数组直接控制,只需要我们用随机数控制二维数组的行列就可以,对于随机数的产生我在猜数字游戏中有详细的介绍,随机数产生后我们需要判断随机数控制的的位置是否已经被输入,如果已经被输入,需要让系统再次产生随机数,代码如下


void computer_play(char broad[ROW][COL],int row,int col)
{  
  printf("电脑下棋\n"); 
    while(1)
  {
      int x=rand()%row;
   int y=rand()%col;
   if(x>=0&&x<row&&y>=0&&y<col)
   {
     if(broad[x][y]==' ')
     {
        broad[x][y]='#';
        break;
     }
      }
   }
}


现在给大家演示一下人机对弈的过程


image.png


这里我们看到玩家已经获胜,但是系统并没有提示接下来就需要我们编写下一个函数。


2.5 游戏输赢判断

 对于判断输赢函数的编写我们在游戏实现函数中用ret接收以进行判断,对于不同的结果我们返回不同的符号。


由于玩家输入的是” * “为了便于从数组中提取所以用 * 表示玩家已经获胜,同理用 #表示电脑获胜,游戏继续我们用 ‘ C ’表示,平局用‘ Q ’表示。


对于三子棋,我们主要从行,列,对角线是否三个成一条线判断,对于平局,只需要数组全部不是空格后仍然没有三个成一条线就成立,这里我们再用一个函数is_full()判断即可。下面就是判断输赢代码演示:


char is_win(char broad[ROW][COL],int row,int col)
{
  int i=0;
    for(i=0;i<row;i++)
    {
      if(broad[i][0]==broad[i][1]&&broad[i][1]==broad[i][2]&&broad[i][2]!=' ')
      {
      return broad[i][0];
  }
  }
    for(i=0;i<col;i++)
    {
      if(broad[0][i]==broad[1][i]&&broad[1][i]==broad[2][i]&&broad[2][i]!=' ')
      {
      return broad[0][i];
  }
  }
  if(broad[0][0]==broad[1][1]&&broad[1][1]==broad[2][2]&&broad[2][2]!=' '||
  broad[0][2]==broad[1][1]&&broad[1][1]==broad[2][0]&&broad[2][0]!=' ')
  {
  return broad[1][1];
  }
  if(is_full(broad,ROW,COL)==1)
  {
  return 'Q';
  }
  else 
     return 'C';
}


对于is_full()函数,代码如下:


int is_full(char broad[ROW][COL],int row,int col)
{
  int i=0;
  for(i=0;i<row;i++)
  {
  int j=0;
     for(j=0;j<col;j++)
     {   
      if(broad[i][j]==' ')
            return 0;
  }
  }
  return 1;
}

实现演示:


image.png


(还有两个结果大家可以自行演示,总代码在最下方)


   以上就是三子棋的所有板块的书写,为了让大家更好的进行对代码的观看和理解,下面我把所有代码整个在一起


总代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void mune()
{
  printf("*************************\n");
  printf("*******  1.play  ********\n");
  printf("*******  0.exit  ********\n");
  printf("*************************\n");
}
void init_broad(char broad[ROW][COL],int row,int col)
{
  int i=0;
  for(i=0;i<=row;i++)
  {
  int j=0;
     for(j=0;j<=col;j++)
     {
      broad[i][j]=' ';
  }
  }
}
void print_broad(char broad[ROW][COL],int row,int col)
{   int i=0;
  for(i=0;i<row;i++)
  {   int j=0;
     for(j=0;j<col;j++)
     {
  printf(" %c ",broad[i][j]);
  if(j<col-1)
     printf("|"); 
     }
     printf("\n");
  if(i<row-1)
   for(j=0;j<col;j++)
     {
      printf("___");
  if(j<col-1)
     printf("|"); 
     }
     printf("\n");
  }
}
void men_play(char broad[ROW][COL],int row,int col)
{   
    int x=0;
  int y=0;
  printf("玩家下棋\n"); 
  while(1)
  {
  printf("输入填入的坐标:\n");
  scanf("%d %d",&x,&y);
  if(x<1&&x>row&&y<1&&y>col)
  {
    printf("非法输\n");
  } 
  else
  {
    if(broad[x-1][y-1]==' ')
    {
    broad[x-1][y-1]='*';
    break;
       }
     }
    }
}
int is_full(char broad[ROW][COL],int row,int col)
{
  int i=0;
  for(i=0;i<row;i++)
  {
  int j=0;
     for(j=0;j<col;j++)
     {   
      if(broad[i][j]==' ')
            return 0;
  }
  }
  return 1;
}
void computer_play(char broad[ROW][COL],int row,int col)
{  
  printf("电脑下棋\n"); 
    while(1)
  {
      int x=rand()%row;
   int y=rand()%col;
   if(x>=0&&x<row&&y>=0&&y<col)
   {
     if(broad[x][y]==' ')
     {
        broad[x][y]='#';
        break;
     }
      }
   }
}
char is_win(char broad[ROW][COL],int row,int col)
{
  int i=0;
    for(i=0;i<row;i++)
    {
      if(broad[i][0]==broad[i][1]&&broad[i][1]==broad[i][2]&&broad[i][2]!=' ')
      {
      return broad[i][0];
  }
  }
    for(i=0;i<col;i++)
    {
      if(broad[0][i]==broad[1][i]&&broad[1][i]==broad[2][i]&&broad[2][i]!=' ')
      {
      return broad[0][i];
  }
  }
  if(broad[0][0]==broad[1][1]&&broad[1][1]==broad[2][2]&&broad[2][2]!=' '||
  broad[0][2]==broad[1][1]&&broad[1][1]==broad[2][0]&&broad[2][0]!=' ')
  {
  return broad[1][1];
  }
  if(is_full(broad,ROW,COL)==1)
  {
  return 'Q';
  }
  else 
     return 'C';
}
void game()
{
  char broad[3][3];
  srand(time(NULL));
  char ret=0;
  init_broad(broad,ROW,COL);
  print_broad(broad,ROW,COL);
  while(1)
  {   
  men_play(broad,ROW,COL);
  ret=is_win(broad,ROW,COL);
  if(ret!='C')
  {
    break;
  }
  computer_play(broad,ROW,COL);
  ret=is_win(broad,ROW,COL);
  print_broad(broad,ROW,COL);
  if(ret!='C')
  {
    break;
  }
    }  
  if(ret=='*')
    {
      printf("玩家获胜\n"); 
  }
  else if(ret=='#')
  {
  printf("电脑获胜\n"); 
  }
  else 
     printf("平局\n");
}
void text()
{
  int input=0;
  do 
  {
  mune(); 
  scanf("%d",&input); 
  switch(input)
  {
  case 1:
     {
     game();
     break;
           }
  case 0:
     {
     printf("退出游戏");
     break;
        }  
   default:
     printf("输入有误"); 
  } 
  }while(input);
}
int main()
{
  text();
  return 0;
}


相关文章
|
1月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
|
2月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
59 1
C语言——实现贪吃蛇小游戏
|
2月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
45 1
C 语言——实现扫雷小游戏
|
1月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
1月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
1月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
1月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
1月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
31 0
|
4月前
|
存储 编译器 C语言
|
4月前
|
存储 C语言
【C语言】猜数字小游戏
C语言实现猜数字小游戏
45 2
【C语言】猜数字小游戏