自创三子棋,拓展版

简介: 自创三子棋,拓展版
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void init_board(char board[ROW][COL], int row, int col)
{
  int i, j ;
  for (i = 0; i < ROW; i++)
  {   
    for (j = 0; j < COL; j++)
    {     
      board[i][j] = ' ';
    }
  }
}
void print_board(char board[ROW][COL], int row, int col)
{
  int i, j;
  for (j = 0; j < col - 1; j++)
  {
    for (i = 0; i < row - 1; i++)
    {
        printf(" %c |", board[i][j]);
    }
    printf(" %c \n", board[i][j]);
    for (i = 0; i < row - 1; i++)
      {
          printf("---|");
      }
      printf("---\n");  
  }
  for (i = 0; i < row - 1; i++)
  {
    printf(" %c |", board[i][j]);
  }
  printf(" %c \n", board[i][j]);
}
void player_move(char board[ROW][COL], int row, int col)
{
  printf("棋盘大小为%d×%d,%d子连线为赢,现在你为先手。\n", ROW, COL, WIN);
  printf("玩家,“#”为你的棋子,“*”为我的棋子\n");
  printf("请输入你的想下的位置:>");
  while (1)
  {
    int x = 0, y = 0;
    scanf("%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("你输入的位置已经被填过了!,请重新输入:>");
    }
    else
      printf("输入错误!\n");
  }
}
void computer_move(char board[ROW][COL], int row, int col)
{
  printf("我思考一下....\n");
  Sleep(1500);
  while (1)
  {
    int x = rand() % row;
    int y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '*';
      break;
    }
  }
}
static int is_full(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++)
    {
      if (board[i][j] == ' ')
        return 0;
    }
  }
  return 1;
}
char who_win(char board[ROW][COL], int row, int col)
{
  int i, j;
  int j1,j2;
  for (j1 = 0; j1 < col; j1++)
  {
    for (i = 0; i <= row - WIN; i++)
    {
      for (j = i + 1; j < i + WIN; j++)
      {
        if (board[j][j1] != board[i][j1])
          break;
      }
      if (j == i + WIN && board[i][j1] != ' ')
        return board[i][j1];
    }
  }
  for (i = 0; i < row; i++)
  {
    for (j1 = 0; j1 <= col - WIN; j1++)
    {
      for (j2 = j1 + 1; j2 < j1 + WIN; j2++)
      {
        if (board[i][j2] != board[i][j1])
          break;
      }
      if (j2 == j1 + WIN && board[i][j1] != ' ')
        return board[i][j1];
    }
  }
  for (j1 = 0; j1 <= col - WIN; j1++)
  {
    for (i = 0; i <= row - WIN; i++)
    {
      for (j = i + 1, j2 = j1 + 1; j2 < j1 + WIN && j < i + WIN; j++, j2++)
      {
        if (board[j][j2] != board[i][j1])
          break;
      }
      if (j2 == j1 + WIN && j == i + WIN && board[i][j1] != ' ')
        return board[i][j1];
    }
  }
  for (j1 = col - 1; j1 >= COL - WIN - 1; j1--)
  {
    for (i = 0; i <= row - WIN; i++)
    {
      for (j = i + 1, j2 = j1 - 1; j2 > j1 - WIN && j < i + WIN; j++, j2--)
      {
        if (board[j][j2] != board[i][j1])
          break;
      }
      if (j2 == j1 - WIN && j == i + WIN && board[i][j1] != ' ')
        return board[i][j1];
    }
  }
  if (is_full(board, row, col))
    return 'Q';
  return 'C';
}
void menu()
{
  printf("##########################\n");
  printf("##########################\n");
  printf("######请选择一个数字######\n");
  printf("####1.进入三子棋游戏######\n");
  printf("#######0.退出游戏#########\n");
  printf("##########################\n");
  printf("##########################\n");
  printf("########################>");
}
void game()
{
  srand((unsigned int)time(NULL));
  char board[ROW][COL];
  char ret;
  init_board(board, ROW, COL);
  print_board(board, ROW, COL);
  while (1)
  {
    player_move(board, ROW, COL);
    system("cls");
    print_board(board, ROW, COL);
    ret = who_win(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
    computer_move(board, ROW, COL);
    system("cls");
    print_board(board, ROW, COL);
    ret = who_win(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
  }
  if (ret == '#')
    printf("玩家你太牛了\n再来一局吧!\n");
  else if (ret == '*')
    printf("嘻嘻,我赢了\n再来一局吧!\n");
  else if (ret == 'Q')
    printf("平局了...\n再来一局吧!\n");
}
void do_you_want()
{
  int option = 0, count = 0;
  do
  {
    menu();
    scanf("%d", &option);
    switch (option)
    {
    case 1:
      game();
      break;
    case 0:
    {
      printf("退出游戏!\n");
      break;
    }
    default:
      printf("请重新输入\n");
      break;
    }
  } while (option);
}

这是在源文件定义,这里我优化了三子棋,可以是四子棋等等,棋盘也可以是任何形式。

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 10 //你需要多少列的棋盘?
#define COL 10 //你需要多少行的棋盘?
#define WIN 5 //你想几子连成线为赢?
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
void init_board(char board[ROW][COL], int row, int col);
void print_board(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);
static int is_full(char board[ROW][COL], int row, int col);
char who_win(char board[ROW][COL], int row, int col);
void menu();
void game();
void do_you_want();

这个是在头文件申明

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
int main()
{
  do_you_want();
  return 0;
}
目录
相关文章
|
机器学习/深度学习 运维 监控
智能监控系统在运维中的应用与优势
传统的运维管理方式在面对日益复杂的IT系统时显得力不从心,智能监控系统的出现为运维工作带来了新的机遇。本文将探讨智能监控系统在运维中的应用与优势,介绍其工作原理以及如何有效地利用智能监控系统提升运维效率和质量。
404 2
|
JavaScript
antd树形控件遇到的一些坑
antd树形控件遇到的一些坑
|
小程序
微信小程序根据日期和时间进行排序
最近接手了一个小程序的项目,有这样一个需求要对列表进行日期和时间的排序,于是小试牛刀,操作了一番,终于搞出来,在这里给大家总结分享一下经验,希望对大家有一定的帮助
764 0
|
存储 弹性计算 负载均衡
阿里云服务器全方位介绍(产品优势、应用场景、使用须知等)
阿里云服务器全方位介绍(产品优势、应用场景、使用须知等)阿里云服务器是什么?云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,云服务器可以降低IT成本提升运维效率,免去企业或个人前期采购IT硬件的成本,阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器。阿里云服务器具有安全、稳定、弹性升降配、高性能、易用可扩展等优势
1472 0
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割(2)
基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割
|
编解码 自动驾驶 数据可视化
超越BEV视角 | 新型紧凑占用Transformer助力自动驾驶3D占用预测
超越BEV视角 | 新型紧凑占用Transformer助力自动驾驶3D占用预测
403 0
|
弹性计算 关系型数据库 数据库
使用ESC和RDS搭建个人博客
使用Centos8系统,搭建个人博客的过程和心得。
|
弹性计算 监控 安全
2023新手小白阿里云服务器配置选择指南
新手小白阿里云服务器配置选择指南2023,阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等,阿里云百科分享阿里云服务器配置选择方法,选择适合自己的云服务器配置
287 0
|
分布式计算 算法 Hadoop
Hadoop简介、安装与环境变量配置
Hadoop简介、安装与环境变量配置
607 1