返回介绍

第 2 节 修复 BUG

发布于 2025-03-07 00:37:22 字数 6525 浏览 0 评论 0 收藏 0

一、实验介绍

1. 环境登录

无需密码自动登录,系统用户名 shiyanlou

2. 环境介绍

本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会用到桌面上的程序:

  1. LX 终端(LXTerminal): Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令
  2. Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的 HTML/JS 页面即可
  3. GVim:非常好用的编辑器,最简单的用法可以参考课程 Vim 编辑器

3. 环境使用

使用 GVim 编辑器输入实验所需的代码及文件,使用 LX 终端(LXTerminal)运行所需命令进行操作。

对 vim 操作不熟悉的小伙伴可以用 gedit 代替。

下面简单说明一下我们要如何使用 Linux 来编写代码(熟悉 Linux 操作的小伙伴可以跳过) 1、编写代码(最最简单的方法) 编写代码 2、编译运行 编译运行

二、项目介绍

这节课我们要对游戏中出现的 BUG 进行修复。

三、项目实战

1. 我的棋子被“吃”了

不知道大家发现没有,我们的五子棋小游戏在落子时,即便是落子的位置已经被占用,依旧可以“吃掉”原棋子。 这是因为我们在写 playChess 函数的时候,没有对落子位置进行检测。我们可以这样修改我们的代码:

void playChess(void)
{
  int i, j, winner;

  if (1 == whoseTurn % 2)
  {
    printf("轮到玩家 1,请输入棋子的位置,格式为行号+空格+列号:");
    scanf("%d %d", &i, &j);

    //修复 BUG 
    while(chessboard[i][j] != 0)
    {
      printf("您要下的位置已经被占用了哦,请重新输入:"); 
      scanf("%d %d", &i, &j);
    }
    //修复 BUG 

    chessboard[i][j] = 1;
  }
  else
  {
    printf("轮到玩家 2,请输入棋子的位置,格式为行号+空格+列号:");
    scanf("%d %d", &i, &j);

    //修复 BUG 
    while(chessboard[i][j] != 0)
    {
      printf("您要下的位置已经被占用了哦,请重新输入:"); 
      scanf("%d %d", &i, &j);
    }
    //修复 BUG 

    chessboard[i][j] = 2;
  }

  system("clear");
  printChessboard();

  if (judge(i, j))
  {
    if (1 == whoseTurn % 2)
      printf("玩家 1 胜!\n");
    else
      printf("玩家 2 胜!\n");
  }
}

在函数中加入一个循环,当落子位置已经被占用时,给出提示,并且要求重新输入。

图片描述信息

2. 我怎么永远赢不了

当出现五子连线的时候,提示玩家 1 或玩家 2 获胜之后,又提示“轮到玩家*,请输入棋子位置……” 是不是很郁闷呢? 其实我们只要加一句代码就行!

  if (judge(i, j))
  {
    if (1 == whoseTurn % 2)
    {
      printf("玩家 1 胜!\n");
      exit(0);  //修复 BUG 
    }
    else
    {
      printf("玩家 2 胜!\n");
      exit(0);  //修复 BUG 
    }
  }
}

在获胜后除了提示玩家某某获胜意外,退出游戏 exit(0)

图片描述信息

好了!剩下的 BUG 就等着大家去继续发现了。 调试程序是很有意思的哦,说不定你会从某一个 BUG 里获得灵感,从而创造出属于你的游戏的玩法,比如刚才“吃棋子”的 BUG,我们甚至可以根据那一个 BUG 开发一款新的棋类游戏

那么,这次的项目课就这么结束了,欢迎大家在问答区提问,我会耐心解答的哦!也欢迎大家关注我的后续课程!

最终源码(可以直接复制到实验楼环境中运行):

#include <stdio.h>
#include <stdlib.h>

#define N  15

int chessboard[N + 1][N + 1] = { 0 };

int whoseTurn = 0;

void initGame(void);
void printChessboard(void);
void playChess(void);
int judge(int, int);

int main(void)
{
  initGame();

  while (1)
  {
    whoseTurn++;

    playChess();
  }

  return 0;
}

void initGame(void)
{
  char c;

  printf("Please input \'y\' to enter the game:");
  c = getchar();
  if ('y' != c && 'Y' != c)
    exit(0);

  system("clear");
  printChessboard();
}

void printChessboard(void)
{
  int i, j;

  for (i = 0; i <= N; i++)
  {
    for (j = 0; j <= N; j++)
    {
      if (0 == i)
        printf("%3d", j);
      else if (j == 0)
        printf("%3d", i);
      else if (1 == chessboard[i][j])
        printf("  O");
      else if (2 == chessboard[i][j])
        printf("  X");
      else
        printf("  *");
    }
    printf("\n");
  }
}

void playChess(void)
{
  int i, j, winner;

  if (1 == whoseTurn % 2)
  {
    printf("Turn to player 1, please input the position:");
    scanf("%d %d", &i, &j);

    while(chessboard[i][j] != 0)
    {
      printf("This position  has been occupied, please input the position again:"); 
      scanf("%d %d", &i, &j);
    }

    chessboard[i][j] = 1;
  }
  else
  {
    printf("Turn to player 1, please input the position:");
    scanf("%d %d", &i, &j);

    while(chessboard[i][j] != 0)
    {
      printf("This position  has been occupied, please input the position again:"); 
      scanf("%d %d", &i, &j);
    }

    chessboard[i][j] = 2;
  }

  system("clear");
  printChessboard();

  if (judge(i, j))
  {
    if (1 == whoseTurn % 2)
    {
      printf("Winner is player 1!\n");
      exit(0);
    }
    else
    {
      printf("Winner is player 2!\n");
      exit(0);
    }
  }
}

int judge(int x, int y)
{
  int i, j;
  int t = 2 - whoseTurn % 2;

  for (i = x - 4, j = y; i <= x; i++)
  {
    if (i >= 1 && i <= N - 4 && t == chessboard[i][j] && t == chessboard[i + 1][j] && t == chessboard[i + 2][j] && t == chessboard[i + 3][j] && t == chessboard[i + 4][j])
      return 1;
  }
  for (i = x, j = y - 4; j <= y; j++)
  {
    if (j >= 1 && j <= N - 4 && t == chessboard[i][j] && t == chessboard[i][j + 1] && t == chessboard[i][j + 1] && t == chessboard[i][j + 3] && t == chessboard[i][j + 4])
      return 1;
  }
  for (i = x - 4, j = y - 4; i <= x, j <= y; i++, j++)
  {
    if (i >= 1 && i <= N - 4 && j >= 1 && j <= N - 4 && t == chessboard[i][j] && t == chessboard[i + 1][j + 1] && t == chessboard[i + 2][j + 2] && t == chessboard[i + 3][j + 3] && t == chessboard[i + 4][j + 4])
      return 1;
  }
  for (i = x + 4, j = y - 4; i >= 1, j <= y; i--, j++)
  {
    if (i >= 1 && i <= N - 4 && j >= 1 && j <= N - 4 && t == chessboard[i][j] && t == chessboard[i - 1][j + 1] && t == chessboard[i - 2][j + 2] && t == chessboard[i - 3][j + 3] && t == chessboard[i - 4][j + 4])
      return 1;
  }

  return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文