小游戏:三子棋的代码实现

简介: 小游戏:三子棋的代码实现

文章目录:

       一:定义函数,打印游戏菜单。

       二:宏定义打印棋盘,以及创建新文件以及头文件,例:game.c和game.h

               1:定义函数初始化棋盘

               2:定义函数打印棋盘以及分割线(重难点)

      三:玩家下棋

       四:电脑下棋

       五:判断输赢(重难点)

       六:代码全析总结


一、打印菜单

  • 相信大家在打单机游戏的时候,肯定会看到一个菜单(目录),也就是在刚刚进入游戏的时候看到的选项,需要玩家输入数字进行选择
  • 选择1(进入游戏)
  • 选择0(退出游戏)
void venu()
{
  printf("---------------------------\n");
  printf("---1:开始游戏    2:结束游戏\n");
  printf("---------------------------\n");
}

在主函数内进行游戏规划以及实现代码框架

在函数中会叫用rand()和srand()函数以及time()函数,注意记得调用其头文件:

#include<stdlib.h>以及#include<time.h>头文件,同时注意格式和运行的逻辑顺序

int main()
{
  //打印游戏菜单
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    venu();
    printf("请输入数字\n");
    scanf("%d", &input);
    switch (input)
    {//实现game游戏函数
    case 1:game(); break;
    case 0:printf("结束游戏\n"); break;
    default:printf("输入错误,请重新输入\n"); break;
    }
  } while (input);  
  return 0;
}


二、棋盘打印

因为棋盘类似于一个二维数组,所以用一个二维数组来接收下的棋子的“字符”;

  1:定义函数初始化棋盘

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] = ' ';
    }
  }
}


2:定义函数打印棋盘以及分割线(重难点)

为了格式美观,会将最后一列的格式线进行删除。

当for在行循环中进行到最后一行和一列时,注意:此时的行格式线和列格式线都要进行删除

void playboard(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");
    //控制行变化,不打印row最后一行
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("---");
        //控制不打印col最后一列
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}


三:玩家下棋

那就是玩家(也就是你自己)下一步,然后电脑在下一步,直到谁赢,输,平局,所以无论在你下完一步后还是在电脑下完一步后,都要判断这局游戏的输赢,但是判断三字棋局的输赢,除了三字连成线,也就是横三条,竖三条,斜两条,可表示输赢,还有如果棋子下完了棋盘还没有分出胜负,那就是平局,其他情况就继续下棋。

用函数 Playgame();表示玩家下一步棋子,用字符‘*’表示,使用玩家输入的值,然后判断该坐标是否被占用,如果被占用则再次输入值进行填充表格

void playgame(char board[Row][Col], int row, int col)
{ 
  int x = 0, y = 0;   
  while (1)
  { printf("请玩家输入下棋坐标->");
    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");
    }
  }
}


四:电脑下棋

 使用Computergame()函数; 表示电脑下一步棋,用字符‘#’表示,在使用rand()函数,使电脑生成随机值,然后判断该坐标是否被占用,如果被占用则再次随机生成值进行填充表格。

 

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


五:判断输赢(重难点)

再完成一个函数 Iswin();判断棋局输赢,需要一个返回值,如果玩家赢返回‘’;如果输返回‘#’,平局返回‘Q’,继续则返回‘C’

char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
  
  //判断行是否相同
for (i = 0; i < row; i++)
{  
  if (board[i][0] == ' ')
    continue;
  count = 0;
    for (j = 0; j < col-1; j++)
    {
      if (board[i][j] == board[i][j + 1])
        count++;
    }
    if(count==row-1)
    return board[i][0];
  }
  //判断列是否相同
for (i = 0; i < col; i++)
{
  if (board[0][i] == ' ')
    continue;
  count = 0;
  for (j = 0; j < row - 1; j++)
  {
    if (board[j][i] == board[j + 1][i])
      count++;
  }
  if(count==col-1)
  return board[0][j];
}
  //判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
  if (board[0][0] == ' ')
    break;  
  if (board[i][i] == board[i + 1][i + 1])
    count++;
  if (count == row-1)
    return board[i][i];
}
  //判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
  if (board[0][col-1] == ' ')
    break;
  
  if (board[i][j] == board[i+1][j-1])
    count++;
  if (count == row - 1)
    return board[i][j];
}
  //判断是否和棋
count = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'c';
      else
        count++;
    }
  }
  if (count == (row * col))
    return 'Q';
}


 六:代码全析总结

第一部分:主函数  例:源.c

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//打印菜单
void venu()
{
  printf("---------------------------\n");
  printf("---1:开始游戏    2:结束游戏\n");
  printf("---------------------------\n");
}
void game()
{
  char board[Row][Col] = { 0 };
  //1:给board字符数组覆空格初始值
  Initboard(board, Row,Col);
  //2:打印表格
  playboard(board, Row, Col);
  char ret = 0;
  while (1)
  {//玩家下棋
    playgame(board, Row, Col);
    playboard(board, Row, Col);
    //判断谁赢
    ret=iswin(board, Row, Col);
    if (ret != 'c')
      break;
    //电脑下棋
    computergame(board, Row, Col);
    playboard(board, Row, Col);
    ret=iswin(board, Row, Col);
    if (ret != 'c')
      break;
  }
  if (ret == '*')
    printf("玩家赢了\n");
  else if (ret == '#')
    printf("电脑赢了\n");
  else 
    printf("和棋了\n");
}
int main()
{
  //打印游戏菜单
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    venu();
    printf("请输入数字\n");
    scanf("%d", &input);
    switch (input)
    {//实现game游戏函数
    case 1:game(); break;
    case 0:printf("结束游戏\n"); break;
    default:printf("输入错误,请重新输入\n"); break;
    }
  } while (input);  
  return 0;
}


第二部分:实现三子棋的游戏头文件

#pragma once
#define Row 3
#define Col 3
//覆初始值
void Initboard(char board[Row][Col], int row, int col);
//打印表格
void playboard(char board[Row][Col], int row, int col);
//玩家下棋
void playgame(char board[Row][Col], int row, int col);
void computergame(char board[Row][Col], int row,int  col);
char iswin(char board[Row][Col], int row, int  col);


第三部分:(核心)游戏代码的实现

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.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 playboard(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");
    //控制行变化,不打印row最后一行
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("---");
        //控制不打印col最后一列
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}
void playgame(char board[Row][Col], int row, int col)
{ 
  int x = 0, y = 0;   
  while (1)
  { printf("请玩家输入下棋坐标->");
    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");
    }
  }
}
void computergame(char board[Row][Col], int row, int  col)
{
  int x = 0, y = 0; 
  printf("电脑下棋\n");
  while (1)
  { x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x ][y ] = '#';
      break;
    }
  }
}
char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
  
  //判断行是否相同
for (i = 0; i < row; i++)
{  
  if (board[i][0] == ' ')
    continue;
  count = 0;
    for (j = 0; j < col-1; j++)
    {
      if (board[i][j] == board[i][j + 1])
        count++;
    }
    if(count==row-1)
    return board[i][0];
  }
  //判断列是否相同
for (i = 0; i < col; i++)
{
  if (board[0][i] == ' ')
    continue;
  count = 0;
  for (j = 0; j < row - 1; j++)
  {
    if (board[j][i] == board[j + 1][i])
      count++;
  }
  if(count==col-1)
  return board[0][j];
}
  //判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
  if (board[0][0] == ' ')
    break;  
  if (board[i][i] == board[i + 1][i + 1])
    count++;
  if (count == row-1)
    return board[i][i];
}
  //判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
  if (board[0][col-1] == ' ')
    break;
  
  if (board[i][j] == board[i+1][j-1])
    count++;
  if (count == row - 1)
    return board[i][j];
}
  //判断是否和棋
count = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'c';
      else
        count++;
    }
  }
  if (count == (row * col))
    return 'Q';
}

最后真诚的祝愿每一位代码人都能够实现~~~~

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给一个一键三连,感谢。

相关文章
|
C语言
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
64 2
|
7月前
|
存储
三子棋游戏的实现
三子棋游戏的实现
62 0
|
存储 C语言
【C语言小游戏】三子棋(井字棋)(上)
【C语言小游戏】三子棋(井字棋)
98 0
三子棋小游戏思路及代码实现的详解
三子棋小游戏思路及代码实现的详解
70 0
|
7月前
|
C语言
三子棋游戏(详解+代码)
三子棋游戏(详解+代码)
83 2
|
7月前
|
人工智能 C语言
三子棋小游戏
三子棋小游戏
|
C语言
C语言经典小游戏-三子棋+扫雷
C语言经典小游戏-三子棋+扫雷
40 1
|
7月前
|
算法 C语言
三子棋小游戏(可改棋盘大小)
三子棋小游戏(可改棋盘大小)
81 0
|
C语言
【C语言小游戏】三子棋(井字棋)(下)
【C语言小游戏】三子棋(井字棋)
57 0
|
程序员 C语言
【C语言小游戏】三子棋(井字棋)(中)
【C语言小游戏】三子棋(井字棋)
80 0