unity2018.4.3f1实现五子棋游戏(三)

1、Xmind思维导图

在这里插入图片描述

2、C#和API知识准备

参考菜鸟教程:https://www.runoob.com/csharp/csharp-tutorial.html
建议先把C和C++学习了,上手C#会很快的

API:https://docs.unity3d.com/2017.2/Documentation/ScriptReference/UI.ScrollbarEditor.html
至于引擎的API接口,先看一下常用的,比如事件Event和UI等,后面用到在查或者百度。不建议谷歌翻译成中文,直接看英文比较好,不会有很复杂的英文的,要习惯看英文文档
在这里插入图片描述

3、代码实现

3.1、创建两个C#脚本文件

在这里插入图片描述

Create Empty

在这里插入图片描述

绑定脚本文件

在这里插入图片描述

定义一个枚举类型ChessType

在这里插入图片描述

颜色区分chessColor+调用下棋方法PlayerChess()

在这里插入图片描述
在这里插入图片描述
棋盘中心应该是(7,7),在UI里面是和摄像机(0,0)对应的,不想改变UI的时候还要移动摄像机,所以选择在代码里面把x、y轴坐标加7

Camera.main.ScreenToWorldPoint:转换为世界坐标
Input.mousePosition鼠标输入坐标

Ctrl + S 保存代码,在unity中Ctrl + R刷新一下运行

打印坐标

在这里插入图片描述
日志在 WIndow – Console 可以拖到下面

观察发现这个坐标不会四舍五入,所以在代码里面加近似值0.5

在这里插入图片描述

定义和初始化二维数组

在这里插入图片描述

当前轮到那个棋子

在这里插入图片描述

棋子预制体对象数组

在这里插入图片描述

下棋间隔时间

在这里插入图片描述

是否还可以继续下棋

在这里插入图片描述

实现下棋方法

因为存在一个下棋等待时间,就是正常人下棋的思考时间,所以我们实现下棋方法的函数要有返回值,返回是否下棋成功。到某人下棋,没有按下棋子,就计时器一直计时,当按下那一刻,又把等待时间置零

确定更新函数

在这里插入图片描述
显然,我们不太想让棋子抖动吧,正常下子立即显示,所以我们选择FixedUpdate()来更新

Edit->Project Setting->time 找到Fixed timestep
在这里插入图片描述
在这里插入图片描述

限定条件

1、游戏正在进行时
2、棋子落子地方,x和y轴范围(0~14),因为棋盘是15x15
3、生成预制体坐标的坐标要减7,这个之前有说的,鼠标坐标和我们棋盘坐标不一样,生成的时候还是以unity自带的坐标为准,近似值我们是加了7.5f,所以这个时候也是带着0.5f的近似值
4、生成以后,数组中黑子存1,白字存2
5、判断输赢,双人对战看谁先连成5子就ok了,这个会单独来说,涉及单机涉及算法,也会单独写一篇博客来说
6、生子成功,换手
在这里插入图片描述

单例模式

参考:https://www.cnblogs.com/zhili/p/SingletonPatterm.html

在该游戏中,对于棋盘这个类,我们只需要拥有一个全局对象就可以了。

举一个小例子,在windows桌面上,我们已经打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。

在这里插入图片描述
在这里插入图片描述

Awake()和Start()

Awake():初始化函数,在游戏开始时系统自动调用。一般用来创建变量之类的东西
Start():初始化函数,在所有Awake函数运行完之后(一般是这样,但不一定),在所有Update函数前系统自动条用。一般用来给变量赋值
所以我们在Awake()的时候把当前对象赋值给_instance
在这里插入图片描述

棋子类开始调用

在这里插入图片描述

操作unity

改成2,黑白两个预制体拖入
在这里插入图片描述
在这里插入图片描述
ctrl+d再创建一个白子对象
在这里插入图片描述
在这里插入图片描述

运行游戏

点击的时候有时候会点不到,那是因为我们设置了0.4s的间隔
视频链接:https://live.csdn.net/v/118305

优化

在这里插入图片描述
运行游戏发现,创建这些对象都在这里,不太好看,我们可以指定生成的地方
在这里插入图片描述
在这里插入图片描述
位置坐标归零

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再次运行游戏
在这里插入图片描述

4、代码源码

4.1 Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {
	 
	public ChessType chessColor = ChessType.Black;

    private void FixedUpdate()
    {
        if(chessColor == ChessBoard.Instance.turn && ChessBoard.Instance.waitTime > 0.4f)
            PlayerChess();
    }

    public void PlayerChess()
    {
		//0表示点击鼠标左键,1表示点击鼠标右键,2是中建
		if(Input.GetMouseButtonDown(0)){
			Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            //print((int)(pos.x + 7.5f) + " " + (int)(pos.y + 7.5f));
            if (ChessBoard.Instance.PlayChess(new int[2] { (int)(pos.x + 7.5f), (int)(pos.y + 7.5f) }))
                ChessBoard.Instance.waitTime = 0;
		}   
	}
}

4.2 ChessBoard.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChessBoard : MonoBehaviour {

    private static ChessBoard _instance;

    public int[,] grid;
    public ChessType turn = ChessType.Black;
    public GameObject[] prefabs;
    public float waitTime = 0;
    public bool gameState = true;

    Transform parent;

    public static ChessBoard Instance
    {
        get
        {
            return _instance;
        }

        set
        {
            _instance = value;
        }
    }

    private void Awake()
    {
        if(Instance == null)
        {
            _instance = this;
        }
    }


    // Use this for initialization
    void Start () {
        parent = GameObject.Find("Parent").transform;
        grid = new int[15, 15];
    }

    private void FixedUpdate()
    {
        waitTime += Time.deltaTime; 
    }

    public bool PlayChess(int[] pos)
    {
        if (!gameState) return false;
        pos[0] = Mathf.Clamp(pos[0], 0, 14);
        pos[1] = Mathf.Clamp(pos[1], 0, 14);

        if (grid[pos[0], pos[1]] != 0) return false;

        if(turn == ChessType.Black)
        {
            GameObject go = Instantiate(prefabs[0], new Vector3(pos[0] - 7, pos[1] - 7),Quaternion.identity);
            go.transform.SetParent(parent);
            grid[pos[0], pos[1]] = 1;
            //判断输赢
            if (CheckIsWin(pos))
            {

            }
            turn = ChessType.White;

        }else if(turn == ChessType.White){
            GameObject go = Instantiate(prefabs[1], new Vector3(pos[0] - 7, pos[1] - 7), Quaternion.identity);
            go.transform.SetParent(parent);
            grid[pos[0], pos[1]] = 2;
            //判断输赢
            if (CheckIsWin(pos))
            {

            }
            turn = ChessType.Black;
        }

        return true;
    }

    public bool CheckIsWin(int[] pos)
    {
        return false;
    }
}

//玩家类型
public enum ChessType{
	Watch,
	Black,
	White,
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoduangg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值