安卓2048的游戏视图

本文详细介绍了一个基于触摸操作的2048游戏实现过程,包括游戏视图的设计与实现,触摸事件处理逻辑,以及游戏核心算法如滑动、合并等关键功能。通过具体代码示例,展示了如何创建游戏视图组件、响应用户输入并更新游戏状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class GameView extends GridLayout
{

	private card[][] cardMap = new card[4][4];
	private List<Point> emptypoints = new ArrayList<>();

	public GameView(Context context, AttributeSet attrs, int defStyle)
	{
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		initGameView();
	}

	public GameView(Context context)
	{
		super(context);
		// TODO Auto-generated constructor stub
		initGameView();
	}

	public GameView(Context context, AttributeSet atters)
	{
		super(context, atters);
		// TODO Auto-generated constructor stub
		initGameView();

	}

	private void initGameView()
	{
		setColumnCount(4);
		this.setOnTouchListener(new View.OnTouchListener()
		{
			private float start_x, start_y, end_x, end_y;

			@Override
			public boolean onTouch(View v, MotionEvent event)
			{
				switch (event.getAction())
				{
				case MotionEvent.ACTION_DOWN:
					start_x = event.getX();
					start_y = event.getY();
					break;
				case MotionEvent.ACTION_UP:
					end_x = event.getX() - start_x;
					end_y = event.getY() - start_y;
					if (Math.abs(end_x) > Math.abs(end_y))
					{
						if (end_x > 5)
						{
							swipeRight();
							// invalidate();
						}

						else if (end_x < -5)
						{
							swipeLeft();
							// invalidate();
						}
					} else
					{
						if (end_y > 5)
						{
							swipeDown();
							// invalidate();
						} else if (end_y < -5)
						{
							swipeUp();
							// invalidate();
						}
					}
					break;
				}
				// TODO Auto-generated method stub
				return true;
			}
		});
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh)// 该方法只会在程序创建的时候
	{
		// TODO Auto-generated method stub
		super.onSizeChanged(w, h, oldw, oldh);
		int card_Width = (Math.min(w, h) - 10) / 4;
		addcards(card_Width, card_Width);
		setBackgroundColor(Color.RED);
		startGame();
	}

	private void startGame()
	{
		MainActivity.getMainActivity().clearScore();
		// TODO Auto-generated method stub
		for (int x = 0; x < 4; x++)
		{
			for (int y = 0; y < 4; y++)
			{
				cardMap[x][y].setNumber(0);
			}
		}
		addrandom();
		addrandom();

	}

	private void addcards(int width, int height)
	{
		card card;
		// TODO Auto-generated method stub
		for (int y = 0; y < 4; y++)
		{
			for (int x = 0; x < 4; x++)
			{
				card = new card(getContext());
				card.setNumber(0);
				addView(card, width, height);
				cardMap[x][y] = card;
			}
		}
	}

	private void addrandom()
	{
		emptypoints.clear();
		// TODO Auto-generated method stub
		for (int x = 0; x < 4; x++)
		{
			for (int y = 0; y < 4; y++)
			{
				if (cardMap[x][y].getNumber() <= 0)
				{
					emptypoints.add(new Point(x, y));
				}
			}
		}
		Point point = emptypoints.remove((int) (Math.random() * emptypoints
				.size()));
		cardMap[point.x][point.y].setNumber(Math.random() > 0.2 ? 2 : 4);
	}

	private void swipeLeft()
	{
		// TODO Auto-generated method stub
		boolean merge = false;
		for (int y = 0; y < 4; y++)
		{
			for (int x = 0; x < 4; x++)
			{
				for (int x1 = x + 1; x1 < 4; x1++)
				{
					if (cardMap[x1][y].getNumber() > 0)
					{
						if (cardMap[x][y].getNumber() <= 0)
						{
							cardMap[x][y].setNumber(cardMap[x1][y].getNumber());
							cardMap[x1][y].setNumber(0);
							x--;
							merge = true;
						} else if (cardMap[x][y].equals(cardMap[x1][y]))
						{
							cardMap[x][y]
									.setNumber(cardMap[x][y].getNumber() * 2);
							cardMap[x1][y].setNumber(0);
							MainActivity.getMainActivity().addScore(
									cardMap[x][y].getNumber());
							merge = true;
						}
						break;
					}
				}
			}
		}
		if (merge == true)
		{
			addrandom();
			check_is_over();
		}
	}

	private void swipeRight()
	{
		// TODO Auto-generated method stub
		boolean merge = false;
		for (int y = 0; y < 4; y++)
		{
			for (int x = 3; x >= 0; x--)
			{
				for (int x1 = x - 1; x1 >= 0; x1--)
				{
					if (cardMap[x1][y].getNumber() > 0)
					{
						if (cardMap[x][y].getNumber() <= 0)
						{
							cardMap[x][y].setNumber(cardMap[x1][y].getNumber());
							cardMap[x1][y].setNumber(0);
							x++;
							merge = true;

						} else if (cardMap[x][y].equals(cardMap[x1][y]))
						{
							cardMap[x][y]
									.setNumber(cardMap[x][y].getNumber() * 2);
							cardMap[x1][y].setNumber(0);
							MainActivity.getMainActivity().addScore(
									cardMap[x][y].getNumber());
							merge = true;
						}
						break;
					}
				}
			}
		}
		if (merge == true)
		{
			addrandom();
			check_is_over();
		}
	}

	private void swipeUp()
	{
		// TODO Auto-generated method stub
		boolean merge = false;
		for (int x = 0; x < 4; x++)
		{
			for (int y = 0; y < 4; y++)
			{
				for (int y1 = y + 1; y1 < 4; y1++)
				{
					if (cardMap[x][y1].getNumber() > 0)
					{
						if (cardMap[x][y].getNumber() <= 0)
						{
							cardMap[x][y].setNumber(cardMap[x][y1].getNumber());
							cardMap[x][y1].setNumber(0);
							y--;
							merge = true;
						} else if (cardMap[x][y].equals(cardMap[x][y1]))
						{
							cardMap[x][y]
									.setNumber(cardMap[x][y].getNumber() * 2);
							cardMap[x][y1].setNumber(0);
							MainActivity.getMainActivity().addScore(
									cardMap[x][y].getNumber());
							merge = true;
						}
						break;
					}
				}
			}
		}
		if (merge == true)
		{
			addrandom();
			check_is_over();
		}
	}

	private void swipeDown()
	{
		// TODO Auto-generated method stub
		boolean merge = false;
		for (int x = 0; x < 4; x++)
		{
			for (int y = 3; y >= 0; y--)
			{
				for (int y1 = y - 1; y1 >= 0; y1--)
				{
					if (cardMap[x][y1].getNumber() > 0)
					{
						if (cardMap[x][y].getNumber() <= 0)
						{
							cardMap[x][y].setNumber(cardMap[x][y1].getNumber());
							cardMap[x][y1].setNumber(0);
							y++;
							merge = true;
						} else if (cardMap[x][y].equals(cardMap[x][y1]))
						{
							cardMap[x][y]
									.setNumber(cardMap[x][y].getNumber() * 2);
							cardMap[x][y1].setNumber(0);
							MainActivity.getMainActivity().addScore(
									cardMap[x][y].getNumber());
							merge = true;
						}
						break;
					}
				}
			}
		}
		if (merge == true)
		{
			addrandom();
			check_is_over();
		}
	}

	private void check_is_over()
	{
		// TODO Auto-generated method stub
		boolean complete = true;
		All: for (int y = 0; y < 4; y++)
		{
			for (int x = 0; x < 4; x++)
			{
				if (cardMap[x][y].getNumber() == 0
						|| (x > 1 && cardMap[x][y].equals(cardMap[x - 1][y]))
						|| (x < 3 && cardMap[x][y].equals(cardMap[x + 1][y]))
						|| (y > 0 && cardMap[x][y].equals(cardMap[x][y - 1]))
						|| (y < 3) && cardMap[x][y].equals(cardMap[x][y + 1]))
				{
					complete = false;
					break All;
				}
			}
		}
		if (complete)
		{
			new AlertDialog.Builder(getContext())
					.setTitle("你好")
					.setMessage("Game Over")
					.setPositiveButton("重来",
							new DialogInterface.OnClickListener()
							{

								@Override
								public void onClick(DialogInterface dialog,
										int which)
								{
									// TODO Auto-generated method stub
									startGame();
								}
							}).show();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值