C语言实现三子棋

简介: C语言实现三子棋

一、编写思路🌍🌍

1、菜单函数🎯🎯

对于三子棋游戏需要首先给用户展现一个可供选择的菜单,就像游戏的开始界面,三子棋游戏有两个功能:下棋、退出。

void menu()
{
  printf("-------------------------------------\n");
  printf("----------     1.下棋     -----------\n");
  printf("----------     2.退出     -----------\n");
  printf("-------------------------------------\n");
}

2、初始化函数🐚🐚

创建一个二维数组,二维数组开始不存放任何数据,但是由于需要打印棋盘美观的情况下,就将二维数组的元素全部初始化为空格,可以用两层for循环来实现。

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

3、打印棋盘函数🌋🌋

三子棋游戏就需要将用户和电脑的下棋位置来打印到屏幕上,还提升用户的体验,同样利用for循环来实现,但是需要注意布局,增加‘_’和‘|’来增强美感。

void print(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++) 
    {
     printf(" %c ", board[i][j]);
     if (j < col - 1)
     {
       printf("|");
     }
    }
    printf("\n");
    if (i < row - 1)
    {
      for (int j = 0; j < col; j++)
      {
       printf("---");
       if (j < col - 1)
       {
         printf("|");
       }
      }
      
      printf("\n");
    }
    
  }
}

效果演示:

4、用户下棋函数💎💎

用户下棋时,主要是输入下的棋坐标,用户的坐标从1开始,但是在实际的内存中是从0,故在判断越界等操作时需要对用户所输入的坐标进行减一操作,除了判断是否越界,还需要判断用户所输入的坐标是否已经被占用。(用户所下的棋用‘*’表示)

void player_move(char board[ROW][COL], int row, int col)
{
  int m = 0 , n = 0;
  printf("请输入下的棋的坐标:");
  scanf("%d%d", &m, &n);
  if (m - 1 < row && n - 1 < col)
  {
    if (board[m-1][n-1] == ' ')
    {
      board[m-1][n-1] = '*';
    }
    else
    {
      printf("该位置已经被占用\n");
    }
  }
  else
  {
    printf("输入的坐标非法!\n");
  }
 
}

效果演示:

5、电脑下棋函数🎮🎮

三子棋就是人机对弈游戏,但是本款游戏电脑下棋没有只能化,只是简单的随机下棋,产生两个随机数并判断越界和未被占用的问题。(电脑所下的棋用'#表示)

void computer_move(char board[ROW][COL], int row, int col)
{
  srand((unsigned)time(NULL));
  int m = 0, n = 0;
  while (1)
  {
    m = rand() % ROW;
    n = rand() % COL;
    if (m< row && n < col)
    {
      if (board[m][n] == ' ')
      {
        board[m ][n ] = '#';
        break;
      }
    }
  }
}

效果演示:

6、判断输赢函数⛳⛳

判断输赢是游戏的一个重要部分,三子棋判断输赢的标准就是看用户和电脑谁先连成一条线,可以是某一行或者某一列、对角线、反对角线,还有当棋盘满的话就是平局,否则就继续。

char is_win(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    int flag = 1;
   for (int j = 0; j< col; j++)
    {
      
      if (board[i][0] != board[i][j])
      {
        flag = 0;
        break;
      }
      if (board[i][0] == ' ')
      {
        flag = 0;
        break;
      }
 
    }
   
   if (flag == 1)
   {
     return board[i][0];
   }
  }
  for (int j = 0; j < col; j++)
  {
    int flag = 1;
    for (int i = 0; i < row; i++)
    {
 
      if (board[0][j] != board[i][j])
      {
        flag = 0;
        break;
      }
      if (board[0][j] == ' ')
      {
        flag = 0;
        break;
      }
    }
    if (flag == 1)
    {
      
      return board[0][j];
    }
  }
  int flag = 1;
  for (int i = 1,j=1; i < row&& j < col; i++,j++)
  {
    
    if (board[i][j] != board[i - 1][j - 1])
    {
    flag = 0;
    break;
    }
    if (board[0][0]==' ')
    {
    flag = 0;
    break;
    }
  }
  if (flag == 1)
  {
    return board[0][0];
  }
  int tag = 1;
  for (int i = 1, j = col-2; i < row && j>=0; i++, j--)
  {
 
    if (board[i][j] != board[i - 1][j +1])
    {
      tag = 0;
      break;
    }
    if (board[0][col-1] == ' ')
    {
      tag = 0;
      break;
    }
  }
  if (tag== 1)
  {
    return board[0][col-1];
  }
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'C';
    }
  }
  return 'Q';
}

效果演示:

二、整体代码展示🏠🏠

1、game.h🚓🚓

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu();
void init(char board[ROW][COL], int row, int col);
void print(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

2、game.c🚜🚜

#include"game.h"
void menu()
{
  printf("-------------------------------------\n");
  printf("----------     1.下棋     -----------\n");
  printf("----------     0.退出     -----------\n");
  printf("-------------------------------------\n");
}
void init(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 print(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++) 
    {
     printf(" %c ", board[i][j]);
     if (j < col - 1)
     {
       printf("|");
     }
    }
    printf("\n");
    if (i < row - 1)
    {
      for (int j = 0; j < col; j++)
      {
       printf("---");
       if (j < col - 1)
       {
         printf("|");
       }
      }
      printf("\n");
    }
    
  }
}
void player_move(char board[ROW][COL], int row, int col)
{
  int m = 0 , n = 0;
  printf("请输入下的棋的坐标:");
  scanf("%d%d", &m, &n);
  if (m - 1 < row && n - 1 < col)
  {
    if (board[m-1][n-1] == ' ')
    {
      board[m-1][n-1] = '*';
    }
    else
    {
      printf("该位置已经被占用\n");
    }
  }
  else
  {
    printf("输入的坐标非法!\n");
  }
}
void computer_move(char board[ROW][COL], int row, int col)
{
  srand((unsigned)time(NULL));
  int m = 0, n = 0;
  while (1)
  {
    m = rand() % ROW;
    n = rand() % COL;
    if (m< row && n < col)
    {
      if (board[m][n] == ' ')
      {
        board[m ][n ] = '#';
        break;
      }
    }
  }
}
char is_win(char board[ROW][COL], int row, int col)
{
  for (int i = 0; i < row; i++)
  {
    int flag = 1;
   for (int j = 0; j< col; j++)
    {
      
      if (board[i][0] != board[i][j])
      {
        flag = 0;
        break;
      }
      if (board[i][0] == ' ')
      {
        flag = 0;
        break;
      }
 
    }
   
   if (flag == 1)
   {
     return board[i][0];
   }
  }
  for (int j = 0; j < col; j++)
  {
    int flag = 1;
    for (int i = 0; i < row; i++)
    {
 
      if (board[0][j] != board[i][j])
      {
        flag = 0;
        break;
      }
      if (board[0][j] == ' ')
      {
        flag = 0;
        break;
      }
    }
    if (flag == 1)
    {
      
      return board[0][j];
    }
  }
  int flag = 1;
  for (int i = 1,j=1; i < row&& j < col; i++,j++)
  {
    
    if (board[i][j] != board[i - 1][j - 1])
    {
    flag = 0;
    break;
    }
    if (board[0][0]==' ')
    {
    flag = 0;
    break;
    }
  }
  if (flag == 1)
  {
    return board[0][0];
  }
  int tag = 1;
  for (int i = 1, j = col-2; i < row && j>=0; i++, j--)
  {
 
    if (board[i][j] != board[i - 1][j +1])
    {
      tag = 0;
      break;
    }
    if (board[0][col-1] == ' ')
    {
      tag = 0;
      break;
    }
  }
  if (tag== 1)
  {
    return board[0][col-1];
  }
  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'C';
    }
  }
  return 'Q';
}

3、test.c🚗🚗

#include"game.h"
void game()
{
  char board[ROW][COL] = { 0 };
  char ret = 0;
  init(board, ROW, COL);
  print(board, ROW, COL);
  while (1)
  {
    player_move(board, ROW, COL);
    print(board, ROW, COL);
    ret = is_win(board, ROW, COL);
    if ('C' != ret)
    { 
      break;
    }
    computer_move(board, ROW, COL);
    printf("电脑下棋:\n");
    print(board, ROW, COL);
    if ('C' != ret)
    {
      break;
    }
  }
  if (ret == 'Q')
  {
    printf("平局!\n");
  }
  else if (ret == '*')
  {
    printf("您赢了!\n");
  }
  else if(ret == '#')
  {
    printf("电脑赢!\n");
  }
}
int main()
{
  char board[ROW][COL] = { 0 };
  init(board, ROW, COL);
  int option = 0;
  do
  {
    menu();
    printf("请选择:");
    scanf("%d", &option);
    switch (option)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出成功!\n");
      break;
    default:
      printf("您的输入有误,请重新输入!\n");
    }
  } while (option);
  return 0;
}

总结:以上就是实现三子棋游戏的所有代码,也可以在宏定义修改,可以扩展为五子棋游戏等。



目录
相关文章
|
1月前
|
C语言
c语言简单三子棋
c语言简单三子棋
|
1月前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
26 1
|
1月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
41 1
|
1月前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
1月前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
15 0
|
3天前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
7 1
|
1月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
27 1
|
1月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
28 1
|
1月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
28 0
【C语言入门小游戏】三子棋
|
15天前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)