https://pastein.ru/t/CN

  скопируйте уникальную ссылку для отправки


package kosynka;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.Timer;

public class Logic {

	//признак окончания игры
	public boolean gameEnd; // endGame
	public Image backOfCard; // rubashka
	//массив стопок карт
	private Stack[] stackArray; // stopki
	//признак первой выдачи карт из верхней левой стопки
	private boolean firstDelivery; // pervVidacha
	//номеро стопки захваченной пользователем
	private int selectedStackNum; // nomStopki
	//номер карты в стопке захваченной пользователем
	private int selectCardNum;
	//Смещение координат курсора мыши
	//относительно координаты карты
	private int dX, dY;
	//координаты карты до начала переноса мышью
	private int oldX, oldY;
	//таймер для эффекта окончания игры
	private Timer timerGameEnd;
	
	
	//конструктор
	public Logic() {
		try {
			backOfCard = ImageIO.read(new File("C:\\cards\\cardback.png"));
		}
		catch (Exception ex) {
			System.out.println("Изображение рубашки не найдено");
		}
		
		//создание массива из 13 элементов
		//каждый элемент массива - это список значения (стопка карт)
		stackArray = new Stack[13];
		
		//заполнение массива в цикле
		for(int i = 0; i<13; i++) {
			stackArray[i] = new Stack();
		}
		
		//таймер для эффекта окончания игры
		//будет запсукаться при успешном завершении игры 
		//скорость работы - 10 раз в секунду
		timerGameEnd = new Timer(100, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//перебираем все четыре домашние стопки
				for(int i = 2; i<=5; i++) {
					//получаем самую нижнюю карту
					
				}
			}
		}
		start();
	}
	
	//При захвате карты мышью
	public void mouseDragged(int mX, int mY) {
		
	}
	
	//ри одиночном нажатии левой кнопки мыши
	public void mousePressed(int mX, int mY) {
		
	}
	
	//при двойном щелчке левой кнопкой мыши
	public void mouseDoublePressed(int mX, int mY) {
		
	}
	
	//при отпускании левой кнопки мыши
	public void mouseReleased(int mX, int mY) {
		int num = getPressedStackNum(mX, mY);
		if (num == 0) {
			delivery();
		}
	}
	
	//Определение стопки на которую нажали мышью
	private int getPressedStackNum (int mX, int mY) {
		//Если курсор мыши не попал по стопке карт
		//Если стопка не выбрана
		int num = -1;
		
		//если курсор находится в зоне верхних стопок
		if( (mY>= 15) && (mY <= (15+97))) {
			if((mX>=30) && (mX <=(30+72))) num = 0;
			if((mX>=140) && (mX <=(140+72))) num = 1;
			if((mX>=360) && (mX <=(360+72))) num = 2;
			if((mX>=470) && (mX <=(470+72))) num = 3;
			if((mX>=580) && (mX <=(580+72))) num = 4;
			if((mX>=690) && (mX <=(690+72))) num = 5;
		}
		//если курсор находится в зоне нижних стопок
		else if( (mY>=150) && (mY<=700) ) {
			if( (mX>=30) && (mX<= 110*7) ) {
				if(( (mX-30)%110 ) <=72) {
					num = (mX-30)/110;
					num += 6;
				}
			}
		}
		return num;
	}
		
	//Выдача карт из верхней леовй стопки
	private void delivery() { // vidacha()
		if(stackArray[0].size()>0) {
			int num;
			//Если это первая выдача
			if(firstDelivery == true) {
				//поулчаем номер
				num = (int)(Math.random()*stackArray[0].size());
			}
			else {
				num = stackArray[0].size() - 1;
			}
			
			//получаем карту из стопки под номером 0
			Card card = stackArray[0].getCard(num);
			//делаем отображение картинкой
			card.isInverted= false;
			card.x+=110;
			//Увеличаем координату на 110
			stackArray[1].addCard(card);
			stackArray[0].removeCard(num);
		}
		else {
			//вычисляем номер последней картф
			int numLast = stackArray[1].size()-1;
			
			//переносим карты из стопки с номером 1 в стопку 0
			for(int i = numLast; i>=0; i--) {
				Card card = stackArray[1].getCard(i);
				card.isInverted = true;
				//уменьшаем коодинату на 110
				card.x -= 110;
				stackArray[0].addCard(card);
			}
			stackArray[1].clear();
			firstDelivery= false;
		}
	}
	
	///старт игры - новая игры
	public void start() {
		//очищаем все тринадцать списков
		for(int i = 0; i<13; i++) {
			//удаление элементов
			stackArray[i].clear();
		}
		//Производим
		load();	
		distribution();
		gameEnd = false;
		firstDelivery = true;
	}
	
	//загрузка изображений колоды
	private void load() {
		for(int i = 0; i <= 52; i++) {
			//в верхнюю левую стопку загружаем карты
			stackArray[0].addCard(new Card("C:\\cards\\k" + (i) + ".png", backOfCard, i));
		}
	}
	
	//метод отрисовки всех стопок карт
	public void drawStack(Graphics gr) {
		//ВЕРХНЯЯ ЛЕВАЯ СТОПКА
		//ЕСЛИ В СТОПКЕ ЕСТЬ КАРТЫ
		if(stackArray[0].size()>0) {
			//поулчаем и рисуем самую верхнюю карту
			stackArray[0].getCard(stackArray[0].size()-1).draw(gr);
		}
		
		//вторая слева верхняя стопка
		if(stackArray[1].size()>1) {
			stackArray[1].getCard(stackArray[1].size()-2 ).draw(gr);
			//получаем и рисуем самую верхнюю карту
			stackArray[1].getCard(stackArray[1].size()-1).draw(gr);
		}
		else if(stackArray[1].size()==1) {
			stackArray[1].getCard(stackArray[1].size()-1).draw(gr);
		}
		
		//ОТРИСОВА ЧЕТЫРЕХ ДОМАШНИХ СТОПОК
		for(int i = 2; i<=5; i++) {
			//если в стопке более одной карты
			if(stackArray[i].size()>1) {
				//полккчаем и рисуем вторую сверху карту
				stackArray[i].getCard(stackArray[i].size()-2).draw(gr);
				//получаем и рисуем самую верхнюю карту
				stackArray[i].getCard(stackArray[i].size()-1).draw(gr);
			}
			else if(stackArray[i].size()==1) {
				stackArray[i].getCard(stackArray[i].size()-1).draw(gr);		
			}
		}
		
		//нижние семь стопок
		for(int i = 6; i<13; i++) {
			//Если в стопке есть карты
			if(stackArray[i].size()>0) {
				//перебираем все карты из стопки
				for(int j=0;j<stackArray[i].size();j++) {
					stackArray[i].getCard(j).draw(gr);
				}
			}
		}
	}
	
	private void distribution() { //razdacha()
		//начальная координата по Х
		int x = 30;
		//перебираем все нижние стопки
		for(int i = 6; i<13; i++) {
			//добавление карт в стопку
			for(int j = 6; j<=i; j++) {
				//получваем номер случайной стопки карты из верхней левой стопки
				int random = (int)(Math.random()*stackArray[0].size());
				//получаем эту карту 
				Card card = stackArray[0].getCard(random);
				//если карта не самая верхняя, то показываем рубашкой вверх
				if(j<i) card.isInverted = true;
				else card.isInverted = false;
				//кордината по Х
				card.x = x;
				//Каждую следующую карту располагаем ниже на 20 пикселей
				card.y = 150+stackArray[i].size()*20;
				//добавляем карту в нижнюю стопку
				stackArray[i].addCard(card);
				//удаляем карту из верхней левой стопки
				stackArray[0].removeCard(random);
			}
			//увеличиваем координату по Х
			x+=110;
		}
	}
	
}