Unity3D实现简易五子棋源码

本文实例为大家分享了Unity3d简易五子棋源码,供大家参考,具体内容如下

Unity3d部分

对C#源码进行了改写简化:

using UnityEngine;
using System.Collections;

public class chess : MonoBehaviour
{
  //四个锚点位置,用于计算棋子落点
  public GameObject LeftTop;
  public GameObject RightTop;
  public GameObject LeftBottom;
  public GameObject RightBottom;
  //主摄像机
  public Camera cam;
  //锚点在屏幕上的映射位置
  Vector3 LTPos;
  Vector3 RTPos;
  Vector3 LBPos;
  Vector3 RBPos;

  Vector3 PointPos;//当前点选的位置
  float gridWidth = 1; //棋盘网格宽度
  float gridHeight = 1; //棋盘网格高度
  float minGridDis; //网格宽和高中较小的一个
  Vector2[,] chessPos; //存储棋盘上所有可以落子的位置
  int[,] chessState; //存储棋盘位置上的落子状态
  enum turn { black, white };
  turn chessTurn; //落子顺序
  public Texture2D white; //白棋子
  public Texture2D black; //黑棋子
  public Texture2D blackWin; //白子获胜提示图
  public Texture2D whiteWin; //黑子获胜提示图
  int winner = 0; //获胜方,1为黑子,-1为白子
  bool isPlaying = true; //是否处于对弈状态

  void Start()
  {
    chessPos = new Vector2[15, 15];
    chessState = new int[17, 16];/*原来定义是new int[15, 15],这里将原来数组chessState上、下和右边各加一排数据,
    也就相当于在棋盘的上、下和右边各填加一排隐形的棋道。原因后面解释*/
    chessTurn = turn.black;

    //计算锚点位置
    LTPos = cam.WorldToScreenPoint(LeftTop.transform.position);
    RTPos = cam.WorldToScreenPoint(RightTop.transform.position);
    LBPos = cam.WorldToScreenPoint(LeftBottom.transform.position);
    RBPos = cam.WorldToScreenPoint(RightBottom.transform.position);

    //计算网格宽度
    gridWidth = (RTPos.x - LTPos.x) / 14;
    gridHeight = (LTPos.y - LBPos.y) / 14;
    minGridDis = gridWidth < gridHeight ? gridWidth : gridHeight;

    //计算落子点位置
    for (int i = 0; i < 15; i++)
    {
      for (int j = 0; j < 15; j++)
      {
        chessPos[i, j] = new Vector2(LBPos.x + gridWidth * j, LBPos.y + gridHeight * i);//这里和源程序定义稍有不同,这里i定位行,j为列
      }
    }
  }

  void Update()
  {
    //检测鼠标输入并确定落子状态
    if (isPlaying && Input.GetMouseButtonDown(0))
    {
      PointPos = Input.mousePosition;
      for (int i = 0; i < 15; i++)
      {
        for (int j = 0; j < 15; j++)
        {
          //找到最接近鼠标点击位置的落子点,如果空则落子
          if (Dis(PointPos, chessPos[i, j]) < minGridDis / 2 && chessState[i + 1, j] == 0)/*这里chessState行要加1,
            因为上、下和右边各多加了一排,要空出来,chessPos的i行对应chessState的i+1行*/
          {
            //根据下棋顺序确定落子颜色
            chessState[i + 1, j] = chessTurn == turn.black ? 1 : -1;//同理
            //落子成功,更换下棋顺序
            chessTurn = chessTurn == turn.black ? turn.white : turn.black;
          }
        }
      }
      //调用判断函数,确定是否有获胜方
      int re = result();
      if (re == 1)
      {
        Debug.Log("黑棋胜");
        winner = 1;
        isPlaying = false;
      }
      else if (re == -1)
      {
        Debug.Log("白棋胜");
        winner = -1;
        isPlaying = false;
      }
    }
    //按下空格重新开始游戏
    if (Input.GetKeyDown(KeyCode.Space))
    {
      for (int i = 0; i < 15; i++)
      {
        for (int j = 0; j < 15; j++)
        {
          chessState[i + 1, j] = 0;//同理
        }
      }
      isPlaying = true;
      chessTurn = turn.black;
      winner = 0;
    }
  }
  //计算平面距离函数
  float Dis(Vector3 mPos, Vector2 gridPos)
  {
    return Mathf.Sqrt(Mathf.Pow(mPos.x - gridPos.x, 2) + Mathf.Pow(mPos.y - gridPos.y, 2));
  }

  void OnGUI()
  {
    //绘制棋子
    for (int i = 0; i < 15; i++)
    {
      for (int j = 0; j < 15; j++)
      {
        if (chessState[i + 1, j] == 1)//同理
        {
          GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), black);
        }
        if (chessState[i + 1, j] == -1)//同理
        {
          GUI.DrawTexture(new Rect(chessPos[i, j].x - gridWidth / 2, Screen.height - chessPos[i, j].y - gridHeight / 2, gridWidth, gridHeight), white);
        }
      }
    }
    //根据获胜状态,弹出相应的胜利图片
    if (winner == 1)
    {
      GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), blackWin);
    }
    if (winner == -1)
      GUI.DrawTexture(new Rect(Screen.width * 0.25f, Screen.height * 0.25f, Screen.width * 0.5f, Screen.height * 0.25f), whiteWin);
  }
 //改写result函数
 /*解释:C语言中,这样的表达式:chessState[i]&&chessState[i+1]&&chessState[i+2]&&chessState[i+3]&&chessState[i+4],如果
   * chessState[i]为False,则不管B是真是假或者是异常都不会运行,利用这一点,在chessState的右边、上边和下边各加一行为0的数据,
   * 这样在判断连续五个棋子的状态时,就不用担心chessState数组的索引值超出范围。例如:chessState[i+4]的索引值i+4刚好超出范围,
   * 通过在原来数组chessState的上、下和右边个添加一排为0的数,这样chessState[i+3]==0,于是就可以避免引起异常,从而简化代码*/
  int result()
  {
    int flag = 0;
    if (chessTurn == turn.white)
    {
      for (int i = 1; i <= 15; i++)//这里的i从1开始
      {
        for (int j = 0; j <= 14; j++)//j不用变
        {
          if ((chessState[i, j] == 1 && chessState[i, j + 1] == 1 && chessState[i, j + 2] == 1 && chessState[i, j + 3] == 1 && chessState[i, j + 4] == 1)//向右横向
            || (chessState[i, j] == 1 && chessState[i + 1, j] == 1 && chessState[i + 2, j] == 1 && chessState[i + 3, j] == 1 && chessState[i + 4, j] == 1)//向上横向
            || (chessState[i, j] == 1 && chessState[i + 1, j + 1] == 1 && chessState[i + 2, j + 2] == 1 && chessState[i + 3, j + 3] == 1 && chessState[i + 4, j + 4] == 1)//向右上斜向
            || (chessState[i, j] == 1 && chessState[i - 1, j + 1] == 1 && chessState[i - 2, j + 2] == 1 && chessState[i - 3, j + 3] == 1 && chessState[i - 4, j + 4] == 1))//向右下斜向
          {
            flag = 1;
          }
        }
      }
    }
    else if (chessTurn == turn.black)
    {
      for (int i = 1; i <= 15; i++)//这里的i从1开始
      {
        for (int j = 0; j <= 14; j++)
        {

          if ((chessState[i, j] == -1 && chessState[i, j + 1] == -1 && chessState[i, j + 2] == -1 && chessState[i, j + 3] == -1 && chessState[i, j + 4] == -1)
            || (chessState[i, j] == -1 && chessState[i + 1, j] == -1 && chessState[i + 2, j] == -1 && chessState[i + 3, j] == -1 && chessState[i + 4, j] == -1)
            || (chessState[i, j] == -1 && chessState[i + 1, j + 1] == -1 && chessState[i + 2, j + 2] == -1 && chessState[i + 3, j + 3] == -1 && chessState[i + 4, j + 4] == -1)
            || (chessState[i, j] == -1 && chessState[i - 1, j + 1] == -1 && chessState[i - 2, j + 2] == -1 && chessState[i - 3, j + 3] == -1 && chessState[i - 4, j + 4] == -1))
          {
            flag = -1;
          }
        }
      }
    }
    return flag;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D开发实战之五子棋游戏

    前言 经过前面<Unity3D入门教程>系列讲解,再加上我们自己的探索,相信大家已经掌握了Unity3D的相关知识和基本方法.本文将使用前面学到的知识,开发一款简单的五子棋程序.本文用到的东西其实不多,非常简单.在最后我们会把完整工程的源代码发布出来,以供初学者参考.先展示一下最后的运行效果吧. 1 准备工作 (1)开发环境:Win10 + Unity5.4.1 (2)图片素材准备: 黑棋子和白棋子 棋盘 获胜提示图片 2 开发流程 上文提到的素材可以直接下载我们给出的这些图,也可以自己制作.

  • Unity3D实现简易五子棋源码

    本文实例为大家分享了Unity3d简易五子棋源码,供大家参考,具体内容如下 Unity3d部分 对C#源码进行了改写简化: using UnityEngine; using System.Collections; public class chess : MonoBehaviour { //四个锚点位置,用于计算棋子落点 public GameObject LeftTop; public GameObject RightTop; public GameObject LeftBottom; pub

  • Android Studio实现简易计算器源码

    本文实例为大家分享了Android Studio实现简易计算器的具体代码,供大家参考,具体内容如下 效果图: 源码: 布局样式: <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="horizontal&

  • vb简易计算器源码

    代码如下: 复制代码 代码如下: /** *Author:乌鸟heart *Version:1.0 */ Dim IntX As Double '全局变量,用于存储计算的数值 Dim IntOperation As Double '标记运算类型 Dim isBegin As Boolean '标记是否已经给IntX赋值 Public Sub Clear() '清空命令函数 screen.Caption = "" End Sub Public Sub SavaToIntX() Selec

  • JSP实用教程之简易页面编辑器的实现方法(附源码)

    前言 实现一个简易的页面编辑器是大家在学习jsp的时候经常会遇到的一个需求,发现网上这方便的资料不多,所以想着自己总结下,本文详细介绍了JSP简易页面编辑器的实现方法,下面话不多说,来一起看看详细的介绍: 需求 提供一页面,放置"帮助"."版权"文字内容,特点:静态页面,无须读数据库,只是应付字眼上频繁的修改:没有复杂的交互,无须 JavaScript:没有图片,不需要文件上传. 给出的方案:提供一页面和简易的后台管理,功能单一,只是编辑页面(只是修改字体.大小.粗

  • JSP实用教程之简易文件上传组件的实现方法(附源码)

    前言 本文主要给大家介绍的是关于JSP简易文件上传组件的实现方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 文件上传,包括但不限于图片上传,是 Web 开发中司空见惯的场景,相信各位或多或少都曾写过这方面相关的代码.Java 界若说文件上传,则言必称 Apache Commons FileUpload,论必及  SmartUpload.更甚者,Servlet 3.0 将文件上传列入 JSR 标准,使得通过几个注解就可以在 Servlet 中配置上传,无须依赖任何组件.使用第

  • Java五子棋单机版源码分享

    初学JavaGUI编程,就写了一个小游戏–五子棋. 目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊. 此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的. 源码已提交至GitHub,点击此处GitHub源码 以下列出其中的五子棋类: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; imp

  • Vue实现简易翻页效果源码分享

    源码如下: <html> <head> <meta charset="UTF-8"> <title>slidePage</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script> <style type="text/css"> *{ margin

  • C# 实现简易的串口监视上位机功能附源码下载

    实现上位机和下位机之间的通信,通常使用的是串口通信,接下来实现一个通过上位机和串口调试助手来完成串口通信测试. 首先创建一个WInfrom窗体应用工程文件,创建过程可参考  https://www.jb51.net/article/150973.htm 在创建好的工程下面,通过工具箱中已有的控件完成界面的搭建,如下图所示,为了方便初学者容易看懂程序,下图将控件的命名一并标注出来: 直接进入正题,将完整的工程代码黏贴出来: using System; using System.Collection

  • java实现简易超市管理系统 附源码下载

    java超市管理系统 1.0(含源文件,后续会继续优化~) 前言 一个月零零散散的时间学习了java,通过这次"超市管理系统"的练习,希望可以给一同开始学习java的朋友一些参考,更希望大佬们多多指点和批评~ 一.确定需求 程序概述: 小型超市商品销售管理系统选择小型超市的四类商品进行管理. 这四类商品是:食品.化妆品.生活用品和饮料(四个类). 每类商品都包含有商品名和商品利润 (其中包括商品的售价.进价.库存量).(五个属性) 每类不同的商品还有区别于其他商品的特殊信息(子类特有属

  • 教你用Python实现简易版学生信息管理系统(含源码)

    一.项目分析 1.首先定义一个存放基础学生信息列表 格式:list = [{学号:姓名,年龄:num,成绩:num },{--}] student1 = [\ {1:"jam",'age':17,'socer':99}, {2:'kol','age':18,'socer':89}, {3:'avlir','age':19,'socer':100}] 2.先搭建框架(主函数main()) if __name__ == '__main__': while True: menu() key

随机推荐