https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5
第2章 打地鼠 (已看)
第4章 打砖块 (已看)
第5章 三消 (已看)
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 道具