小游戏:三子棋的代码实现

简介: 小游戏:三子棋的代码实现

文章目录:

       一:定义函数,打印游戏菜单。

       二:宏定义打印棋盘,以及创建新文件以及头文件,例:game.c和game.h

               1:定义函数初始化棋盘

               2:定义函数打印棋盘以及分割线(重难点)

      三:玩家下棋

       四:电脑下棋

       五:判断输赢(重难点)

       六:代码全析总结


一、打印菜单

  • 相信大家在打单机游戏的时候,肯定会看到一个菜单(目录),也就是在刚刚进入游戏的时候看到的选项,需要玩家输入数字进行选择
  • 选择1(进入游戏)
  • 选择0(退出游戏)
void venu()
{
  printf("---------------------------\n");
  printf("---1:开始游戏    2:结束游戏\n");
  printf("---------------------------\n");
}

在主函数内进行游戏规划以及实现代码框架

在函数中会叫用rand()和srand()函数以及time()函数,注意记得调用其头文件:

#include<stdlib.h>以及#include<time.h>头文件,同时注意格式和运行的逻辑顺序

int main()
{
  //打印游戏菜单
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    venu();
    printf("请输入数字\n");
    scanf("%d", &input);
    switch (input)
    {//实现game游戏函数
    case 1:game(); break;
    case 0:printf("结束游戏\n"); break;
    default:printf("输入错误,请重新输入\n"); break;
    }
  } while (input);  
  return 0;
}


二、棋盘打印

因为棋盘类似于一个二维数组,所以用一个二维数组来接收下的棋子的“字符”;

  1:定义函数初始化棋盘

void Initboard(char board[Row][Col], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      board[i][j] = ' ';
    }
  }
}


2:定义函数打印棋盘以及分割线(重难点)

为了格式美观,会将最后一列的格式线进行删除。

当for在行循环中进行到最后一行和一列时,注意:此时的行格式线和列格式线都要进行删除

void playboard(char board[Row][Col], int row, int col)
{
  int i = 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");
    //控制行变化,不打印row最后一行
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("---");
        //控制不打印col最后一列
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}


三:玩家下棋

那就是玩家(也就是你自己)下一步,然后电脑在下一步,直到谁赢,输,平局,所以无论在你下完一步后还是在电脑下完一步后,都要判断这局游戏的输赢,但是判断三字棋局的输赢,除了三字连成线,也就是横三条,竖三条,斜两条,可表示输赢,还有如果棋子下完了棋盘还没有分出胜负,那就是平局,其他情况就继续下棋。

用函数 Playgame();表示玩家下一步棋子,用字符‘*’表示,使用玩家输入的值,然后判断该坐标是否被占用,如果被占用则再次输入值进行填充表格

void playgame(char board[Row][Col], int row, int col)
{ 
  int x = 0, y = 0;   
  while (1)
  { printf("请玩家输入下棋坐标->");
    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("该坐标以被占用,请重新输入\n");        
      }
    }
    else
    {
      printf("输入错误,请重新输入\n");
    }
  }
}


四:电脑下棋

 使用Computergame()函数; 表示电脑下一步棋,用字符‘#’表示,在使用rand()函数,使电脑生成随机值,然后判断该坐标是否被占用,如果被占用则再次随机生成值进行填充表格。

 

void computergame(char board[Row][Col], int row, int  col)
{
  int x = 0, y = 0; 
  printf("电脑下棋\n");
  while (1)
  { x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x ][y ] = '#';
      break;
    }
  }
}


五:判断输赢(重难点)

再完成一个函数 Iswin();判断棋局输赢,需要一个返回值,如果玩家赢返回‘’;如果输返回‘#’,平局返回‘Q’,继续则返回‘C’

char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
  
  //判断行是否相同
for (i = 0; i < row; i++)
{  
  if (board[i][0] == ' ')
    continue;
  count = 0;
    for (j = 0; j < col-1; j++)
    {
      if (board[i][j] == board[i][j + 1])
        count++;
    }
    if(count==row-1)
    return board[i][0];
  }
  //判断列是否相同
for (i = 0; i < col; i++)
{
  if (board[0][i] == ' ')
    continue;
  count = 0;
  for (j = 0; j < row - 1; j++)
  {
    if (board[j][i] == board[j + 1][i])
      count++;
  }
  if(count==col-1)
  return board[0][j];
}
  //判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
  if (board[0][0] == ' ')
    break;  
  if (board[i][i] == board[i + 1][i + 1])
    count++;
  if (count == row-1)
    return board[i][i];
}
  //判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
  if (board[0][col-1] == ' ')
    break;
  
  if (board[i][j] == board[i+1][j-1])
    count++;
  if (count == row - 1)
    return board[i][j];
}
  //判断是否和棋
count = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'c';
      else
        count++;
    }
  }
  if (count == (row * col))
    return 'Q';
}


 六:代码全析总结

第一部分:主函数  例:源.c

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//打印菜单
void venu()
{
  printf("---------------------------\n");
  printf("---1:开始游戏    2:结束游戏\n");
  printf("---------------------------\n");
}
void game()
{
  char board[Row][Col] = { 0 };
  //1:给board字符数组覆空格初始值
  Initboard(board, Row,Col);
  //2:打印表格
  playboard(board, Row, Col);
  char ret = 0;
  while (1)
  {//玩家下棋
    playgame(board, Row, Col);
    playboard(board, Row, Col);
    //判断谁赢
    ret=iswin(board, Row, Col);
    if (ret != 'c')
      break;
    //电脑下棋
    computergame(board, Row, Col);
    playboard(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()
{
  //打印游戏菜单
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    venu();
    printf("请输入数字\n");
    scanf("%d", &input);
    switch (input)
    {//实现game游戏函数
    case 1:game(); break;
    case 0:printf("结束游戏\n"); break;
    default:printf("输入错误,请重新输入\n"); break;
    }
  } while (input);  
  return 0;
}


第二部分:实现三子棋的游戏头文件

#pragma once
#define Row 3
#define Col 3
//覆初始值
void Initboard(char board[Row][Col], int row, int col);
//打印表格
void playboard(char board[Row][Col], int row, int col);
//玩家下棋
void playgame(char board[Row][Col], int row, int col);
void computergame(char board[Row][Col], int row,int  col);
char iswin(char board[Row][Col], int row, int  col);


第三部分:(核心)游戏代码的实现

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
void Initboard(char board[Row][Col], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
      board[i][j] = ' ';
    }
  }
}
void playboard(char board[Row][Col], int row, int col)
{
  int i = 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");
    //控制行变化,不打印row最后一行
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("---");
        //控制不打印col最后一列
        if (j < col - 1)
          printf("|");
      }
    }
    printf("\n");
  }
}
void playgame(char board[Row][Col], int row, int col)
{ 
  int x = 0, y = 0;   
  while (1)
  { printf("请玩家输入下棋坐标->");
    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("该坐标以被占用,请重新输入\n");        
      }
    }
    else
    {
      printf("输入错误,请重新输入\n");
    }
  }
}
void computergame(char board[Row][Col], int row, int  col)
{
  int x = 0, y = 0; 
  printf("电脑下棋\n");
  while (1)
  { x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x ][y ] = '#';
      break;
    }
  }
}
char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
  
  //判断行是否相同
for (i = 0; i < row; i++)
{  
  if (board[i][0] == ' ')
    continue;
  count = 0;
    for (j = 0; j < col-1; j++)
    {
      if (board[i][j] == board[i][j + 1])
        count++;
    }
    if(count==row-1)
    return board[i][0];
  }
  //判断列是否相同
for (i = 0; i < col; i++)
{
  if (board[0][i] == ' ')
    continue;
  count = 0;
  for (j = 0; j < row - 1; j++)
  {
    if (board[j][i] == board[j + 1][i])
      count++;
  }
  if(count==col-1)
  return board[0][j];
}
  //判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
  if (board[0][0] == ' ')
    break;  
  if (board[i][i] == board[i + 1][i + 1])
    count++;
  if (count == row-1)
    return board[i][i];
}
  //判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
  if (board[0][col-1] == ' ')
    break;
  
  if (board[i][j] == board[i+1][j-1])
    count++;
  if (count == row - 1)
    return board[i][j];
}
  //判断是否和棋
count = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 'c';
      else
        count++;
    }
  }
  if (count == (row * col))
    return 'Q';
}

最后真诚的祝愿每一位代码人都能够实现~~~~

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给一个一键三连,感谢。

相关文章
|
前端开发 数据库 开发者
氚云丨开发课— 02 一般控件的前后端操作| 学习笔记
快速学习氚云丨开发课— 02 一般控件的前后端操作。
氚云丨开发课— 02 一般控件的前后端操作| 学习笔记
|
4月前
|
算法 定位技术
蓝牙室内定位核心技术解析:RSSI 与 AOA 的测距原理对比与精度升级逻辑
本文解析蓝牙室内定位核心技术,对比RSSI与AOA的测距原理,深入探讨从RSSI到AOA在精度、误差控制和硬件适配方面的升级逻辑,揭示两者如何互补满足不同场景需求。
|
4月前
|
API 开发者
1688买家/卖家店铺订单API接口指南
1688店铺订单API提供订单查询、详情获取、状态更新等功能,支持与ERP、CRM系统集成。可按条件筛选订单、获取商品及收货信息,同步发货与物流状态,并进行取消订单等操作。使用时需注意密钥授权、调用频率及异常处理,提升订单管理效率。
|
机器学习/深度学习 算法
【Matlab智能算法】PSO优化(双隐层)BP神经网络算法
【Matlab智能算法】PSO优化(双隐层)BP神经网络算法
|
6月前
|
JavaScript Java 关系型数据库
基于springboot的计算机在线考试管理系统
本系统基于Spring Boot、Java、Vue与MySQL,构建高效安全的在线考试管理平台,推动教育信息化发展。
|
6月前
|
安全 数据可视化 Java
AiPy开发的 Spring 漏洞检测神器,未授权访问无所遁形
针对Spring站点未授权访问问题,现有工具难以检测如Swagger、Actuator等组件漏洞,且缺乏修复建议。全新AI工具基于Aipy开发,具备图形界面,支持一键扫描常见Spring组件,自动识别未授权访问风险,按漏洞类型标注并提供修复方案,扫描结果可视化展示,支持导出报告,大幅提升渗透测试与漏洞定位效率。
|
9月前
|
数据采集 数据可视化 JavaScript
用Python采集CBC新闻:如何借助海外代理IP构建稳定采集方案
本文介绍了如何利用Python技术栈结合海外代理IP采集加拿大CBC新闻数据。内容涵盖使用海外代理IP的必要性、青果代理IP的优势、实战爬取流程、数据清洗与可视化分析方法,以及高效构建大规模新闻采集方案的建议。适用于需要获取国际政治经济动态信息的商业决策、市场预测及学术研究场景。
|
11月前
|
安全 算法 物联网
RFID人员定位管理
RFID人员管理基于射频识别技术,通过标签与读写器实现人员身份识别和定位跟踪。广泛应用于工厂、医院、校园、商场等场景,提升生产效率、安全保障及服务质量。系统由RFID标签、阅读器和后台管理系统组成,具备实时性强、精度高、非接触式等优势,可记录人员轨迹,助力管理决策。尽管存在成本与安全性挑战,但随着技术进步,RFID人员管理系统将在更多领域发挥重要作用。
|
12月前
【📕分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
本文深入剖析了Redisson中可重入锁的释放锁Lua脚本实现及其获取锁的两种方式(阻塞与非阻塞)。释放锁流程包括前置检查、重入计数处理、锁删除及消息发布等步骤。非阻塞获取锁(tryLock)通过有限时间等待返回布尔值,适合需快速反馈的场景;阻塞获取锁(lock)则无限等待直至成功,适用于必须获取锁的场景。两者在等待策略、返回值和中断处理上存在显著差异。本文为理解分布式锁实现提供了详实参考。
462 11
【📕分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
|
12月前
|
运维 监控 安全
Linux 面板推荐:Websoft9
Websoft9 是一款高效 Linux 服务器管理面板,支持一键部署 200+ 开源应用,提供全生命周期安全防护与轻量化资源占用,适配主流系统,适合开发者及企业快速搭建业务环境
400 2

热门文章

最新文章