2048

using UnityEngine;
using System.Collections.Generic;

public class Game : MonoBehaviour {

Map map;//地图类
    Card[,] mCards;//存放卡片的数组
    //存放隐藏的卡牌
    List<Card> mHideCards = new List<Card>();
    //存放所有的卡牌精灵
    public Sprite[] mSprites;

public static Game Instance;

void Awake()
    {
        Instance = this;
    }
    void Start ()
    {
        
        map = GetComponent<Map>();//地图就是当前物体身上的脚本
        map.InitGrid();//初始化格子
        mCards = map.InitCard();//初始化卡片并且拿到初始化的所有卡片的信息
        //将地图上的所有的卡片先放入隐藏卡片的集合里
        for (int i = 0; i < mCards.GetLength(0); i++)
        {
            for (int j = 0; j < mCards.GetLength(1); j++)
            {
                mHideCards.Add(mCards[i,j]);
            }
        }
        //随机先生成两个卡片
        RandomCard();
        RandomCard();
    }
    //向上移动
    void MoveUp()
    {
        //行由上到下
        for (int j=2; j >= 0; j--)
        {
            for (int i = 0; i < 4; i++)
            {
                //如果当前卡牌未隐藏
                if (mCards[i,j].mUI.activeSelf)
                {
                    //记录行号
                    int row = j;
                    // -1表示不向上移动,否则表示向上移动的位置
                    int up = -1;
                    bool isadd = false;
                    while (++row<4)
                    {
                        //向上移动
                       
                        //Double 如果与该位置卡牌跟数值相同
                         if (mCards[i, row].mNum == mCards[i, j].mNum)
                        {
                            mCards[i, row].DoAdd();//上面的图片数值加倍
                            mCards[i, j].Hide();//当前图片隐藏
                            mHideCards.Add(mCards[i, j]);//把当前图片加到隐藏集合中
                            isadd = true;//表示已经加倍过啦
                            break;//跳出本层内循环
                        }
                        if (!mCards[i, row].mUI.activeSelf)//如果上面的图片是激活状态
                        {
                            up = row;//记录位置
                            continue;
                        }
                        //不动
                        else
                        {
                            break;
                        }                        
                    }
                    //如果没有执行过Add操作 并且可以向上移动
                    if (up!=-1&&isadd)
                    {
                        //该位置卡牌显示     
                        mCards[i, up].Show(mCards[i, j].mNum);
                        mHideCards.Remove(mCards[i, up]);//从隐藏列表中除去                    
                        //原位置卡牌隐藏
                        mCards[i, j].Hide();
                        mHideCards.Add(mCards[i, j]);  
                    }
                }
            }
        }
    }
    void MoveDown()
    {
        //行由下到上
        for (int j = 0; j < 3; j--)
        {
            for (int i = 0; i < 4; i++)
            {
                //如果卡牌未隐藏
                if (mCards[i, j].mUI.activeSelf)
                {
                    //记录行号
                    int row = j;
                    // -1表示不向上移动,否则表示向上移动的位置
                    int up = -1;
                    bool isadd = false;
                    while (--row >=0)
                    {
                        //向上移动

//Double 如果与该位置卡牌跟数值相同
                        if (mCards[i, row].mNum == mCards[i, j].mNum)
                        {

mCards[i, row].DoAdd();
                            mCards[i, j].Hide();
                            mHideCards.Add(mCards[i, j]);
                            isadd = true;
                            break;
                        }
                        if (!mCards[i, row].mUI.activeSelf)
                        {
                            up = row;//记录位置
                            continue;
                        }
                        //不动
                        else
                        {
                            break;
                        }
                    }
                    //如果没有执行过Add操作 并且可以向上移动
                    if (up != -1 && isadd)
                    {
                        //该位置卡牌显示     
                        mCards[i, up].Show(mCards[i, j].mNum);
                        mHideCards.Remove(mCards[i, up]);
                        //原位置卡牌隐藏
                        mCards[i, j].Hide();
                        mHideCards.Add(mCards[i, j]);
                    }
                }
            }
        }
    }
    //随机显示一张卡牌
    bool RandomCard()
    {
        int x;
        if (mHideCards.Count==0)
        {
            return false;
        }               
        x = Random.Range(0, mHideCards.Count);
        if (Random.Range(0, 4) == 3)//25%的几率是4
        {
            mHideCards[x].Show(4);//在相应的位置显示相应的卡牌(mHideCards其实存储的单位是二维坐标信息)
        }
        else//75%的机率是2
        {
            mHideCards[x].Show(2);
        }     
        mHideCards.Remove(mHideCards[x]);   //从隐藏集合中去除相应元素                        
        return true;
    }
    //根据Num获取精灵图片的方法
    public Sprite GetImg(int num)
    {
        num = (int)Mathf.Log(num, 2);//当num=2时 经过计算 num新值为1,num=4,新值为2;
        return mSprites[num-1];//mSprites中的前两张图片为数字2和4
    }

void Update ()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            MoveUp();
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
          //  MoveDown();
        }

}
}

using UnityEngine;
using System.Collections;

/// <summary>
/// 卡片类
/// </summary>
public class Card
{
    //卡片
    public GameObject mUI;
    //卡片数值 2,4,8,16,32...
    public int mNum;
    //卡片显示
    public void Show(int num)
    {
        mNum = num;
        mUI.GetComponent<SpriteRenderer>().sprite = Game.Instance.GetImg(num);
        mUI.gameObject.SetActive(true);
        mUI.transform.localScale = Vector3.one;
        iTween.ScaleFrom(mUI.gameObject, Vector3.zero, 1.5f);
    }
    //卡片隐藏
    public void Hide()
    {
        mNum = 0;
        mUI.gameObject.SetActive(false);
    }
    //卡片叠加
    public void DoAdd()
    {
        mNum *= 2;
        mUI.GetComponent<SpriteRenderer>().sprite = Game.Instance.GetImg(mNum);
    }
    
}

using UnityEngine;
using System.Collections;

public class Map : MonoBehaviour
{
    //地图4*4
    public const int SIZE = 4;
    //边长
    public const float MAPLENGTH = 6.25f;
    //格子边长
    public const float GRIDLENGTH = 1.3f;
    //间距
    public const float OFFSET = 0.21F;
    //格子预设体
    public GameObject mGridPrefab;
    //卡片预设体
    public GameObject mCardPrefab;
    private Card[,] mCards = new Card [ SIZE, SIZE];

//生成格子
   public  void InitGrid()
    {
        Vector2 pos;
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                GameObject grid = Instantiate(mGridPrefab) as GameObject;
                pos = CalPosByIndex(i, j);
                grid.transform.position = pos;
                grid.transform.SetParent(transform);
            }
        }

}

//初始化卡片
  public Card[,] InitCard()
    {
       
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                mCards[i, j] = new Card();
                mCards[i, j].mUI = Instantiate(mCardPrefab);
                mCards[i, j].mUI.transform.position= CalPosByIndex(i, j);
                mCards[i, j].Hide();
            }
        }
        return mCards;
    }
    //根据坐标算出实际坐标
  public static Vector2 CalPosByIndex(int x, int y)
    {
        float _x = GRIDLENGTH / 2 - MAPLENGTH / 2 + (x + 1) * OFFSET + x * GRIDLENGTH;
        float _y = GRIDLENGTH / 2 - MAPLENGTH / 2 + (y + 1) * OFFSET + y * GRIDLENGTH;
        return new Vector2(_x, _y);
    }

}

时间: 2024-11-09 17:32:51

2048的相关文章

cocos2d-x 3.2 之 2048 —— 第四篇 ★ 核心 ★

***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 大家十一过得肿么样啊~ 我现在的情况就是--每逢佳节 胖三斤 啊 ,胖三斤..o(╯□╰)o.. 好了,继续做2048, 这是第四篇啦~ 这篇的内容就是对触摸的处理哟~ 就是,你上下左右滑动,相应移动~ 我们先在 游戏的宏定义类 中,建立一个枚举方向变量: Game

麦子学院ios笔记:Objective-C 实现2048算法类

今天麦子学院ios开发老师给大家介绍Objective-C 实现的IOS版小游戏2048算法类,十分的实用,有需要的小伙伴可以参考下. 参数model有一个二维数组data,及阶数matrix // .h文件 @classDataModel; @interfaceAlgorithm : NSObject @property(nonatomic,assign)intaddScore;// 加分 - (void)caculateTop:(DataModel *)model;// 上滑规则 - (vo

2048 C++实现

1 #include <iostream> 2 #include <windows.h> 3 #include <ctime> 4 using namespace std; 5 6 int const ROW = 4; 7 int const COL = 4; 8 int game[ROW][COL] = {0}; 9 10 //上下左右 11 int const UP = 1; 12 int const DOWN = 2; 13 int const LEFT = 3;

200行Python代码实现2048

200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操

自带CA ,sha256 哈希签名,2048 位加密 脚本,通用

直接上代码 mkdir ssl cd ssl mkdir demoCA cd demoCA mkdir newcerts mkdir private touch index.txt echo '01' > serial function rand(){ min=$1 max=$(($2-$min+1)) num=$(date +%s%N) echo $(($num%$max+$min)) } rnd=$(rand 10 50) echo $rnd touch /etc/pki/CA/index.

python写2048小游戏

#!/usr/bin/env python # coding=utf-8 #******************************************************** # > OS : Linux 3.2.0-60-generic #91-Ubuntu # > Author : yaolong # > Mail : [email protected] # > Time : 2014年06月01日 星期日 13:13:39 #******************

max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc 2048 root soft nproc unlimited #在这里修改

终端游戏开发 : 开发2048...

2048这个游戏应该是没几个人不知道吧... 今天去实验楼学了一下这个游戏的终端版本, 大概讲一下我对这个游戏的开发思路的理解. 实现为了实现2048, 我们需要用到3个模块, 分别是curses(用于终端界面交互程序开发的库, 可以解决屏幕打印以及按键处理等方面的问题), random, 以及collections 中的 defaultdict. 第一个库比较复杂, 我之前也没接触过, 不过隐隐感觉是一个功能强大的库, 我之后会专门研究它的官方文档, 目前暂且放在一边, 所幸2048中对这个库

Android 2048游戏开发

根据教程写的简单的2048游戏. 极客学院教程地址:http://www.jikexueyuan.com/course/43.html 我的源代码地址:https://github.com/myCodingTrip/2048Game 项目有3个类. Card extends FrameLayout{ private int num; private TextView label; public Card(Context context) public int getNum() public vo

javascript 2048游戏

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="