c语言简单三子棋

简介: c语言简单三子棋

基于VS2019的简单三子棋

最终实现

image.png

代码组成及其解析

1.game.h部分

#pragma once
#include<stdio.h>//后面调用头文件“game.h”可直接调用<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);

2.game.c

#include"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
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] = ' ';
    }
  }
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 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");
    //再打印分割行
    if (i < row - 1)
    {
      int j = 0;
      for (j = 0; j < col; j++)
      {
        printf("---");
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}
 
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋\n");
 
  while (1)
  {
    printf("请输入要下棋的坐标:>");
    scanf_s("%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 ComputerMove(char board[ROW][COL], int row, int col)
{
  printf("电脑下棋\n");
  int x = 0;
  int y = 0;
  while (1)
  {
    x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')//如果生成的坐标不被占用就下棋
    {
      board[x][y] = '#';
      break;//下棋成功跳出
    }
  }
}
 
static int IsFull(char board[ROW][COL], int row, int col)//static 定义 仅在源文件内使用,用于后面判断平局
{
  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;
}
 
 
//玩家赢 - '*'
//电脑赢 - '#'
//平局 --- 'Q'
//游戏继续-'C'
 
char IsWin(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][0] != ' ')
    {
      return board[i][0];//通过返回值判断是玩家赢还是电脑赢,与之前定义的玩家下棋“*”电脑下棋为"#"相对应
    }
  }
  //判断三列
  for (i = 0; i < col; i++)
  {
    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
    {
      return board[0][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 (IsFull(board, row, col))
  {
    return 'Q';
  }
 
  return 'C';
}

3.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
 void menu()
{
  printf("**********************************\n");
  printf("********     1.play       ********\n");
  printf("********     0.exit       ********\n");
  printf("**********************************\n");
}
 void game()
 {
   char ret = 0;
   char board[ROW][COL];
   //开始的时候,数组的内容应该是全部空格
   InitBoard(board, ROW, COL);
   DisplayBoard(board, ROW, COL);
   //下棋
   while (1)
   {
     PlayerMove(board, ROW, COL);
     DisplayBoard(board, ROW, COL);
     //判断输赢
     ret = IsWin(board, ROW, COL);
     if (ret != 'C')
     {
       break;
     }
     ComputerMove(board, ROW, COL);
     DisplayBoard(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()
{
  int input = 0;
  srand((unsigned int)time(NULL));//强制类型转换生成随机数
  do
  {
    menu();
    printf("请选择:  ");
    scanf_s("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择\n");
      break;
    }
  } while(input);
}
相关文章
|
7月前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
41 1
|
7月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
62 1
|
7月前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
7月前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
27 0
|
6月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
30 1
|
7月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
72 1
|
7月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
83 1
|
7月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
54 0
【C语言入门小游戏】三子棋
|
6月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
7月前
|
C语言
【用C语言轻松搞定】三子棋(超详细教程)
【用C语言轻松搞定】三子棋(超详细教程)