三子棋小游戏

简介: 三子棋小游戏

通过一段时间的学习,我们可以利用我们所学的知识来写一个小游戏,三子棋小游戏,游戏内容是玩家输入棋盘上的坐标进行下棋,电脑随机下棋,循环,直到一方胜利(一方所下棋子3个连成一条线)或平局(棋盘下满)。


效果图

1.数组存放棋子

玩家棋子为* ,电脑棋子为#,我们可以用字符数组来存放。当没有棋子时用‘ ’就是空格来表示,为了更方便的改为其他棋盘,如5子棋,我们可以用宏定义行和列

//宏定义行和列
#define ROW 3
#define COL 3
//定义棋盘
char board[ROW][COL] = { 0 };
//初识化棋盘
InitBoard(board,ROW,COL);
//初识化棋盘函数定义
void InitBoard(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      board[i][j] = ' ';//最开始棋盘为空  所以赋值为空格
    }
  }
}


2.打印棋盘

棋盘形状:

//打印棋盘函数
DisplayBoard(board, ROW, COL);
//打印棋盘函数实现
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (j < col - 1)
      {
        printf(" %c |",board[i][j]);
      }
      else
      {
        printf(" %c \n",board[i][j]);
      }
    }
    if(i<row-1)//最后一行的线不打印
    {
      for (int j = 0; j < col; j++)
      {
        if (j < col - 1)
        {
          printf("---|");
        }
        else
        {
          printf("---\n");
        }
      }
    }
  }
}


3.玩家下棋函数

void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋\n");
  while(1)
  {
    printf("请输入你要下棋的坐标\n");
    scanf("%d %d", &x, &y);
    x = x - 1;
    y = y - 1;
    if (x >= 0 && x <= row - 1 && y >= 0 && y <= col - 1 )
    {
      if (board[x][y] == ' ')
      {
        board[x][y] = '*';//将棋盘改为*
        break;
      }
      else
      {
        printf("该坐标被占用,请重新输入\n");
      }
    }
    else
      printf("输入非法,请重新输入\n");
  }
}


4.电脑随机下棋

电脑下棋需要生成随机坐标,用到随机数rand()函数,为了是生成的数达到真正的随机,还需要使用随机数种子,srand((unsigned int)time(NULL)); 还要包含头文件<stdlib.h>  <time.h>。

void ComputerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("电脑下棋\n");
  while(1)
  {
    x = rand() % ROW;//生成0到ROW之间的随机数
    y = rand() % COL;
    if (board[x][y] == ' ')//如果棋盘没有棋子,下棋成功
    {
      board[x][y] = '#';//下棋成功,将棋盘改为#
      break;
    }
  }
}


5.判断是否胜利函数

有4个返回值* # ’0‘ ’1‘

//判断输赢
//玩家赢返回 '*'
//电脑赢返回 '#'
//平局  '0'
//继续  '1'
char IsWin(char board[ROW][COL], int row, int col)
{
  int flag = 0;
  char ret = 0;
  //是否胜利
  //1.行相同
  for (int i = 0; i < row; i++)
  {
    flag = 0;//重置flag
    ret = board[i][0];
    for (int j = 1; j < row; j++)
    {
      if (ret != board[i][j])
      {
        flag = 1;//修改flag
        break;
      }
    }
    if (flag == 0 && ret != ' ')
      return ret;
    /*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    {
        return board[i][0];
    }*///三子棋简单写法
  }
  //2.列相同
  for (int i = 0; i < col; i++)
  {
    flag = 0;//重置flag
    ret = board[0][i];
    for (int j = 1; j < row; j++)
    {
      if (ret != board[j][i])
      {
        flag = 1;//修改flag
        break;
      }
    }
    if (flag == 0 && ret != ' ')
      return ret;
    /*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][i];
    }*///三子棋简单写法
  } 
  //3.对角线
  flag = 0;
  ret = board[0][0];
  for (int i = 1; i < row; i++)
  {
    if (ret != board[i][i])
    {
      flag = 1;
      break;
    }
  }
  if (flag == 0 && ret != ' ')
    return ret;
  flag = 0;
  ret = board[0][col-1];
  for (int i = 1; i < row; i++)
  {
    if (ret != board[i][col-i-1])
    {
      flag = 1;
      break;
    }
  }
  if (flag == 0 && ret != ' ')
    return ret;
  //if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
  //{
  //  return board[0][0];
  //}
  //if (board[0][2] == board[1][1] && board[1][1] == board[2][1] && board[1][1] != ' ')
  //{
  //  return board[1][1];
  //}//三子棋简单写法
  //是否平局
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return '1';
    }
  }
  return '0'; 
}


6.game函数

整个游戏过程

void game()
{
  char board[ROW][COL] = { 0 };
  //初识化棋盘
  InitBoard(board,ROW,COL);
  //打印棋盘
  DisplayBoard(board, ROW, COL);
  char ret = 0;
  while (1)
  {
    //玩家下棋  *
    PlayerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != '1')
    {
      break;
    }
    //电脑随机下棋  #
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != '1')
    {
      break;
    }
  }
  if (ret == '*')
  {
    printf("恭喜玩家胜利\n");
  }
  else if (ret == '#')
  {
    printf("电脑胜利\n");
  }
  else if (ret == '0')
  {
    printf("平局\n");
  }
}


7.主函数

主函数能够实现游戏在玩完一次之后可以选择继续玩下一次或者结束游戏

void menu()
{
  printf("**************************\n");
  printf("******    1.play    ******\n");
  printf("******    0.exit    ******\n");
  printf("**************************\n");
}
int main()
{
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    menu();
    printf("请输入:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("游戏开始\n");
      game();
      break;
    case 0:
      printf("游戏结束\n");
      break;
    default:
      printf("输入非法,请重新输入\n");
      break;
    }
  } while (input);
  return 0;
}


8.全部代码

game.h文件

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);


game.c文件

#include"game.h"
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      board[i][j] = ' ';
    }
  }
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (j < col - 1)
      {
        printf(" %c |",board[i][j]);
      }
      else
      {
        printf(" %c \n",board[i][j]);
      }
    }
    if(i<row-1)
    {
      for (int j = 0; j < col; j++)
      {
        if (j < col - 1)
        {
          printf("---|");
        }
        else
        {
          printf("---\n");
        }
      }
    }
  }
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋\n");
  while(1)
  {
    printf("请输入你要下棋的坐标\n");
    scanf("%d %d", &x, &y);
    x = x - 1;
    y = y - 1;
    if (x >= 0 && x <= row - 1 && y >= 0 && y <= col - 1 )
    {
      if (board[x][y] == ' ')
      {
        board[x][y] = '*';
        break;
      }
      else
      {
        printf("该坐标被占用,请重新输入\n");
      }
    }
    else
      printf("输入非法,请重新输入\n");
  }
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("电脑下棋\n");
  while(1)
  {
    x = rand() % ROW;
    y = rand() % COL;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}
//判断输赢
//玩家赢返回 '*'
//电脑赢返回 '#'
//平局  '0'
//继续  '1'
char IsWin(char board[ROW][COL], int row, int col)
{
  int flag = 0;
  char ret = 0;
  //是否胜利
  //1.行相同
  for (int i = 0; i < row; i++)
  {
    flag = 0;//重置flag
    ret = board[i][0];
    for (int j = 1; j < row; j++)
    {
      if (ret != board[i][j])
      {
        flag = 1;//修改flag
        break;
      }
    }
    if (flag == 0 && ret != ' ')
      return ret;
    /*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
    {
        return board[i][0];
    }*/
  }
  //2.列相同
  for (int i = 0; i < col; i++)
  {
    flag = 0;//重置flag
    ret = board[0][i];
    for (int j = 1; j < row; j++)
    {
      if (ret != board[j][i])
      {
        flag = 1;//修改flag
        break;
      }
    }
    if (flag == 0 && ret != ' ')
      return ret;
    /*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][i];
    }*/
  } 
  //3.对角线
  flag = 0;
  ret = board[0][0];
  for (int i = 1; i < row; i++)
  {
    if (ret != board[i][i])
    {
      flag = 1;
      break;
    }
  }
  if (flag == 0 && ret != ' ')
    return ret;
  flag = 0;
  ret = board[0][col-1];
  for (int i = 1; i < row; i++)
  {
    if (ret != board[i][col-i-1])
    {
      flag = 1;
      break;
    }
  }
  if (flag == 0 && ret != ' ')
    return ret;
  //if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
  //{
  //  return board[0][0];
  //}
  //if (board[0][2] == board[1][1] && board[1][1] == board[2][1] && board[1][1] != ' ')
  //{
  //  return board[1][1];
  //}
  //是否平局
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return '1';
    }
  }
  return '0'; 
}


test.c文件

#include"game.h"
//三子棋游戏
void menu()
{
  printf("**************************\n");
  printf("******    1.play    ******\n");
  printf("******    0.exit    ******\n");
  printf("**************************\n");
}
void game()
{
  char board[ROW][COL] = { 0 };
  //初识化棋盘
  InitBoard(board,ROW,COL);
  //打印棋盘
  DisplayBoard(board, ROW, COL);
  char ret = 0;
  while (1)
  {
    //玩家下棋  *
    PlayerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != '1')
    {
      break;
    }
    //电脑随机下棋  #
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = IsWin(board, ROW, COL);
    if (ret != '1')
    {
      break;
    }
  }
  if (ret == '*')
  {
    printf("恭喜玩家胜利\n");
  }
  else if (ret == '#')
  {
    printf("电脑胜利\n");
  }
  else if (ret == '0')
  {
    printf("平局\n");
  }
}
int main()
{
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    menu();
    printf("请输入:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("游戏开始\n");
      game();
      break;
    case 0:
      printf("游戏结束\n");
      break;
    default:
      printf("输入非法,请重新输入\n");
      break;
    }
  } while (input);
  return 0;
}


希望对大家有帮助,kiss kiss。

相关文章
|
9月前
|
人工智能 C语言
三子棋小游戏
三子棋小游戏
|
算法 程序员
“纯C”实现——三子棋小游戏
文章目录 三子棋实现思路 棋盘实现 玩家下棋 电脑下棋 判断输赢 小结语 ⚡text.c文件 ⚡game.c文件 ⚡game.h ⚓三子棋实现思路 三子棋游戏就是玩家和电脑之间轮流下棋,首先它的棋盘为3X3,我们玩家先下棋,然后到电脑,只要其中一方下的棋子连成了一条线即为胜利。 那么要实现游戏的前提首先是得有一个棋盘显示出来,然后把我们每一次下的棋到显示在屏幕上直到一方胜利或者和局。所以 我们第一步是要打印棋盘: 打印棋盘的前提是有数据可以打印,所以我们需要用到一个3X3的二维数组.
105 0
三子棋小游戏——C实现
三子棋小游戏——C实现
116 0
三子棋小游戏——C实现
三子棋游戏
三子棋游戏
87 0
|
9月前
|
存储
三子棋游戏的实现
三子棋游戏的实现
70 0
|
人工智能 C语言
C语言程序设计——三子棋游戏
C语言程序设计——三子棋游戏
127 0
C语言程序设计——三子棋游戏
|
C语言 C++
【C】三子棋 VS 扫雷
【C】三子棋 VS 扫雷
103 0
【C】三子棋 VS 扫雷
|
9月前
|
C语言
三子棋游戏(详解+代码)
三子棋游戏(详解+代码)
95 2
|
9月前
|
算法 C语言
三子棋小游戏(可改棋盘大小)
三子棋小游戏(可改棋盘大小)
86 0

热门文章

最新文章

相关实验场景

更多