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;
}


相关文章
|
16天前
|
C语言
【C语言】猜数字小游戏的一步一步实现2
【C语言】猜数字小游戏的一步一步实现
|
21天前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
30 1
|
22天前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
1月前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
12 0
|
1月前
|
程序员 C语言
C语言设计三子棋
C语言设计三子棋
|
2月前
|
C语言
C语言之实现贪吃蛇小游戏篇(2)
C语言之实现贪吃蛇小游戏篇(2)
20 1
|
1月前
|
算法 编译器 C语言
C语言猜数字小游戏(也包含python实现的用法)
本文基于VS2022、pycharm和前面的知识,写一个凭借分支与循环的小游戏,比如: 写一个猜数字游戏 游戏要求: 电脑自动生成1~100的随机数 玩家猜数字,猜数的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束 在pyhton中生成随机数是比较简单的,可以直接导入random的包,直接生成随机数,导致写猜数字小游戏变成了判读语句和循环语句嵌套就能写出来,所以我不做过多的介绍了,可以直接看后面的代码展示,想了解更多的python可看python的基础知识,这里面有我在学习python的过程中写的笔记
30 0
|
8天前
|
C语言
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
|
1月前
|
C语言
三子棋c语言讲解
三子棋c语言讲解
|
1月前
|
存储 定位技术 C语言
基于C语言实现扫雷小游戏
本文介绍了使用C语言实现扫雷小游戏的过程。扫雷是一款经典的单机游戏,玩家需要通过点击方格来揭示数字或地雷,最终清除所有非地雷方格。实现过程中,首先定义了游戏所需的数据结构,如游戏地图、玩家信息等。然后,实现了游戏的初始化、渲染、输入处理等核心功能。在游戏逻辑方面,处理了点击事件、数字计算和胜负判断等。通过不断优化和完善,最终完成了基于C语言的扫雷小游戏实现,为玩家提供了一种简单有趣的游戏体验。
25 0