用c语言实现三子棋

简介: 用c语言实现三子棋

首先创建三个文本框:game.h(放在头文件内)test.c game.c(放在源文件中)

首先进行框架的搭建(放在test.c文件中)

game.h

#pragma once
#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);//判断输赢

test.c

# define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include<stdio.h>
#include<time.h>
void menu() {//简易菜单的打印
  printf("*********************\n");
  printf("****   1.play *******\n");
  printf("****   0.exit********\n");
}
void game() {
  char board[ROW][COL] = { 0 };
  InitBoard(board, ROW, COL);//首先要对棋盘进行初始化
  DisplayBoard(board, ROW, COL);//在初始化之后展示棋盘
  while (1){
    char ret = 0;
    PlayerMove(board, ROW, COL);//玩家下棋
    ret=IsWin(board,ROW,COL);//判断输赢
    if (ret != ' C ') {
      break;
    }
  DisplayBoard(board, ROW, COL);//在玩家下棋之后展示棋盘
  ComputerMove(board, ROW, COL);//电脑下棋
  ret = IsWin(board, ROW, COL);//判断输赢
  if (ret != ' C ') {
    break;
  }
  DisplayBoard(board, ROW, COL);//在电脑下棋之后展示棋盘
  if (ret != ' * ') {
    printf("玩家赢\n");
  }
  else if (ret != ' # ') {
    printf("电脑赢\n");
  }
  else {
    printf("平局\n");
  }
  }
}
int main() {
  srand((unsigned int)(time(NULL)));//srand用于生成随机数
  int input = 0;
  do {
    menu();
    printf("请选择:\n");
    scanf("%d", &input);
    switch(input){
      case 1:
        game();
      case 0:
        printf("退出游戏\n");
        break;
      default:
        printf("选择错误\n");
        break;
    }
  } while (input);
  return 0;
}

 

 

game.c

# define _CRT_SECURE_NO_WARNINGS 
#include "game.h"
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;
  for (i = 0; i < row; i++)
  {
    //打印数据
    //printf(" %c | %c | %c ",board[i][0],board[i][1],board[i][2]);
    //打印分割信息
    //printf("---|---|---\n");
    //如果这样打印,我们就会发现每一行数据地下都有一条横杠,显然,这不是我们想要得到的结果,所以我们需要换一种方式
    int j = 0;
    for (j = 0; j < col; j++)//我们不妨简化一下打印的过程:打印一个数据,再在他的后面加上竖杠,这样会使得程序看起来简洁不少
    {
      printf(" %c ", board[i][j]);
      //最后一列不需要打印|,所以我们用if来限制条件
      if (j < col - 1)
        printf("|");
    }
    printf("\n");
    //再打印分割信息
    if (i < row - 1)//最后一行不用打印分割行
    {
      int j = 0;
      for (j = 0; j < col; j++)//有多少列,打印多少对应分隔符
      {
        printf("---");
        printf("|");
      }
      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);
    //但是要注意的是:玩家输入的坐标和数组的坐标不一致,所以我们要在玩家输入坐标的基础上减去1
    //同时还要检测输入的坐标是否合法
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (board[x - 1][y - 1] == ' ') {
        board[x - 1][y - 1] == ' * ';
        break;
      }
    }
    else {
      printf("输入的坐标非法\n");
    }
  }
}
void ComputerMove(char board[ROW][COL], int row, int col) {
  int x = 0;
  int y = 0;
  x = rand() % 3;//rand()用来生成随机值
  y = rand() % 3;//0到2
  while (1) {//如果被占用,重新生成坐标,只有下棋下对,才能结束循环
    if (board[x - 1][y - 1] == ' ') {
      board[x - 1][y - 1] == ' * ';
      break;
    }
  }
}
int isFull(char board[ROW][COL], int row, int col) {//如果满了 返回1 不满返回0
  for (int i = 0; i < row; i++)
  {
    for (int 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][0] == board[i][2] && board[i][0] != ' ') {
      return board[i][0];
    }
  }
  //列
  int j = 0;
  for (j = 0; j < row; j++) {
    if (board[0][j] == board[1][j] && board[2][j] == board[0][j] && board[0][j] != ' ') {
      return board[0][j];
    }
  }
  //斜对角线
  if (board[2][2] == board[1][1] && board[1][1] == board[0][0] && 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';//游戏继续
}
//如果没有人赢,就要判断是否平局
相关文章
|
6月前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
40 1
|
6月前
|
C语言
c语言简单三子棋
c语言简单三子棋
|
6月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
59 1
|
6月前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
5月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
30 1
|
6月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
65 1
|
6月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
76 1
|
5月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
6月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
52 0
【C语言入门小游戏】三子棋
|
6月前
|
C语言
【用C语言轻松搞定】三子棋(超详细教程)
【用C语言轻松搞定】三子棋(超详细教程)