三子棋小游戏(可改棋盘大小)

简介: 三子棋小游戏(可改棋盘大小)

大家好!学习了那么久的c语言,我们都希望自己能做出一些成果来,而实现一些小游戏无疑是最先想到的选择。


今天我给大家介绍一个充满趣味和挑战的井字棋小游戏——三子棋。它是一款简单而又深思熟虑的游戏,通过在棋盘上放置符号,让先连成相同符号的三个一线,战胜对手。让我们一起来看看三子棋的规则、策略和实现吧!


在此处贴出各个函数对应位置,方便各位去进行查找

目录

一、三子棋小游戏的规则

二、三子棋小游戏重要函数的实现

1.菜单打印

2.棋盘初始化

3.棋盘打印

4.玩家下棋

5.电脑下棋

6.是否获胜判断

三.全体代码并进行游戏演示:


一、三子棋小游戏的规则

三子棋,又称井字棋,是一个两人对弈的棋盘游戏。游戏棋盘是一个3x3的方格矩阵,每个玩家轮流在空白的方格中放置自己的符号(通常是"X"和"O")。先连成三个相同符号的一线(横、竖或斜线),即可获胜。


下面是一个示意图,帮助我们更好地理解三子棋的规则:



二、三子棋小游戏重要函数的实现

1.我们首先打印游戏菜单

void menu()//打印菜单的函数
{
  printf("*********************\n");
  printf("******* 1. play *****\n");
  printf("******* 0. exit *****\n");
  printf("*********************\n");
}

效果如下:


2.初始化棋盘 我们可以使用一个3x3的二维数组来表示棋盘,初始值都设置为空格。可以定义一个函数来创建并初始化棋盘

void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
  for (int i = 0; i < a; i++)
  {
    for (int j = 0; j < b; j++)
    {
      arr[i][j] = ' ';
    }
  }
}

3.打印棋盘 定义一个函数来打印当前的棋盘状态(该代码可随意改变棋盘大小)

void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      printf(" %c ", arr[i][j]);
      if (j < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
    for (int k = 0; k < col; k++)
    {
      printf("---");
      if (k < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
  }
}


4.提示玩家输入位置 定义一个函数来提示玩家输入要下棋的位置 ,同时检查输入的位置是否合法 定义一个函数来检查玩家输入的位置是否合法,即行和列的值都在0到2之间,并且该位置还没有被其他玩家占据

void Player(char arr[ROW][COL], int row, int col)
{
  while (1)
  {
           printf("玩家进行下棋,请输入棋子所处坐标 \n");
      int x, y;
      scanf("%d %d", &x, &y);
  if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
  {
    if (arr[x - 1][y - 1] == ' ')
    {
      arr[x - 1][y - 1] = 'o';
      break;
    }
    printf("该位置已被占用,请输入其他坐标\n");
  }
  else
  {
    printf("输入错误,请重新输入");
  }
}
}

5.电脑进行下棋(因为是初学者,没怎么学过算法,暂时使用随机数,日后会去学习使用miniMax算法进行改善),同理也要进行是否已被占用的判断

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


6.判断是否有玩家获胜 定义一个函数来判断是否有玩家连成一条线。我们需要检查每一行、每一列以及对角线上的棋子是否相同,如果有相同的棋子,则判定该玩家获胜,o表示玩家赢,x是电脑赢,c是平局,k是继续 。返回相应的字符更为方便

char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
  for (int i = 0; i < row; i++)//判断行
  {
    if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
    {
      return arr[i][0];
    }
  }
  for (int j = 0; j < col; j++)//判断列
  {
    if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
    {
      return arr[0][j];
    }
  }
  if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
  {
    return arr[0][0];
  }
  if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
  {
    return arr[0][2];
  }
  if (isFull(arr,row,col))
  {
    return 'c';
  }
  return 'k';
}

三.全体代码并进行游戏演示:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3//定义行和列均为3
void menu()//打印菜单的函数
{
  printf("*********************\n");
  printf("******* 1. play *****\n");
  printf("******* 0. exit *****\n");
  printf("*********************\n");
}
void initBoard(char arr[ROW][COL], int a, int b)//初始化棋盘的函数
{
  for (int i = 0; i < a; i++)
  {
    for (int j = 0; j < b; j++)
    {
      arr[i][j] = ' ';
    }
  }
}
void printBoard(char arr[ROW][COL], int row,int col)//打印棋盘的函数
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      printf(" %c ", arr[i][j]);
      if (j < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
    for (int k = 0; k < col; k++)
    {
      printf("---");
      if (k < col - 1)
      {
        printf("|");
      }
    }
    printf("\n");
  }
}
void Player(char arr[ROW][COL], int row, int col)
{
  while (1)
  {
           printf("玩家进行下棋,请输入棋子所处坐标 \n");
      int x, y;
      scanf("%d %d", &x, &y);
  if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
  {
    if (arr[x - 1][y - 1] == ' ')
    {
      arr[x - 1][y - 1] = 'o';
      break;
    }
    printf("该位置已被占用,请输入其他坐标\n");
  }
  else
  {
    printf("输入错误,请重新输入");
  }
}
}
void Computer(char arr[ROW][COL], int row, int col)
{
  printf("电脑下棋\n");
  while (1)
  {
    int x, y;
      x = rand() % row;
      y = rand() % col;
    if (arr[x][y] == ' ')
    {
      arr[x][y] = 'x';
      break;
    }
  }
}
int isFull(char arr[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (arr[i][j] == ' ')
        return 0;
    }
  }
  return 1;
}
char Iswin(char arr[ROW][COL], int row, int col)//判断输赢的函数
{
  for (int i = 0; i < row; i++)//判断行
  {
    if (arr[i][0] == arr[i][1]&&arr[i][1]==arr[i][2] && arr[i][2] != ' ')
    {
      return arr[i][0];
    }
  }
  for (int j = 0; j < col; j++)//判断列
  {
    if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
    {
      return arr[0][j];
    }
  }
  if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
  {
    return arr[0][0];
  }
  if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
  {
    return arr[0][2];
  }
  if (isFull(arr,row,col))
  {
    return 'c';
  }
  return 'k';
}
void game()
{
  char win ;
  char board[ROW][COL]; //我们使用一个二维数组board来表示棋盘,每个格子可以存放一个字符,初始值为空格
  initBoard(board, ROW, COL);//initBoard函数用来初始化棋盘
  printBoard(board, ROW, COL);//printBoard函数用来打印棋盘
  //开始下棋
  while (1)
  {
    Player(board, ROW, COL);//玩家下棋
    printBoard(board, ROW, COL);
    win=Iswin(board, ROW, COL);//o表示玩家赢,x是电脑赢,c是平局,k是继续
    if (win != 'k')
    {
      break;
    }
    Computer(board, ROW, COL); //电脑下棋
    printBoard(board, ROW, COL);
    if (win != 'k')
    {
      break;
    }
  }
  if (win == 'o')
  {
    printf("玩家获胜\n");
  }
  else if (win == 'x')
  {
    printf("电脑获胜\n");
  }
  else
  {
    printf("平局\n");
  }
}
int main()
{
  int a = 1;
  srand((unsigned int)time(NULL));
  while (a)
  {
    printf("请选择:\n");
    menu();
    scanf("%d", &a);
    switch (a)
    {
    case 1:
      game();//开始游戏
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("输入有误,请重新输入\n");
      break;
    }
  }
  return 0;
}



三子棋小游戏是一款简单而又富有挑战性的游戏,它不仅能够帮助我们放松心情,还能够锻炼我们的思维能力。通过这篇文章的介绍,我们了解了三子棋小游戏的规则和实现方法。希望大家能够尝试玩一玩这款游戏,享受其中的乐趣和挑战!


今天的分享先到这里,感谢大家!!!


目录
相关文章
|
2月前
|
C语言
简易三子棋的实现
简易三子棋的实现
|
2月前
|
存储
三子棋游戏的实现
三子棋游戏的实现
39 0
|
10天前
小游戏:三子棋的代码实现
小游戏:三子棋的代码实现
10 3
|
2月前
|
C语言
三子棋游戏(详解+代码)
三子棋游戏(详解+代码)
33 2
|
12月前
三子棋游戏 2020-12-29
三子棋游戏 2020-12-29
|
2月前
|
人工智能 C语言
三子棋小游戏
三子棋小游戏
|
7月前
简单三子棋的实现
简单三子棋的实现
50 0
|
12月前
|
程序员 C语言
三子棋(超详细)
三子棋(超详细)
|
12月前
三子棋游戏
三子棋游戏
63 0
|
12月前
|
C语言
C/【三子棋】
C/【三子棋】