Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

프로젝트 주제

No description
by

Jinseok Song

on 9 December 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of 프로젝트 주제

JAVA PROJECT
카드 짝맞추기 게임
SWING과 AWT 기반의 GUI프로그래밍을 이용한 카드 짝 맞추기 게임

프로그램 목표
수업시간에 배운 Eclipse를 이용한 JAVA프로그래밍 중에서도 GUI환경을 통한 간단한 그림 짝 맞추기 게임을 구현해보고 실행해보는데 이 프로그램의 목표를 두었다.

주요 기능과 소스 설명
대략적인 구성
class card에 대한 설명 (4/6)
public void addButton(){

Image [] array = new Image[15];
//16개의 이미지 배열 생성
bt = new JButton[15];
//16개의 버튼 생성

String []str = new String[]{
//string 배열 생성

"img\\img.jpg","img\\ss.jpg","img\\ss.jpg","img\\55.jpg",
"img\\gooo.jpg","img\\gooo.jpg","img\\go2.jpg","img\\55.jpg",
"img\\goo.jpg","img\\go2.jpg","img\\img.jpg","img\\go.jpg",
"img\\goo.jpg","img\\godorim.jpg","img\\godorim.jpg","img\\go.jpg"

//이미지 주소값
};

for(int i = 0; i < 16; i++){ //0부터 15까지
Image innerImg = Toolkit.getDefaultToolkit().getImage(str[i]);
//위에서 선언한 배열 str[]에 저장된 16개의 이미지 주소값으로 이미지를 불러옴
Image img3 = innerImg.getScaledInstance(196, 140, Image.SCALE_SMOOTH);
//이미지의 크기 및 화질 설정
프로젝트 주제
class card{ → 각각의 카드에 대한 설정
-----------------------
-----------------------
}

class SecondPage{ → 전체적인 레이아웃에 대한 설정
-----------------------
-----------------------
}

class main{ → 메인함수. 객체 생성 후 실행
-----------------------
-----------------------
}
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
//사용할 SWING과 AWT를 import함

public class Card implements ActionListener, Runnable {

private JPanel j;
private Image img;
private Image img2;
private JButton [] bt;
private int count = 0;
private String chstr1, chstr2;
private Card1 c1,c2;
private int a = 0;
public static int Opensu;
public static int [] array = new int[16];
Thread t;
// Action Listener와 Runnable 인터페이스 사용

//Runnable 인터페이스는 스레드를 생성하기 위한 다른방법으로 인터페이스를 구현하는 Class를선언
//Runnable 인터페이스의 run[] 메서드를 구현하는 Class 선언

class card에 대한 설명 (1/6)
class card에 대한 설명 (2/6)
public boolean isHol(){
//변수 값과 이름 설정, 배열생성

int sum = 0;
for(int i=0; i <
a
rray.length;i++){
sum += 1;
}
if(sum%2 ==0){
return false;
}
return true;

}//i가 0부터 시작, 배열길이보다 작을 때 까지 계속 증가하는 for문을 만들어 2로 나눈 값이 0이면 false 아니면 true.

Card(JPanel j){

img = Toolkit.getDefaultToolkit().getImage("img\\뒷면.png");
img2 = img.getScaledInstance(196, 140, Image.SCALE_SMOOTH);
this.j = j;


}

public static int isWin(){
int su = 0;

for(int i = 0; i < array.length ; i++){
if(array[i] == 1){
su++;

}
}

return su;
}
//su 가 0부터시작, for문으로 배열보다 작을때 까지 돌리고 배열 i가 1이면,
//su가 증가하고 아닐경우 그 값이 반환되는 형식.

public static void ifs(int a){

if(array[a] == 0){
Opensu++;
array[a] = 1;
}
}
public static void checkWin(Card1 c){

if(c instanceof Card16){
//instanceof 연산자는 형 변환해주는 연산자
ifs(0);
}else if(c instanceof Card15){
ifs(1);
}else if(c instanceof Card14){
ifs(2);
}else if(c instanceof Card13){
ifs(3);
}else if(c instanceof Card12){
ifs(4);
}else if(c instanceof Card11){
ifs(5);
}else if(c instanceof Card10){
ifs(6);
}else if(c instanceof Card9){
ifs(7);
}else if(c instanceof Card8){
ifs(8);
}else if(c instanceof Card7){
ifs(9);
}else if(c instanceof Card6){
ifs(10);
}else if(c instanceof Card5){
ifs(11);
}else if(c instanceof Card4){
ifs(12);
}else if(c instanceof Card3){
ifs(13);
}else if(c instanceof Card2){
ifs(14);
}else if(c instanceof Card1){
ifs(15);

}//A instanceof B일 경우 일반적으로 instanceof 연산자는
//객체 A가 B클래스나 인터페이스에 의해서 생성된 객체인지 아닌지를
//판단해서 참이면 true, 거짓이면 false를 리턴


}
class Card1 extends JButton {
//JButton 을 상속하는 card1 클래스 생성

Image innerImg; //
이미지 설정
String str;
// 문자열 설정
boolean isOpen;
//open됐는지 확인을 설정
boolean isUp; //
up 됐는지 확인을 설정
int ID;
//ID 설정

public int getID(){
return ID;
//ID값을 반환
}

public void setID(int id){
ID = id;
//ID 값을 설정
}

public void setB(){
isOpen = true; //
open됐는지 확인
}

public boolean getB(){
return isOpen; //
open값을 반환
}
Card1(Image i, String str){
this.str = str;
innerImg = i;
//카드에 문자열과 이미지 설정

ImageIcon ii = new ImageIcon(img2);//
이미지 틀 생성
this.setIcon(ii);//
레이아웃 배치 설정

}

Card1(){
ImageIcon ii = new ImageIcon(img2);//
이미지 틀 생성
this.setIcon(ii);//
레이아웃 배치 설정
}

public void changeImg(){
//이미지 변경 함수

ImageIcon ii = new ImageIcon(innerImg);
//이미지틀 생성
this.setIcon(ii);
//레이아웃 배치 설정

}

public String getStr(){
//문자열 반환
return str;
}

public void defaults(){
//defaults 함수 설정
ImageIcon ii = new ImageIcon(img2);
//이미지 생성
this.setIcon(ii);
//레이아웃 배치 설정
}
}
class Card2 extends Card1{
//1부터 16까지 16장의 카드 생성, 모든 카드는 카드 1을 상속받아 생성한다.

Card2(Image i,String str){
super(i,str);
//card1의 생성자 호출
}

}

class Card3 extends Card1{


Card3(Image i,String str){
super(i,str);
//card1의 생성자 호출
}
.
.
.
.

class Card15 extends Card1{

Card15(Image i,String str){
super(i,str);
//card1의 생성자 호출
}

}

class Card16 extends Card1{

Card16(Image i,String str){
super(i,str);
//card1의 생성자 호출
}

}
class card에 대한 설명 (3/6)
switch(i){
//switch-case문
case 0 : bt[i] = new Card1(img3,str[i]);
//i가 0인경우 bt[0]은 str[0]값의 이미지를 가진다
break;
case 1 : bt[i] = new Card2(img3,str[i]); //i가 1인경우 bt[1]은 str[1]값의 이미지를 가진다
break;
case 2 : bt[i] = new Card3(img3,str[i]); //i가 2인경우 bt[2]은 str[2]값의 이미지를 가진다
break;
case 3 : bt[i] = new Card4(img3,str[i]); //i가 3인경우 bt[3]은 str[3]값의 이미지를 가진다
break;
case 4 : bt[i] = new Card5(img3,str[i]); //i가 4인경우 bt[4]은 str[4]값의 이미지를 가진다
break;
case 5 : bt[i] = new Card6(img3,str[i]); //i가 5인경우 bt[5]은 str[5]값의 이미지를 가진다
break;
case 6 : bt[i] = new Card7(img3,str[i]); //i가 6인경우 bt[6]은 str[6]값의 이미지를 가진다
break;
case 7 : bt[i] = new Card8(img3,str[i]); //i가 7인경우 bt[7]은 str[7]값의 이미지를 가진다
break;
case 8 : bt[i] = new Card9(img3,str[i]); //i가 8인경우 bt[8]은 str[8]값의 이미지를 가진다
break;
case 9 : bt[i] = new Card10(img3,str[i]); //i가 9인경우 bt[9]은 str[9]값의 이미지를 가진다
break;
case 10 : bt[i] = new Card11(img3,str[i]); //i가 10인경우 bt[10]은 str[10]값의 이미지를 가진다
break;
case 11 : bt[i] = new Card12(img3,str[i]); //i가 11인경우 bt[11]은 str[11]값의 이미지를 가진다
break;
case 12 : bt[i] = new Card13(img3,str[i]); //i가 12인경우 bt[12]은 str[12]값의 이미지를 가진다
break;
case 13 : bt[i] = new Card14(img3,str[i]); //i가 13인경우 bt[13]은 str[13]값의 이미지를 가진다
break;
case 14 : bt[i] = new Card15(img3,str[i]); //i가 14인경우 bt[14]은 str[14]값의 이미지를 가진다
break;
case 15 : bt[i] = new Card16(img3,str[i]); //i가 15인경우 bt[15]은 str[15]값의 이미지를 가진다
break;

}

}
class card에 대한 설명 (5/6)
for(int ii = 0; ii<1000; ii++){
for(int j = 0 ; j < 16; j++){
int random = (int)(Math.random()*16);
//int형의 0~16까지의 난수(random)를 생성
JButton temp = bt[j];
bt[j] = bt[random];
bt[random] = temp;
//버튼 bt를 랜덤하게 설정

}
}

for(int k = 0; k<16; k++){

bt[k].addActionListener(this);
j.add(bt[k]);

}

}
private Card1 ins(JButton b){
if( b instanceof Card1){
//b가 card1인지 확인
Card1 c = (Card1)b;
c.setID(1);
return c;
}if(b instanceof Card2)
{//b가 card2인지 확인
Card2 c = (Card2)b;
c.setID(2);
return c;
}if(b instanceof Card3){
//b가 card3인지 확인
.
.
.
.
}if(b instanceof Card15)
{//b가 card15인지 확인
Card15 c = (Card15)b;
c.setID(15);
return c;
}if(b instanceof Card16)
{//b가 card16인지 확인
Card16 c = (Card16)b;
c.setID(16);
return c;
}
return new Card1();
}
@Overrid
e//@Override가 붙으면 컴파일러는 이 메소드(ex : open())와 같은 이름을 가진 부모 클래스의 매소드를 검색함
public synchronized void actionPerformed(ActionEvent e){

t = new Thread(this);

if(a < 2){
if(count <= 2){
count++;

for(int i = 0 ; i < bt.length; i++){


if(e.getSource() == bt[i]){

Card1 c = this.ins(bt[i]);
c.changeImg();

if(count == 1){
chstr1 = c.getStr();
c1 = c;
}else if(count == 2){
chstr2 = c.getStr();
c2 = c;

}
//카드를 뒤집은 횟수가 2번 이하일 경우 i가 bt의 길이보다 작은 경우에만
}
//마우스 커서로 처음클릭한 것을 c1에, 두번째 클릭을 c2에 저장하고 카드를 뒤집어줌


}
//for 끝

if(a == 1){
a = 3;
t.start();
}
//카드 두개가 뒤집어 지면 다시 되돌려 놓음(카드가 서로 틀릴경우)
a++;
}
// 바깥 if문 끝
}
}
@Override
public void run() {

count = 2;

try {
Thread.sleep(500);
//시간지연
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//카드 하나가 뒤집어 지면 시간지연을 주어서 다음 카드를 뒤집는 사건을 동시에 발생가능하게 함

if(count == 2){

if(chstr1.equals(chstr2) && (c1 == c2)){

count--;
a -= 3;
System.out.println(count + " " + a);
return;

}

if(!(chstr1.equals(chstr2)) || c2 == c1){

if(c1.getB() == false && c2.getB() == false ){

c1.defaults();
c2.defaults();

}else if( c2.getB() == false && c1.getB() == true){

c2.defaults();
}else if( c2.getB() == true && c1.getB() == false){

c1.defaults();
}

}else{

c1.setB();
Card.checkWin(c1);
c2.setB();
Card.checkWin(c2);


}

c1 = null;
c2 = null;
count = 0;
a=0;//
c1, c2횟수 초기화

}

if(Card.isWin() == 16 ){
JOptionPane.showMessageDialog(j, "********** V I C T O R Y **********","Congratuation", JOptionPane.INFORMATION_MESSAGE);
}
//뒤집어진 카드의 수가 16개 이면 게임이 종료되면서 종료 메세지창을 띄우기
}

}
class card에 대한 설명 (6/6)
class Main에 대한 설명
class SecondPage에 대한 설명
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class SecondPage extends JPanel{

private void init(){

this.setLayout(new GridLayout(4,4,1,1));//GridLayout(rows, cols, hgap, vgap)

//rows - 열수
//cols - 행수
//hgap - 좌우 두 컴포넌트 사이의 수평간격, 픽셀단위
//vgap - 상하 두 컴포넌트 사이의 수직간격, 픽셀단위


Card cc = new Card(this);
cc.addButton();

}

SecondPage(){

init();
// 객체생성
}

public JPanel getPan(){
return this;
}

}

import javax.swing.JFrame;


public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f = new JFrame();
f.add(new SecondPage());
f.setBounds(100, 100, 800, 600);
f.setVisible(true);
}
//프레임 호출

}

실행화면
참고 문헌
만만한 예제로 Java프로그래밍 사로잡기 (정보문화사)
JAVA Programming (도서출판 연학사)
알기 쉽게 해설한 JAVA(EHANMEDIA)
Thanks for watching
JAVA PROJECT
200901338 박태진

200901332 김태훈

201301617 임대진

201301595 송진석
목 차
프로젝트 주제

프로그램 목표

소스 설명
-class Card
-class SecondPage
-class Main

실행 화면

참고 문헌
주요 기능

카드를 생성하는 기능


카드를 매번 랜덤으로 섞는 기능


카드를 뒤집는 기능


선택한 두 카드의 그림이 같은지 다른지 판별하는 기능


카드를 모두 뒤집었을때 종료하는 기능

Full transcript