C语言实现三子棋

简介: 笔记

1.文件的创建


创建俩个源文件,一个头文件

1.png

game.h存放游戏内容所引用到的自定义函数


game.c存放游戏部分内容


test.c 存放调试部分内容


2.用户选择界面的实现


1.菜单创建

2.png

#include<stdio.h>
void menu()
{
  printf("******************\n");
  printf("*****1.play*******\n");
  printf("*****0.exit*******\n");
  printf("******************\n");
}
int main()
{
  menu();
  return 0;
}

2.用户输入选择

3.png

int main()
{
  menu();
  printf("请用户进行选择:");
  int x;
  do {
  scanf("%d", &x);
  switch (x)
  {
  case 1:
    printf("进入游戏");
    game();
    break;
  case 0:
    printf("退出游戏");
    break;
  default:
    printf("请重新输入");
    break;
  }
  } while (x);
  return 0;
}


2.棋盘格的建立


此处建立一个9宫格棋盘,所以要用到3x3的二维数组。

4.png

棋盘长这样


先在game.h头文件里面定义一下,棋盘的横行和纵列,声明创建棋盘格函数Itnboard

5.png

这里的ROW表示横行 ,COL表示纵列。

6.png

创建二维数组,并对二维数组传参,将棋盘格传入Itnboard函数,此函数为创建棋盘格

7.png

在test.c引用game.h的头文件


接下来便是编辑创建棋盘格的函数,这里我们在前面所创建的game.c文件编辑,test.c文件用于测试,分开写比较好,不然代码多而乱。8.png

#include"game.h"
void Itnboard(char board[ROW][COL], int row, int col)
{
  int i, j;
  for (i = 0; i < row; i++)
  {
  for (j = 0; j < col; j++)
  {
    board[i][j] = ' ';
  }
  }
}

现在game.c里面引用game.h的头文件,再把Itnboard函数进行传参,返回值为空。


这里先遍历二维数组,让每个值都为空格。

9.png

因为最先要创建一个空棋盘所以,这里得用空格,遍历完之后就是棋盘格的打印了即大家看到的这些条条框框,我们要打印出来


3.打印棋盘格


打印之前先说一下我们的思路

10.png

为了更清晰,我把空隙做大一些,下面这些——单独做一行,及所谓的分隔符


先定义一个打印棋盘的函数,名字随便取,自己能理解来就好我用的是Printboard,


在game.h定义此函数,返回值为空,再在test.c引用此函数,在game.c编辑此函数

11.png

12.png13.png

接下来编辑打印棋盘的函数


如何编辑?先说想法

14.png

第一行打印为 空格board[i][j]空格|空格board[i][j]空格|空格board[i][j]空格|


                     即 board[i][j] | board[i][j] | board[i][j]


board[i][j]表示我们待会要下的棋子,我们之前把棋子赋值为了空格,可看上一步15.png

void Printboard(char board[ROW][COL], int row, int col)
{
  int i, j;
  for (i = 0; i < row; i++)
  {
  for (j = 0; j < col; j++)
  {
    printf(" %c ",board[i][j]);
    if (j < col - 1)
    {
    printf("|");
    }
  }
  printf("\n");
  for (j = 0; j < col; j++)
  {
    if (j < col - 1)
    {
    printf("---|");
    }
    else
    printf("---");
  }
  printf("\n");
  }
}


代码讲解


空格用‘-’代替 board[i][j]用X代替


先打印

16.png

代码段


void Printboard(char board[ROW][COL], int row, int col)
{
  int i, j;
  for (i = 0; i < row; i++)
  {
  for (j = 0; j < col; j++)
  {
    printf(" %c ",board[i][j]);
    if (j < col - 1)
    {
    printf("|");
    }
  }
  printf("\n");

第一行打印完之后换行


打印第二行19.png

for (j = 0; j < col; j++)
  {
    if (j < col - 1)
    {
    printf("---|");
    }
    else
    printf("---");
  }
  printf("\n");

打印完之后换行,注意:竖杠即|只在第一二列结尾出现


成果:

20.png

棋盘格打印完成,打印完之后就可以开始下棋咯!


4.开始下棋


玩家先走第一步


4.1.玩家下棋

接下来我们编写玩家下棋代码


还是在game.h 声明,在game.c编写,在test.c引用

21.png

下棋范围为1-3,x-1表示若x等于1,则在函数中对应第二个位置,但玩家并不知道那是第二个位置,所以要减1,让玩家输入几 就在第几个位置出现

void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家请下棋:");
  while (1)
  {
  scanf("%d%d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)
  {
    if (board[x - 1][y - 1] == ' ')
    {
    board[x - 1][y - 1] = '*';
    break;
    }
    else
    printf("该位置已有棋,请重下:\n");
  }
  else
    printf("坐标错误,请重新输入:\n");
  }
}


玩家下完棋后打印一下棋盘,要打印棋盘,看效果

22.png

若输入棋盘外的数字,会一直进入循环直到输入正确的坐标。所以用while循环,找到正确坐标后用break语句跳出

23.png

人下完棋,接着该电脑走了


4.2电脑下棋

接下来我们编写电脑下棋代码


还是在game.h 声明,在game.c编写,在test.c引用

void ComputerMove(char board[ROW][COL], int row, int col)
{
  int x;
  int y;
  x = rand() % 3;
  y = rand() % 3;
  printf("电脑下棋\n");
  while (1)
  {
  if (board[x][y] == ' ')
  {
    board[x][y] = '#';
    break;
  }
  }
}


电脑下棋为随机数生成,但是棋盘格子为1-3,为了确保电脑下的棋在1-3,我们对生成的随机数进行对3取余的操作,这杨电脑才能把棋下在棋盘里。


随机数以时间为标准应用time.h头文件

25.png

电脑下完棋后,我们对棋盘格进行打印,由于下棋可能只是下一颗棋子就结束了,所以用while循环,当不满足条件时退出


接下来就是满足什么条件是退出


4.3输赢条件判断

还是在game.h 声明,在game.c编写,在test.c引用


函数名为Iswin,类型为char

26.png

输赢三种情况:某一行全为一种相同棋子,


某一列全为一种相同棋子,主对角线或次对角线全为一颗相同棋子,


但是也有可能平局,这里IsFull为判断是否平局


27.png

int IsFull(char board[ROW][COL], int row, int col)
{
  int i; int  j;
  for (i = 0; i < row; i++)
  {
  for (j = 0; j < row; j++)
  {
    if (board[i][j] == ' ') //如果这个格子是空的,则返回1
    return 1;
  }
  }
  return 0;// 遍历完之后如果没有空格子,则返回0

IsFull函数为int类型 但是在Iswin函数里使用 Iswin又是char类型


所以我们要用一个变量来接收IsFull的返回值,并把它在Iswin函数里返回为char类型

28.png

这里用k来接收,返回值为char类型


若返回C则代表格子还没满,若返回Q,则代表格子满了

29.png

返回之后要去判断,如果返回的值不等于C,则代表格子满了,跳出while循环,否则,继续while循环


这里有三种情况跳出while循环


玩家赢 返回 *     电脑赢返回#    平局返回 Q


跳出while循环后我们应将游戏结果告诉玩家


所以接下来写结果输出


4.4结果输出

30.png31.png

玩家赢

32.png


电脑赢

电脑太笨了,实在下不出一把平局,没办法验证结果了,试了好几把,把把玩家赢,上面这个电脑赢都是好不容易搞来的


相关文章
|
6天前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
20 1
|
6天前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
33 1
|
6天前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
6天前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
12 0
|
6天前
|
程序员 C语言
C语言设计三子棋
C语言设计三子棋
|
6天前
|
存储 小程序 编译器
C语言之三子棋小游戏的应用
C语言之三子棋小游戏的应用
|
1天前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
8 1
|
1天前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
9 0
|
6天前
|
C语言
三子棋c语言讲解
三子棋c语言讲解
|
6天前
|
C语言
C语言-三子棋
C语言-三子棋
24 1