三子棋小游戏及如何让朋友也能玩自己写的游戏(程序)(exe如何附带动态链接库dll)C语言从入门到入土(入门特别篇)(二)

简介: 一:三子棋 1.游戏的基本开始流程() 2.三子棋的实现 2.1第一步写出基本流程 2.2第二步打印菜单 2.3游戏的实现 2.3.1初始化棋盘 2.3.2打印棋盘 2.3.3玩家下棋 2.3.4电脑下棋 2.3.5判断 2.4游戏的整个代码 game.c: 2.5三子棋的扩展 二:vs如何发布exe文件并附带动态链接库 第一步:vs->工具->命令行->开发者 PowerShell(P) 第二步:查看vs 是Debug还是Releas 是x86还是x64 第三步:找到exe所在位置 第四步:查询你exe文件所需要的的动态链接库(dll)

2.3.1初始化棋盘


47.png


由图我们发现格式是 空格%c空格|  的形式,我们先把棋盘的元素都赋值为空格:


void InitBoard(char Board[ROW][COL],int row,int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      Board[i][j] = ' ';
    }
  }
}

2.3.2打印棋盘

还是先分析

48.png

但是我们发现如果直接打印三部分对于后续的改变代码适应性就很差


49.png

这两条红色的应该是上面连着下面的,但是怕大家看不清楚就画出了第二行的

但这也是三部分这两条,只是说最右边少了" |" 所以我们用了if哈

对于上述代码我们就可以发现有很强的适应性,我们可以用row和col来控制打印的多少,

如下:

game.c:

void DisplayBoard(char Board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  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++)
    {
      printf("---");
      if (j < COL-1)
        printf("|");
    }
    printf("\n");
  }
}

2.3.3玩家下棋

game.c:

void Player_move(char Board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  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请重新输入:\n");
    }
  }
}

这里我们用了一个whle循环,只有当玩家真正把数输入进去的时候才能跳出循环,所以在此之前我们要进行判断,并且输入的要是有效值。


2.3.4电脑下棋

game.c:

void Computer_move(char Board[ROW][COL], int row, int col)
{
  while (1)
  {
    int x = rand() % ROW;
    int y = rand() % COL;
    if (Board[x][y] == ' ')
    {
      Board[x][y] = '#';
      break;
    }
  }
}

在这里我们电脑下棋使用的是随机数生成法,是最简单的实现方法,这里值得注意的是


rand()%ROW 生成的数属于0到2。然后还是和上面一样,找到空格就输入。(因为这里生成的数都在0到2所以不可能出现越出棋盘,所以就不需要输入判断),当然我使用rand()函数要再用srand生成随机数种子,然后用时间戳去生成种子即:(unsigned int)srand(time(NULL)),再把这个式子放在:


test.c:


50.png

就可以生成伪随机数而且不重复啦,至于原理目前了解就行,目前不用理解。


2.3.5判断


对于玩家和电脑下棋后我们要对棋盘进行判断输(#)赢(*)或者平局(Q)又或者继续(C)

game.c:

char Is_win(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][1];
    }
  }
  //三列
  for (i = 0; i < col; i++)
  {
    if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != ' ')
    {
      return Board[1][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 (1 == Is_full(Board, row, col))
  {
    return 'Q';
  }
  //继续
  return 'C';
}

在这里面我们又引用了一个函数Is_full()来进行平局的判断,因为如果棋盘满了的话都还没有赢就是平局了。当然,如果都不是,那就要继续游戏。

game.c:


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

这里我们发现这个函数是有返回值的(int),因为我们要对其返回值进行接收判断,所以我们还要再定义一个变量去接收(ret)。


51.png

这样游戏全部思路就完成啦!!!

大家可以好好回忆一下!!!

相关文章
|
2天前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)
|
2天前
|
C语言
️️【C语言-游戏设置】---猜数字游戏1~100
️️【C语言-游戏设置】---猜数字游戏1~100
|
9天前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
10 0
|
9天前
|
C语言
C语言小插曲——对图形库的初步探索(消除小球小游戏)
C语言小插曲——对图形库的初步探索(消除小球小游戏)
8 0
|
10天前
|
C语言
C语言——oj刷题——猜数字游戏
C语言——oj刷题——猜数字游戏
|
10天前
|
存储 C语言 索引
C语言数组:从入门到进阶
C语言数组:从入门到进阶
15 0
|
10天前
|
C语言
扫雷游戏(C语言)
扫雷游戏(C语言)
|
10天前
|
C语言
C语言结构体教程:从入门到实践(保姆式教学)
C语言结构体教程:从入门到实践(保姆式教学)
|
10天前
|
C语言
C语言中求x的n次方:从入门到实践(保姆式教学)
C语言中求x的n次方:从入门到实践(保姆式教学)
14 0
|
11天前
|
C语言
C语言游戏实战(12):植物大战僵尸(坤版
C语言游戏实战(12):植物大战僵尸(坤版
25 4