C语言实现三子棋(胎教版教学)由浅入深(下)

简介: C语言实现三子棋(胎教版教学)由浅入深(下)

3、玩家下棋函数的实现

这边接收的是玩家输入的坐标 一般是1 开始 到 3

但是数组下标是从0开始所以把每次玩家输入的行和列 - 1 就好了

//玩家下棋
int  PlayMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋");
  printf("请输入坐标,中间用空格隔开 ->");
  scanf("%d %d",&x,&y);
  //检查坐标是否合法
  if (x >= 1 && y >= 1 && x <= row  && y <= col )
  {
    if (board[x - 1][y - 1] == ' ')
    {
       board[x - 1][y - 1] = '*';
    }
    else
    {
      printf("坐标被占用请重新输入!\n");
      return 'P';
    }
  }
  else
  {
    printf("输入错误请重新输入!\n");
    return 'P';
  }
}

4、电脑下棋函数的实现

我们让电脑每次产生随机数坐标 产生行和列 来下棋

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
  //随机下棋
  int x = 0;
  int y = 0;
  printf("电脑下棋:>\n");
  while (1)
  {
    x = rand() % row;//产生的随机数模除我们需要的行 产生的数就在行0~3之内了
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}

5、判断输赢函数的实现

//玩家赢返回 *
//电脑赢返回 #
//平局返回   Q
//继续返回   C
char IsWin(char board[ROW][COL], int row, int col)
{
  int i = 0;  
  for (i = 0; i < row; i++)
  { 
    //判断行
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    {
      return board[i][0];
    }
    //判断列
    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][i];
    }   
  }
  //判断对角线
  if (board[0][0] == board[1][1] && board[1][1] ==  board[2][2] && board[1][1] != ' ')
    return board[1][1];
  //判断对角线
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    return board[1][1];
  //判断平局
  if (IsFull(board, row, col) == 1)
  {
    return 'Q';
  }
  else 
  {
    return 'C';
  }
  //继续 C
}

6、判断平局函数的实现

遍历一遍数组当数组里面存放的没有空格就说明棋盘满了 平局

//平局
int IsFull(char board[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 (board[i][j] == ' ')
      {
        return 0;
      }
    }
  }
  return 1;
}

整体代码如下:

test.c代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
// 菜单
void menu()
{
  printf("************************\n");
  printf("*******  1.play  *******\n");
  printf("*******  0.exit  *******\n");
  printf("************************\n");
}
//三子棋游戏
void game()
{
  char board[ROW][COL] = {0};
  //初始化数组
  InitBoard(board, ROW, COL);
  char ret = 0;
  char play = 0;
  //打印棋盘
   DisplayBoard(board, ROW, COL);
  while (1)
  {
    //玩家下棋
    play = PlayMove(board, ROW, COL);
    if (play == 'P')
      continue;
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      system("cls");
      //打印棋盘
      DisplayBoard(board, ROW, COL);    
      break;
    }   
    //打印棋盘
    DisplayBoard(board, ROW, COL);
    //电脑下棋
    ComputerMove(board, ROW, COL);
    system("cls");
    //打印棋盘
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    { 
      system("cls");
      //打印棋盘
      DisplayBoard(board, ROW, COL);
      break;
    }
  }
  if (ret == '*')
  {
    printf("玩家赢!\n");
  }
  else if (ret == '#')
  {
    printf("电脑赢!\n");
  }
  else 
  {
    printf("平局!\n");
  }
}
int main()
{
  int input = 0;  
  do
  {   
    srand((unsigned int)time(NULL));
    //打印菜单
    menu();
    printf("请输入你的选择 >");
    scanf("%d",&input);
    switch (input)
    {
      //开始游戏
    case 1:
      game();
      break; 
      //退出游戏
    case 0: 
      printf("退出游戏!");
      break;
    default:
      printf("输入错误,请重新输入!");
      break;
    }
  } while (input);
  return 0;
}

game.h代码

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
//初始化数组
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
int PlayMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//平局
int  IsFull(char board[ROW][COL], int row, int col);

game.c代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化数组 
void InitBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      board[i][j] = ' ';
    }
  }
}
//打印棋盘
void DisplayBoard(char board[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 ",board[i][j]);
      if(j < col-1)
        printf("|");
    }
    printf("\n");
    for (j = 0; j < col; j++)
    {
      printf("---");
      if (j < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
  }
}
//玩家下棋
int  PlayMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋");
  printf("请输入坐标,中间用空格隔开 ->");
  scanf("%d %d",&x,&y);
  //检查坐标是否合法
  if (x >= 1 && y >= 1 && x <= row  && y <= col )
  {
    if (board[x - 1][y - 1] == ' ')
    {
       board[x - 1][y - 1] = '*';
    }
    else
    {
      printf("坐标被占用请重新输入!\n");
      return 'P';
    }
  }
  else
  {
    printf("输入错误请重新输入!\n");
    return 'P';
  }
}
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
  //随机下棋
  int x = 0;
  int y = 0;
  printf("电脑下棋:>\n");
  while (1)
  {
    x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}
//玩家赢 *
//电脑赢 #
//平局   Q
//继续   C
char IsWin(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  { 
    //判断行
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    {
      return board[i][0];
    }
    //判断列
    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][i];
    }
  }
  //判断对角线
  if (board[0][0] == board[1][1] && board[1][1] ==  board[2][2] && board[1][1] != ' ')
    return board[1][1];
  //判断对角线
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    return board[1][1];
  //判断平局
  if (IsFull(board, row, col) == 1)
  {
    return 'Q';
  }
  else 
  {
    return 'C';
  }
  //继续 C
}
//平局
int IsFull(char board[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 (board[i][j] == ' ')
      {
        return 0;
      }
    }
  }
  return 1;
}
目录
相关文章
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
51 19
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
77 18
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
57 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
71 10
|
1月前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
40 10
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2

热门文章

最新文章

相关实验场景

更多