记忆力小游戏

这里写图片描述
这是一款经典的记忆力小游戏 针对初学者
/*
精灵是显示在屏幕上的2D图像,和显示在3D模型表面的图像不同(贴图)

Edit|ProjectSetting|Editor中的Default Behaviour Mode设置 2D
设置编辑器为2D模式会让导入的图像设置为Sprite

X和Y是在2D屏幕上影响对象定位的唯一坐标,然而Z坐标依然影响对象堆叠在其他对象上,Z值越低,离摄像机越近

图集能通过两种方式优化性能:
1)通过把它们紧凑地打包在一起减少空间的浪费
2)通过减少视频卡的绘制调用(draw call)(每加载一个新图像将导致视频卡多做一些工作)

像素完美(Pixel-perfect)意味着屏幕上的一个像素对应图像中的一个像素(否则,视频卡将会让图像
在缩放到适应屏幕时变得模糊)
假设你想要在1024*768屏幕上实现完美像素,这意味着摄像机的高度应该是384像素。除以100(因为像素对应单位的缩放)
并得到摄像机大小为3.84

*/

public class MemoryCard : MonoBehaviour {

[SerializeField]
private GameObject cardBack;
// 2 通过这个对象来添加图像
[SerializeField]
private SceneController controller;

private int _id;
public int id
{
    get { return _id; }
}

public void SetCard(int id,Sprite image)
{
    _id = id;
    GetComponent<SpriteRenderer>().sprite = image;
}
//通过代码添加图像
//[SerializeField]
//private Sprite image;

// Use this for initialization
void Start () {
   // GetComponent<SpriteRenderer>().sprite = image;
}

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

}

public void OnMouseDown()
{
    //检查控制器的canReveal属性,确保同时只有两张卡片是翻开的
    if (cardBack.activeSelf&&controller.canReveal)
    {
        cardBack.SetActive(false);
        controller.CardRevealed(this);
    }
}
/// <summary>
/// 一个公有方法,因此SceneController可以再次隐藏卡片
/// </summary>
public void Unreveal()
{
    cardBack.SetActive(true);
}

}

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

public class SceneController : MonoBehaviour {

[SerializeField] private TextMesh scoreLabel;
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 2;
public const float offsetY = 2.5f;
//引用场景中的卡片
[SerializeField] private MemoryCard originalCard;
[SerializeField] private Sprite[] images;

private int _score = 0;

// Use this for initialization
void Start () {

    //int id = Random.Range(0,images.Length);
    //originalCard.SetCard(id,images[id]);

    //第一张卡片的位置,所有其他卡片将从这里开始偏移
    Vector3 startPos = originalCard.transform.position;
    //使用ID对为所有四种卡片精灵声明一个整型数组
    int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3 };
    numbers = ShuffleArray(numbers);
    for (int i = 0; i < gridCols; i++)//列
    {
        for (int j = 0; j< gridRows; j++)//行
        {
            MemoryCard card;
            if (i==0&&j==0)
            {
                card = originalCard;
            }
            else
            {
                card = Instantiate(originalCard) as MemoryCard;
            }
            //i=0 1 2 3 
            //j=0 1 
            //--------------
            //  0 4 1 5 2 6 3 7
            // 
            int index = j * gridCols + i;
            //int id = Random.Range(0, images.Length);
            int id = numbers[index];//从打乱的列表中取出ID而不是随机生成
            card.SetCard(id, images[id]);

            float posX = (offsetX * i) + startPos.x;
            float posY = -(offsetY * j) + startPos.y;
            //对于2D图形,你只需要偏移X和Y;保持z轴一致
            card.transform.position = new Vector3(posX,posY,startPos.z);
        }

    }
}

private MemoryCard _firstRevealed;
private MemoryCard _secondRevealed;
//当已经存在第二张翻开的卡片时,getter方法返回false;
public bool canReveal
{
    get { return _secondRevealed == null; }
}

public void CardRevealed(MemoryCard card)
{
    if (_firstRevealed == null)
    {
        _firstRevealed = card;
    }
    else
    {
        _secondRevealed = card;
        // Debug.Log(_firstRevealed.id+_secondRevealed.id);
        StartCoroutine(CheckMatch());
    }
}

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

}

//洗牌算法(费谢尔算法)
private int[] ShuffleArray(int[] numbers)
{
    //浅克隆 不会影响原来的值
    int[] newArray = numbers.Clone() as int[];

    for (int i = 0; i < newArray.Length; i++)
    {
        // 0
        int temp = newArray[i];//0 1 2 3 4 5 6 7
          // 1                   //0 0 1 1 2 2 3 3
        int r = Random.Range(i,newArray.Length);

        newArray[i] = newArray[r];

        newArray[r] = temp;
    }
    return newArray;
}

private IEnumerator CheckMatch()
{
    if (_firstRevealed.id == _secondRevealed.id)
    {
        _score++;
        scoreLabel.text = "Score: " + _score;
    }
    else
    {
        yield return new WaitForSeconds(0.5f);
        _firstRevealed.Unreveal();
        _secondRevealed.Unreveal();
    }
    _firstRevealed = null;
    _secondRevealed = null;
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的记忆力测试游戏的JavaFX代码示例: ```java import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.scene.text.Font; import javafx.stage.Stage; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class MemoryGame extends Application { private static final int GRID_SIZE = 4; private static final int NUM_BUTTONS = GRID_SIZE * GRID_SIZE; private static final int MAX_NUMBER = 99; private static final int BUTTON_SIZE = 80; private List<Integer> numbers = new ArrayList<>(); private int currentNumber = 1; @Override public void start(Stage primaryStage) { // Initialize the numbers list with random numbers for (int i = 1; i <= NUM_BUTTONS / 2; i++) { numbers.add(i); numbers.add(i); } Collections.shuffle(numbers); // Create the GridPane layout GridPane gridPane = new GridPane(); gridPane.setAlignment(Pos.CENTER); gridPane.setHgap(10); gridPane.setVgap(10); // Add the buttons to the GridPane for (int i = 0; i < GRID_SIZE; i++) { for (int j = 0; j < GRID_SIZE; j++) { Button button = new Button("?"); button.setPrefSize(BUTTON_SIZE, BUTTON_SIZE); button.setFont(Font.font(24)); final int index = i * GRID_SIZE + j; button.setOnAction(event -> { if (button.getText().equals("?")) { button.setText(Integer.toString(numbers.get(index))); if (currentNumber == numbers.get(index)) { currentNumber++; if (currentNumber == NUM_BUTTONS / 2 + 1) { // Game over Button restartButton = new Button("Restart"); restartButton.setPrefSize(BUTTON_SIZE * GRID_SIZE, BUTTON_SIZE); restartButton.setFont(Font.font(24)); restartButton.setOnAction(event1 -> { // Restart the game Collections.shuffle(numbers); for (int k = 0; k < NUM_BUTTONS; k++) { Button b = (Button) gridPane.getChildren().get(k); b.setText("?"); } currentNumber = 1; gridPane.getChildren().remove(restartButton); }); gridPane.add(restartButton, 0, GRID_SIZE); } } } }); gridPane.add(button, j, i); } } Scene scene = new Scene(gridPane, BUTTON_SIZE * GRID_SIZE, BUTTON_SIZE * GRID_SIZE); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 这个游戏的规则很简单:玩家需要在一个 $4\times4$ 的网格中找到所有数字,数字从 $1$ 到 $8$,但是它们是随机排列的。每当玩家点击一个按钮时,它将显示该按钮下面的数字。如果该数字与当前数字匹配,玩家将继续找下一个数字。当玩家找到所有数字时,游戏结束并显示一个重新开始游戏的按钮。 这个游戏实现中使用了JavaFX的GridPane布局来创建网格,按钮的大小为80x80,字体大小为24。在初始化时,数字列表被填充了从1到8的数字,并随机打乱了顺序。当玩家点击一个按钮时,它将检查该按钮下面的数字是否与当前数字匹配,如果是,则当前数字将增加1。当当前数字达到最大值时,游戏结束并显示重新开始游戏的按钮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值