https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5

第1章 熟悉Unity软件的操作

第2章 打地鼠 (已看)

第3章 俄罗斯方块

第4章 打砖块 (已看)

第5章 三消 (已看)

第6章 翻牌子

第7章 连连看

第8章 拼图

第9章 推箱子

第10章 炸弹人

第11章 华容道

第12章 横板跑酷

第13章 扫雷

第14章 贪吃蛇

第15章 五子棋

第16章 跳棋

第17章 吃豆人

第18章 斗地主

第19章 坦克大战

2111

第1章 熟悉Unity软件的操作

  1.1 可多平台发布的Unity游戏引擎

  1.2 Unity游戏引擎的下载和安装

    1.2.1 Unity的下载

    1.2.2 Unity的安装

    1.2.3 Unity的注册

    1.2.4 启动Unity

  1.3 认识Unity的编辑界面

    1.3.1 软件标题栏

    1.3.2 主菜单

    1.3.3 Project项目资源窗口

    1.3.4 Hierarchy层级窗口

    1.3.5 Scene场景窗口

    1.3.6 Inspector组件属性面板

    1.3.7 Game游戏预览窗口

    1.3.8 Console控制台

  1.4 自定义窗口布局

    1.4.1 使用Unity内置的窗口布局功能

    1.4.2 自定义窗口布局

  1.5 Unity中定义的重要概念

    1.5.1 资源(Assets)

    1.5.2 工程(Project)

    1.5.3 场景(Scenes)

    1.5.4 游戏对象(GameObject)

    1.5.5 组件(Component)

    1.5.6 脚本(Scripts)

    1.5.7 预置(Prefabs)

第2章 打地鼠

  2.1 游戏简介

《打地鼠》(原名: Whac-A-Mole)最早可以追溯到1976年创意工程股份有限公司(Creative Engineering,Inc.)推出的一款有偿街机游戏.这款游戏能够提高人体大脑和身体的协调能力,增强臂力, 锻炼身体,深受大众的喜爱. 在游戏中, 玩家要在规定时间内,敲打一只只从地洞力冒出头的傻地鼠,从而获得游戏胜利.但是作为掌机,如NDS或智能手机等是不可能直接用锤子去敲打屏幕的, 取而代之的便是NDS触控笔或者手指

  2.2 游戏规则

这个游戏的游戏规则是,在一定的时间内,地鼠随机出现在九个洞口中, 玩家要在它出现的时候击中它,击中加分,反之地鼠会自动消失,时间耗尽则游戏结束

随着游戏时间的减少, 老鼠出现的频率越来越高,存在的时间也越来越短,游戏难度逐步上升

  2.3 程序思路

    2.3.1 洞口的排列

利用一个3 x 3 的二维数组或者一个一维数组来表示地图中的9个洞口

    2.3.2 地鼠出现频率

public void start() {
    InvokeRepeating(, );
}

public void canAppear() {
    InvokeRepeating(,);
}

    2.3.3 单个地鼠设置

if (未被点击) {
    Destroy(this.gameObject, 3.0f);
} else {
    Destroy(this.gameObject);
}

    2.3.4 游戏时间和分数

    2.3.5 游戏流程图

  2.4 程序实现

    2.4.1 前期准备

    2.4.2 设置洞口

    2.4.3 单只地鼠的出现和消失

    2.4.4 地鼠的随机出现和出现频率

    2.4.5 时间, 分数和其他.

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

/// <summary>
/// 地鼠被击打以后调用该函数
/// </summary>
public class Done_Beaten : MonoBehaviour {

    public int id;
    /// <summary>
    /// 在点击后3.5s销毁该地鼠,将洞口的isAppear值设置为false
    /// </summary>
    void Update () {
        Destroy(gameObject, 0.35f);
        FindObjectOfType<Done_GameControl>().holes[id].isAppear = false;
    }
}

using System.Collections;
using UnityEngine;

/// <summary>
/// 鼠标追踪
/// </summary>
public class Done_ChangeCursor : MonoBehaviour
{
    public Texture2D UserCursor;
    public Texture2D UserClickCursor;
    private bool isClicked = false;

    void Start ()
    {
        //在游戏界面内隐藏系统光标
        Cursor.visible = false;
    }

    /// <summary>
    /// 时时判断鼠标点击状态,便于切换图像
    /// </summary>
    void Update ()
    {
        ))
        {
            isClicked = true;
        }
        else
        {
            isClicked = false;
        }
    }

    void OnGUI ()
    {
        //获取鼠标当前位置
        Vector2 mouse_pos = Input.mousePosition;

        //鼠标点击与否显示相应的图片
        if (isClicked == false)
        {
            GUI.DrawTexture(, ), UserCursor);
        }
        else
        {
            GUI.DrawTexture(, ), UserClickCursor);
        }
    }

}

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

/// <summary>
/// 游戏总控制脚本
/// </summary>
public class Done_GameControl : MonoBehaviour {

    public GameObject Gophers;
    public int PosX, PosY;

    public TextMesh timeLabel;
    public float time = 30.0f;
    ;

    /// <summary>
    /// 设定一个地洞类,存储地洞的坐标以及是否出现的布尔值
    /// </summary>
    public class Hole {

        public bool isAppear;
        public int HoleX;
        public int HoleY;

    }

    public Hole[] holes;

    /// <summary>
    /// Awake函数实际上比Start函数调用的更早
    /// 在场景初始化的时候,将每个洞口的坐标值存入一维数组中,并将每一个洞口的isAppear值设定为false
    /// (-2,0) (0,0) (2,0)
    /// (-2,-1)(0,-1)(2,-1)
    /// (-2,-2)(0,-2)(2,-2)
    /// </summary>
    void Awake() {

        PosX = -;
        PosY = -;
        holes = ];
        ; i < ; i++)
        {
            ; j < ; j++)
            {
                holes[i *  + j] = new Hole();
                holes[i *  + j].HoleX = PosX;
                holes[i *  + j].HoleY = PosY;
                holes[i *  + j].isAppear = false;

                PosY++;
            }
            PosY = -;
            PosX = PosX + ;
        }
    }
    /// <summary>
    /// 在游戏场景开始后延时调用canAppear函数,从第0秒开始,每隔十秒调用一次
    /// </summary>
    void Start () {

        InvokeRepeating(, );

    }

    /// <summary>
    /// 游戏时间控制
    /// </summary>
    void Update () {

        //时间以秒的速度减少,并在timeLabel里显示当前剩余时间(一位小数)
        time -= Time.deltaTime;
        timeLabel.text = "Time: " + time.ToString("F1");

        //当时间耗尽,调用GameOver函数
        ) {
            GameOver();
        }

    }

    /// <summary>
    /// 从第0秒开始调用函数,每隔1秒调用一次
    /// </summary>
    public void CanAppear() {

        InvokeRepeating(,);

    }

    /// <summary>
    /// 地鼠生成函数
    /// </summary>
    public void Appear()
    {
        //当前地洞可以生成地鼠的条件: isAppear = false
        //随机生成i值选择洞口,直到符合条件的洞口被选中
        , );
        while (holes[i].isAppear == true){
            i = Random.Range(, );
        }
        //debug只是用来打印当前的坐标,便于观察,并不会影响游戏运行(可写可不写)
        Debug.Log(holes[i].HoleX + "," + holes[i].HoleY);

        //选定洞口以后,在洞口的坐标上生成地鼠,传递洞口id,将当前洞口的isAppear值改为true
        Instantiate(Gophers, new Vector3(holes[i].HoleX, holes[i].HoleY + 0.4F, -0.1F), Quaternion.identity);
        Gophers.GetComponent<Done_Gophers>().id = i;
        holes[i].isAppear = true;

    }

    /// <summary>
    /// 游戏结束函数
    /// </summary>
    void GameOver() {
        time = ;
        timeLabel.text = "Time: 0";

        //将所有延时调用函数全部取消
        CancelInvoke();

        Debug.Log("game over");
    }
}

using UnityEngine;

/// <summary>
/// 地鼠类
/// </summary>
public class Done_Gophers : MonoBehaviour {

    public GameObject beaten;

    public int id;

    /// <summary>
    /// 地鼠出现后,如果未被点击,将在三秒后自动销毁,将相应洞口的isAppear值设置为false
    /// </summary>
    void Update () {

        Destroy(this.gameObject,3.0f);
        FindObjectOfType<Done_GameControl>().holes[id].isAppear = false;
    }

    /// <summary>
    /// 鼠标点击
    /// </summary>
    void OnMouseDown() {
        Debug.Log("点击");

        //在相同的位置生成一个被击打图像的地鼠
        GameObject g;
        g = Instantiate(beaten, gameObject.transform.position, Quaternion.identity);
        g.GetComponent<Done_Beaten>().id = id;

        //增加分数
        FindObjectOfType<Done_GameControl>().score += ;
        int scores = FindObjectOfType<Done_GameControl>().score;
        GameObject.Find("Score").gameObject.GetComponent<TextMesh>().text = "Score: " +scores.ToString();

        //FindObjectOfType<>().text = score.ToString();
        //GetComponentInChildren<TextMesh>().text = score.ToString();
        //scoreLabel.text = "Score: " + score; 

        //在0.1s后摧毁当前生成的地鼠
        Destroy(this.gameObject, 0.1f);

    }

}

using UnityEngine;
using UnityEditor.SceneManagement;

/// <summary>
/// 重新开始函数
/// </summary>
public class Done_Restart : MonoBehaviour {
    /// <summary>
    /// 按钮被点击以后,重新调用游戏场景
    /// </summary>
    public void OnMouseDown() {
        Debug.Log("restart");
        EditorSceneManager.LoadScene("Done_mole");
    }
}

第3章 俄罗斯方块

  3.1 游戏简介

  3.2 游戏规则

  3.3 游戏实现思路

    3.3.1 随机生成方块

    3.3.2 地图的生成

    3.3.3 判断方块是否都在边界内

    3.3.4 判断是否碰到其他方块

    3.3.5 检查是否满行

    3.3.6 删除填满的行

    3.3.7 提示下一个方块组

    3.3.8 结束判定

    3.3.9 游戏流程图

  3.4 游戏程序实现

    3.4.1 前期准备

    3.4.2 制作场景

    3.4.3 生成方块组与方块组下落

    3.4.4 边界判断

    3.4.5 删除一行方块

    3.4.6 结束判定

    3.4.7 细节完善

第4章 打砖块

  4.1 游戏简介

打砖块是一款十分简单的小游戏, 只需要打掉所有的砖块即可获得胜利

《Breakout》,世界第一款打砖块游戏, 1976年由英宝格公司发行. 游戏设计者是后来创立苹果电脑公司的史蒂夫,乔布斯与斯蒂夫,沃兹尼亚克两人,程序设计是Brad Stewart

《Gee Bee》, 日本Namco公司在1978年推出的该公司第一款街机游戏, 合并了打砖块和弹珠台游戏的特色

快打砖块《Arkanoid》, 日本泰托(Taito)公司在1986年推出的街机游戏, 引入了电脑控制的敌机,还有后来打砖块中常见的加强道具(Powerup Item)等元素

  4.2 游戏规则

玩家操作在屏幕底端的横板, 通过反弹小球的方式, 使小球击打并消除砖块,, 只需要打掉所有的砖块即可获得胜利.小球掉落至横板下方即失败

  4.3 程序思路

    4.3.1 地图生成

for (x轴) {
    for (y轴) {
        生成砖块;
    }
}

XXXXXXXXXXXXX
RRRRRRRRRRRRR
YYYYYYYYYYYYY
BBBBBBBBBBBBB
GGGGGGGGGGGGG
PPPPPPPPPPPPP
XXXXXXXXXXXXX
XXXXXXXXXXXXX
XXXXXXXXXXXXX
RRRRRRRRRRRRR
YYYYYYYYYYYYY
BBBBBBBBBBBBB
GGGGGGGGGGGGG
PPPPPPPPPPPPP
XXXXXXXXXXXXX

XXXXRRRRRXXXX
XXXRRRRRRRXXX
XXRRRRRRRRRXX
XRRYRYRYRYRRX
RRRRRRRRRRRRR
XXRRRXRXRRRXX
XXXRXXXXXRXXX
XXXYXXXXXYXXX
XXXXYXXXYXXXX
XXXYYYYYYYXXX
XXYYXYYYXYYXX
XYYYYYYYYYYYX
XYXYYYYYYYXYX
XYXYXXXXXYXYX
XXXXYYXYYXXXX

XXXRRRRRXXXX
XXRRRRRRRRRX
XXGGGYYPYXXX
XGYGYYYPYYYX
XGYGGYYYPYYY
XXGYYYYPPPPX
XXXYYYYYYXXX
XXRRBRRBRRXX
XRRRBRRBRRRX
RRRRBBBBRRRR
YYRBYBBYBRYY
YYYBBBBBBYYY
YYBBBBBBBBYY
XXBBBXXBBBXX
XGGGXXXXGGGX
GGGGXXXXGGGG

GGGGGGGGGGGGG
GGGGGGGGGGGGG
GGXXXGGGXXXGG
GGXXXGGGXXXGG
GGXXXGGGXXXGG
GGGGGXXXGGGGG
GGGGGXXXGGGGG
GGGXXXXXXXGGG
GGGXXXXXXXGGG
GGGXXGGGXXGGG
GGGXXGGGXXGGG
GGGGGGGGGGGGG
GGGGGGGGGGGGG

XXXXXXRRRXXX
XXXXXRRRRRXX
XXXXXRGGGGXX
XXXRRRRRRRRR
XXXXRBBBBBBX
XXXXXBXBYXBX
XXXXXBBYYYBX
XYYXXBBYYYYY
YYYYXBYYYYYX
YYYYBBBBBBXX
XYYBYBBBBBBX
XXYBYBBBBBBB
XXXYBBBBBBXB
XXXXYBBBBBXX
XXXXBBBBBBBX
XXXXBBXXXBBX
XXXYYYXXXYYY

    4.3.2 砖块控制

    4.3.3 小球控制

float HitFactor {
    return (ballPos.x - racketPos.x) / racketWidth;
}

if (碰撞板) {
    小球的 xSpeed = HitFactor;
}

    4.3.4 游戏流程图

  4.4 程序实现

    4.4.1 前期准备

    4.4.2 游戏场景设定

    4.4.3 横板控制

    4.4.4 小球控制

    4.4.5 砖块的生成及控制

    4.4.6 道具的控制

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

public class Done_Ball : MonoBehaviour {
    public float BallSpeed = 18f;//如果速度过快,可以减小该值,但是可能受到重力影响,不能弹到上方,可以适当减小重力值,如:速度设置为12,Unity中Physics2D的重力值应为-4.45
    ;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        )//num控制小球是不是第一次离开横板
        {
            GetComponent<Rigidbody2D>().velocity = Vector2.up * BallSpeed;
            num++;
        }

        )//小球掉落后重载场景
        {
            SceneManager.LoadScene("Done_Break Out");
        }
    }

    /// <summary>
    /// 发球的碰撞触发器
    /// </summary>
    /// <param name="col"></param>
    private void OnCollisionEnter2D(Collision2D col)
    {
        )
        {
            float x = HitFactor(transform.position,
                                col.transform.position, col.collider.bounds.size.x
                                );

            Vector2 dir = ).normalized;
            GetComponent<Rigidbody2D>().velocity = dir * BallSpeed;
        }

    }

    /// <summary>
    /// 球与板接触位置与反弹方向的公式
    /// </summary>
    /// <param name="ballPos"></param>
    /// <param name="racketPos"></param>
    /// <param name="racketWidth"></param>
    /// <returns></returns>
    float HitFactor(Vector2 ballPos, Vector2 racketPos, float racketWidth)
    {
        return (ballPos.x - racketPos.x) / racketWidth;
    }
}

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

public class Done_Block : MonoBehaviour {

    public string color;
    public int hits_required;
}

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

public class Done_BlockController : MonoBehaviour
{
    public GameObject upgradePrefab;
    // Use this for initialization
    void Start()
    {

        string spriteFileName = "sprites/block_" + GetComponent<Done_Block>().color;//获取颜色名称

        this.GetComponent<SpriteRenderer>().sprite = Resources.Load<UnityEngine.Sprite>(spriteFileName);//贴图

    }

    /// <summary>
    /// 球与砖块的碰撞检测
    /// </summary>
    /// <param name="col"></param>
    void OnCollisionEnter2D(Collision2D col)
    {
        GameObject go = GameObject.Find("Main Camera");
        Done_LevelLoader levelLoader = go.GetComponent<Done_LevelLoader>();
        gameObject.GetComponent<Done_Block>().hits_required -= ;

        )
        {
            Destroy(gameObject);
            levelLoader.block_count--;
            if (Random.value < 0.10)//生成概率
            {
                Instantiate(upgradePrefab,
                            new Vector3(
                                col.gameObject.transform.position.x,
                                col.gameObject.transform.position.y,
                                ),
                            Quaternion.identity);

            }
        }

    }
}

using UnityEngine;
using System.Collections;
using System.Text;
using System.IO;

public class Done_LevelLoader : MonoBehaviour
{

    public Done_Block block;
    ;

    // Use this for initialization
    void Start()
    {
        string level = getRandomLevelName();
        //Debug.Log(level);
        LoadLevel(level);
    }

    public string getRandomLevelName()//随机获取地图名称
    {
        , );

        //通过地图名称读取文件夹中的txt
        return "Assets/_Complete-Game/Levels/level_" + level + ".txt";
    }

    /// <summary>
    /// 载入地图
    /// </summary>
    /// <param name="levelName"></param>
    public void LoadLevel(string levelName)
    {
        try
        {
            string line;
            StreamReader reader = new StreamReader(levelName, Encoding.Default);
            using (reader)
            {
                float pos_x = -5f;//初始克隆方块位置
                float pos_y = 5.8f;
                line = reader.ReadLine();
                while (line != null)
                {
                    char[] characters = line.ToCharArray();
                    foreach (char character in characters)
                    {
                        if (character == 'X')
                        {
                            pos_x += 0.87f;
                            continue;
                        }
                        Vector2 b_pos = new Vector2(pos_x, pos_y);
                        Done_Block b = Instantiate(block, b_pos, Quaternion.identity);
                        b.GetComponent<BoxCollider2D>().size = new Vector2(0.8f, 0.4f);//方块大小
                        switch (character)
                        {
                            case 'B':
                                b.GetComponent<Done_Block>().color = "blue";
                                b.GetComponent<Done_Block>().hits_required = ;
                                block_count++;
                                break;
                            case 'G':
                                b.GetComponent<Done_Block>().color = "green";
                                b.GetComponent<Done_Block>().hits_required = ;
                                block_count++;
                                break;
                            case 'P':
                                b.GetComponent<Done_Block>().color = "pink";
                                b.GetComponent<Done_Block>().hits_required = ;
                                block_count++;
                                break;
                            case 'R':
                                b.GetComponent<Done_Block>().color = "red";
                                b.GetComponent<Done_Block>().hits_required = ;
                                block_count++;
                                break;
                            case 'Y':
                                b.GetComponent<Done_Block>().color = "yellow";
                                b.GetComponent<Done_Block>().hits_required = ;
                                block_count++;
                                break;
                            default:
                                Destroy(b);
                                break;
                        }
                        pos_x += 0.87f;//每块克隆方块间隔
                    }
                    pos_x = -5.5f;
                    pos_y -= 0.45f;
                    line = reader.ReadLine();
                }
                reader.Close();
            }
        }
        catch (IOException e)
        {
            Debug.Log(e.Message);
            // Update is called once per frame
        }
    }
}

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

public class Done_Racket : MonoBehaviour {
    public float speed = 10.0f;//横板移动速度
                              // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

            if (Input.GetKey(KeyCode.LeftArrow))
            {
                //当球拍未超过屏幕左侧时移动球拍,否则球拍不能再移动
                if (transform.position.x > -5.2)
                {
                    transform.Translate(Vector3.left * Time.deltaTime * speed);
                }
                else
                {
                    return;
                }
            }
            else if (Input.GetKey(KeyCode.RightArrow))
            {
                if (transform.position.x < 5.2)
                {
                    transform.Translate(Vector3.right * Time.deltaTime * speed);
                }
                else
                {
                    return;
                }
            }
    }

    /// <summary>
    /// 道具与板接触的触发器
    /// </summary>
    /// <param name="col"></param>
    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "upgrade")
        {
            string name = col.gameObject.GetComponent<Done_UpGrade>().upgradeName;
            performUpgrade(name);
            Destroy(col.gameObject);
        }

    }

    /// <summary>
    /// 道具生效
    /// </summary>
    /// <param name="name"></param>
    void performUpgrade(string name)
    {
        // removing Unity-attached suffixed data to get original sprite name
        name = name.Remove(name.Length - );
        float x;
        Done_Ball ballController = GameObject.Find("ball").GetComponent<Done_Ball>();
        switch (name)
        {
            case "ball_speed_up":
                )
                {
                    ballController.BallSpeed += ;//当小球速度小于27,并且道具为ball_speed_up时,小球速度+3,以下类似。
                }
                break;
            case "ball_speed_down":
                )
                {
                    ballController.BallSpeed -= ;
                }
                break;

            case "paddle_size_up":
                x = this.gameObject.transform.localScale.x;
                if (x < 8.0f)
                    this.gameObject.transform.localScale = new Vector3(
                                                                    x += 0.25f,
                                                                       this.gameObject.transform.localScale.y,
                                                                       1.0f);
                break;
            case "paddle_size_down":
                x = this.gameObject.transform.localScale.x;
                if (x > 4.0f)
                    this.gameObject.transform.localScale = new Vector3(
                                                                    x -= 0.25f,
                                                                    this.gameObject.transform.localScale.y,
                                                                    1.0f);

                break;
            case "paddle_speed_up":
                speed += ;
                break;
            case "paddle_speed_down":
                )
                {
                    speed -= ;
                }
                break;
            default:
                break;
        }
    }
}

using UnityEngine;
using System.Collections;

public class Done_UpGrade : MonoBehaviour
{

    public Sprite[] upgradeSprites;
    public string upgradeName = "";

    // Use this for initialization
    void Start()
    {
        Sprite icon = upgradeSprites[Random.Range(, upgradeSprites.Length)];//随机选择图片
        upgradeName = icon.ToString();//与图片对应的道具名字
        this.gameObject.GetComponent<SpriteRenderer>().sprite = icon;//贴图
    }

    ///
    // Update is called once per frame
    void Update()
    {
        //道具位置刷新
        this.gameObject.transform.position = new Vector3(this.gameObject.transform.position.x,
                                                            this.gameObject.transform.position.y - 0.05f,
                                                            );
        //如果道具低于横板,则销毁
        if (gameObject.transform.position.y <= -8.0f)
            Destroy(this.gameObject);
    }
}

第5章 三消

  5.1 游戏简介

三消类游戏的鼻祖是诞生于2000年的《宝石迷阵》.《宝石迷阵》是一款锻炼眼力的宝石交换消除游戏, 游戏的目标是将一颗宝石与邻近的宝石交换位置,形成一种水平或垂直的三颗或更多颗宝石的宝石链.当有超过3颗相同宝石的宝石链形成时,或两个链在一个交换中形成,就会得到额外的奖励.当链形成时,链上的宝石会消失,另有宝石从顶部掉落,以填补缺口. 有时, 连锁反应被称为瀑布效应,被落下的宝石所填充.连击将被奖励积分, 有两种不同的游戏模式可供选择.正常模式下, 玩家通过匹配宝石来填满屏幕底部的进度条

这款游戏2002年入选IGN主办的世界电脑游戏名人堂,成为继《俄罗斯方块》后第二款入选的同类游戏.迄今为止宝石迷阵已成长为拥有五部作品的系列作,拥有超过五亿玩家,登陆了当今几乎所有主流平台(PC, 手机, PS2, PS3, PSP, XBox, XBox360, NDS, NDSi, Wii等),成为同类游戏种的No.1

  5.2 游戏规则

  5.3 程序思路

    5.3.1 地图生成

    5.3.2 消除检测

    5.3.3 消除算法

    5.3.4 宝石掉落

    5.3.5 游戏流程图

  5.4 程序实现

    5.4.1 前期准备

    5.4.2 游戏场景决定

    5.4.3 地图生成

    5.4.4 点选响应及宝石交换

    5.4.5 宝石的消除判定及宝石的消除

第6章 翻牌子

  6.1 游戏简介

  6.2 游戏规则

  6.3 程序思路

    6.3.1 搭建卡片池

    6.3.2 卡片状态

    6.3.3 游戏计分

    6.3.4 游戏路程图

  6.4 程序实现

    6.4.1 前期准备

    6.4.2 游戏场景设定

    6.4.3 卡片池的生成

    6.4.4 卡片图案的随机生成

    6.4.5 卡片的配对

    6.4.6 步数,分数和重新开始

第7章 连连看

  7.1 游戏简介

  7.2 游戏规则

  7.3 程序思路

    7.3.1 地图生成

    7.3.2 消除检测

    7.3.3 画线

    7.3.4 游戏流程图

  7.4 程序实现

    7.4.1 前期准备

    7.4.2 制作游戏场景

    7.4.3 地图创建

    7.4.4 点选判定

    7.4.5 消除判定

    7.4.6 画线

    7.4.7 道具实现

第8章 拼图

  8.1 游戏简介

  8.2 游戏规则

  8.3 游戏思路

    8.3.1 原图与碎片的对应关系

    8.3.2 鼠标拖拽移动碎片

    8.3.3 正确判断

    8.3.4 获胜判断

    8.3.5 游戏流程图

  8.4 游戏实现

    8.4.1 前期准备

    8.4.2 制作游戏场景

    8.4.3 碎片生成

    8.4.4 鼠标事件

    8.4.5 游戏结束判断

第9章 推箱子

  9.1 游戏简介

  9.2 游戏规则

  9.3 程序思路

    9.3.1 地图生成

    9.3.2 角色移动

    9.3.3 箱子移动

    9.3.4 角色及箱子移动逻辑

    9.3.5 游戏获胜判定

    9.3.6 游戏流程图

  9.4 程序实现

    9.4.1 前期准备

    9.4.2 制作游戏场景

    9.4.3 地图生成

    9.4.4 角色都移动

    9.4.5 箱子的移动

    9.4.6 游戏胜利判定

    9.4.7 动画的加入

第10章 炸弹人

  10.1 游戏简介

  10.2 游戏规则

  10.3 程序思路

    10.3.1 地图生成

    10.3.2 炸弹管理

    10.3.3 怪物管理

    10.3.4 游戏管理

    10.3.5 游戏流程图

  10.4 程序实现

    10.4.1 前期准备

    10.4.2 地图制作

    10.4.3 开始制作

    10.4.4 玩家操控

    10.4.5 墙体摧毁

    10.4.6 怪物制作

第11章 华容道

  11.1 游戏简介

  11.2 游戏规则

  11.3 游戏程序实现思路

    11.3.1 棋子

    11.3.2 棋盘

    11.3.3 移动棋子

    11.3.4 结束判定

    11.3.5 游戏流程图

  11.4 游戏实现

    11.4.1 前期准备

    11.4.2 制作游戏场景

    11.4.3 生成棋子

    11.4.4 棋子移动

    11.4.5 游戏结束判定

第12章 横板跑酷

  12.1 游戏简介

  12.2 游戏规则

  12.3 程序思路

    12.3.1 地图

    12.3.2 金币和道具

    12.3.3 障碍物

    12.3.4 玩家

    12.3.5 金币分数和已经前进距离的显示

    12.3.6 游戏流程图

  12.4 工程实现

    12.4.1 前期准备

    12.4.2 制作游戏场景

    12.4.3 玩家控制

    12.4.4 路段上金币, 道具和障碍物的生成

    12.4.5 显示前进距离和金币

第13章 扫雷

  13.1 游戏简介

  13.2 游戏规则

    13.2.1 扫雷的布局

    13.2.2 扫雷的基本操作

    13.2.3 游戏结束

  13.3 程序的思路

    13.3.1 雷区绘制

    13.3.2 左键单击

    13.3.3 右键单击

    13.3.4 左右键双击

    13.3.5 游戏结束

    13.3.6 游戏流程图

  13.4 程序实现

    13.4.1 前期准备

    13.4.2 制作游戏场景

    13.4.3 雷区的生成

    13.4.4 地雷随机分布

    13.4.5 方块关联

    13.4.6 鼠标点击

    13.4.7 游戏失败

    13.4.8 剩余地雷数, 时间和笑脸管理

第14章 贪吃蛇

  14.1 游戏简介

  14.2 游戏规则

  14.3 程序思路

    14.3.1 地图的生成

    14.3.2 食物出现

    14.3.3 蛇的数据结构

    14.3.4 贪吃蛇移动算法

    14.3.5 蛇的增长

    14.3.6 判断蛇头是否撞到了自身

    14.3.7 边界判断

    14.3.8 游戏流程图

  14.4 游戏程序实现

    14.4.1 前期准备

    14.4.2 制作场景

    14.4.3 生成食物

    14.4.4 蛇的移动

    14.4.5 蛇的长大及移动

    14.4.6 累计分数

    14.4.7 结束判定

第15章 五子棋

  15.1 游戏简介

  15.2 游戏规则

    15.2.1 五子棋棋盘和棋子

    15.2.2 五子棋基本规则

    15.2.3 落子顺序

    15.2.4 禁手

  15.3 游戏算法思路

    15.3.1 棋盘的绘制

    15.3.2 盘面棋子绘制

    15.3.3 落子

    15.3.4 获胜规则判定

    15.3.5 判定黑方禁手功能

    15.3.6 游戏流程图

  15.4 游戏程序实现

    15.4.1 前期准备

    15.4.2 创建场景

    15.4.3 落子

    15.4.4 切换落子权限

    15.4.5 更新棋盘状态

    15.4.6 获胜判断

    15.4.7 禁手规则

    15.4.8 重新开始

第16章 跳棋

  16.1 游戏简介

  16.2 游戏规则

  16.3 程序思路

    16.3.1 棋盘排列

    16.3.2 棋子生成

    16.3.3 棋子的位置和移动

    16.3.4 计算可移动位置

    16.3.5 回合限制

    16.3.6 游戏胜负判断

    16.3.7 游戏流程图

  16.4 程序实现

    16.4.1 前期准备

    16.4.2 创建棋盘

    16.4.3 创建棋子

    16.4.4 移动棋子

    16.4.5 限制可移动位置

    16.4.6 回合限制

    16.4.7 胜利判断

第17章 吃豆人

  17.1 游戏简介

  17.2 游戏规则

  17.3 程序思路

    17.3.1 地图生成

    17.3.2 幽灵状态

    17.3.3 小精灵管理

    17.3.4 游戏流程图

  17.4 程序实现

    17.4.1 前期准备

    17.4.2 制作游戏场景

    17.4.3 吃豆人的移动

    17.4.4 豆子的消失

    17.4.5 幽灵运动

第18章 斗地主

  18.1 游戏简介

  18.2 游戏规则

  18.3 程序思路

    18.3.1 扑克牌

    18.3.2 洗牌

    18.3.3 发牌

    18.3.4 出牌

    18.3.5 牌型

    18.3.6 大小

    18.3.7 玩家

    18.3.8 胜利

    18.3.9 游戏流程

  18.4 工程实现

    18.4.1 前期准备

    18.4.2 制作游戏场景

    18.4.3 定义一张牌

    18.4.4 洗牌

    18.4.5 发牌

    18.4.6 胜利判定

    18.4.7 叫地主

    18.4.8 出牌

    18.4.9 判断牌型

    18.4.10 比大小

    18.4.11 胜利

第19章 坦克大战

  19.1 游戏简介

  19.2 游戏规则

  19.3 程序思路

    19.3.1 地图生成

    19.3.2 敌人

    19.3.3 玩家

    19.3.4 障碍物

    19.3.5 道具

    19.3.6 基地

    19.3.7 游戏流程图

  19.4 工程实现

    19.4.1 前期准备

    19.4.2 制作游戏场景

    19.4.3 玩家控制

    19.4.4 子弹

    19.4.5 地图上各类障碍物及基地

    19.4.6 敌人

    19.4.7 敌人生成器

    19.4.8 道具

Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)的更多相关文章

  1. 仙剑奇侠传 游戏 开发 教程 Xianjian qixia development Game development tutorial

    仙剑奇侠传 开发  游戏 开发 教程 Xianjian qixia development Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_ ...

  2. 像素鸟 游戏开发教程 FlappyBird Game development tutorial

    像素鸟 游戏开发教程 FlappyBird Game development tutorial 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  3. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  4. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

  5. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  6. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

  7. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  8. Unity 2D游戏开发教程之为游戏场景添加多个地面

    Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...

  9. MUD游戏开发教程视频

    MUD游戏开发教程视频 https://space.bilibili.com/476328540/channel/detail?cid=91187

随机推荐

  1. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  2. 【[ZJOI2005]午餐】

    首先我们得贪心一下,让吃饭时间较长的人排在队首 去抄一段贪心的证明吧 现在研究在一个队伍里的人有什么性质 可以发现道题里也有一个不变量,就是对于队伍里的前\(i\)个人,不管他们排队的顺序如何,\(a ...

  3. tp3.2替换模板中如果需要替换的图片在css样式表中怎么办?

    因为标签中的 style 定义的样式可直接覆盖 css样式表中定义的样式,所以可以在要替换的标签中用 style 直接定义样式,具体代码如下: <div class="aboutbg& ...

  4. empty() isset() isnull() 比较

    有关 PHP 的 empty(),isset() 还有 is_null() 这三个函数的用法讨论得已经很多了,而且很多资料也未必能说得很清楚.这里再重复一次,但不是从概念去说,直接用程序例子来说话,应 ...

  5. 同源策略(same-origin policy)及三种跨域方法

    同源策略(same-origin policy)及三种跨域方法 1.同源策略 含义: 同源是指文档的来源相同,主要包括三个方面 协议 主机 载入文档的URL端口 所以同源策略就是指脚本只能读取和所属文 ...

  6. CSS兼容性问题总结及解决方法

    css兼容问题 兼容问题 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白 ...

  7. Swift_错误处理

    Swift_错误处理 点击查看源码 //错误处理 func test() { //错误枚举 需ErrorType协议 enum ErrorEnum: Error { case `default` // ...

  8. Apache常规配置说明

    Apache配置文件:conf/httpd.conf.(注意:表示路径时使用‘/’而不使用‘\’,注释使用‘#’) 1. ServerRoot:服务器根目录,也就是Apache的安装目录,其他的目录配 ...

  9. springboot+layui实现增删查改

    本文描述springboot和layui的结合,采用了springboot内置的jdbc,根据不同需要可以进行修改:分页采用了layui中自带分页格式! ----------------------- ...

  10. Python文本和字符串常用操作

    ## 字符串分割 line = "This is my love!" fields = line.split(' ') print(fields) # ['This', 'is', ...