Skip to content
Home » 자바 게임 프로젝트 | 201332009 – 탁구 게임(자바 프로젝트) 답을 믿으세요

자바 게임 프로젝트 | 201332009 – 탁구 게임(자바 프로젝트) 답을 믿으세요

당신은 주제를 찾고 있습니까 “자바 게임 프로젝트 – 201332009 – 탁구 게임(자바 프로젝트)“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 박병조 이(가) 작성한 기사에는 조회수 115회 및 좋아요 없음 개의 좋아요가 있습니다.

자바 게임 프로젝트 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 201332009 – 탁구 게임(자바 프로젝트) – 자바 게임 프로젝트 주제에 대한 세부정보를 참조하세요

소프트웨어공학과 201332009 박병조 올림

자바 게임 프로젝트 주제에 대한 자세한 내용은 여기를 참조하세요.

[JAVA] Java Application 프로젝트 – 지우를 피해라 – velog

자바 GUI를 이용한 게임 제작 팀 프로젝트로, 총 4명이서 진행했다. 나는 팀장 및 개발자 역할로 참여했다. 2. 기획. 1) 구현 목표. 깊지 않은 상속 구조.

+ 여기에 표시

Source: velog.io

Date Published: 5/7/2021

View: 2943

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기. 릿드 2020. 12. 2. 14:58. 안녕하세요. 프로젝트를 압축하여 다른 사람에게 전달해야 되는 경우가 …

+ 더 읽기

Source: ridd-coding.tistory.com

Date Published: 2/26/2021

View: 1364

자바 게임 프로젝트 | 자바 스네이크 게임 빠른 답변 – 1111.com.vn

d여기에서 자바 스네이크 게임 – 자바 게임 프로젝트 주제에 대한 세부정보를 참조하세요. Java snake game tutorial for beginners

+ 여기를 클릭

Source: you.1111.com.vn

Date Published: 6/21/2021

View: 7394

Java GUI 프로젝트 도전기 : 육목 만들기 – Daily Co

프로젝트를 진행하지 않는 사람들에게는 나의 코드와 설명이 유용한 정보가 되길 바란다 🙂 1. 기능. 두 명의 플레이어가 육목 게임이 가능하도록 구현; 이외에는 자유롭게 …

+ 더 읽기

Source: dailyco.github.io

Date Published: 1/27/2021

View: 7838

객체지향 좀 더 이해하기 – 블랙잭 게임 구현 (1) – 기억보단 기록을

순수 Java로 이루어진 프로젝트 객체지향을 이해하는데 있어 게시판은 좋은 예제가 아니라는 자바지기(박재성)님과 OKKY fender님의 이야기로 시작한 …

+ 여기에 자세히 보기

Source: jojoldu.tistory.com

Date Published: 9/12/2022

View: 8060

[프로젝트] Java기반 Networking 프로젝트 – 마피아 게임 – 문코딩

[프로젝트] Java기반 Networking 프로젝트 – 마피아 게임. 달님 2021. 8. 28. 11:17. 반응형. 자바 기반 네트워킹 프로젝트. The Mafia Game. 프로젝트 시연 동영상.

+ 여기에 자세히 보기

Source: moonhy7.tistory.com

Date Published: 3/5/2022

View: 755

JAVA 프로젝트 발표 – Prezi

JAVA로 단기간에 구현할 수 있는 것 ! 누구나 즐길 수 있는 단순한 방법 ! Results. (After). 게임판 클래스. 말 클래스. Subject. 게임 기록 및 결과 클래스.

+ 여기에 더 보기

Source: prezi.com

Date Published: 12/23/2022

View: 8512

[말게임 프로그램] 자바(Java)로 구현한 도박 말 … – 레포트월드

[말게임 프로그램] 자바(Java)로 구현한 도박 말게임 그랑프리 프로젝트 프로그래밍 완성도 높은 과제 Grand Prix개발유형: 보드게임개발언어: Java (JDK 1.6)개발 …

+ 더 읽기

Source: m.reportworld.co.kr

Date Published: 10/8/2021

View: 1419

주제와 관련된 이미지 자바 게임 프로젝트

주제와 관련된 더 많은 사진을 참조하십시오 201332009 – 탁구 게임(자바 프로젝트). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

201332009 - 탁구 게임(자바 프로젝트)
201332009 – 탁구 게임(자바 프로젝트)

주제에 대한 기사 평가 자바 게임 프로젝트

  • Author: 박병조
  • Views: 조회수 115회
  • Likes: 좋아요 없음
  • Date Published: 2018. 12. 22.
  • Video Url link: https://www.youtube.com/watch?v=_IoN6XY_SuQ

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기

안녕하세요

프로젝트를 압축하여 다른 사람에게 전달해야 되는 경우가 있습니다.

방법은 아래와 같습니다.

파일 > 내보내기

아카이브 파일(압축 파일) > 다음

1. 내보낼 프로젝트 선택

2. 찾아보기로 저장할 경로 선택(파일명까지 입력해야 함)

3. 찾아보기를 완료하면 자동으로 적힙니다

4. 끝

이렇게 하면 프로젝트가 압축파일로 생성이 됩니다.

이번엔 압축된 프로젝트를 이클립스에서 불러오는 방법을 알아보겠습니다.

먼저 압축을 풀어놓고 파일 > 프로젝트 열기

디렉토리

slime 폴더가 아니라 그 속에 있는 study를 고르는게 중요합니다.

감사합니다.

자바 게임 프로젝트 | 자바 스네이크 게임 🐍 빠른 답변

당신은 주제를 찾고 있습니까 “자바 게임 프로젝트 – 자바 스네이크 게임 🐍“? 다음 카테고리의 웹사이트 you.1111.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.1111.com.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Bro Code 이(가) 작성한 기사에는 조회수 876,443회 및 좋아요 22,609개 개의 좋아요가 있습니다.

자바 게임 프로젝트 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 자바 스네이크 게임 🐍 – 자바 게임 프로젝트 주제에 대한 세부정보를 참조하세요

Java snake game tutorial for beginners

#Java #snake #game

Coding boot camps hate him! See how he can teach you to code with this one simple trick…

Bro Code is the self-proclaimed #1 tutorial series on coding in various programming languages and other how-to videos in the known universe.

자바 게임 프로젝트 주제에 대한 자세한 내용은 여기를 참조하세요.

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기 · 파일 > 내보내기 · 아카이브 파일(압축 파일) > 다음 · 1. 내보낼 프로젝트 선택. 2. · 먼저 …

+ 여기에 자세히 보기

Source: ridd-coding.tistory.com

Date Published: 10/11/2022

View: 1182

[JAVA] Java Application 프로젝트 – 지우를 피해라 – velog

자바 GUI를 이용한 게임 제작 팀 프로젝트로, 총 4명이서 진행했다. 나는 팀장 및 개발자 역할로 참여했다. 2. 기획. 1) 구현 목표. 깊지 않은 상속 구조.

+ 여기에 더 보기

Source: velog.io

Date Published: 6/25/2021

View: 5719

Java GUI 프로젝트 도전기 : 육목 만들기 – Daily Co

프로젝트를 진행하지 않는 사람들에게는 나의 코드와 설명이 유용한 정보가 되길 바란다 🙂 1. 기능. 두 명의 플레이어가 육목 게임이 가능하도록 구현; 이외에는 자유롭게 …

+ 여기를 클릭

Source: dailyco.github.io

Date Published: 5/25/2022

View: 2010

객체지향 좀 더 이해하기 – 블랙잭 게임 구현 (1) – 기억보단 기록을

순수 Java로 이루어진 프로젝트 객체지향을 이해하는데 있어 게시판은 좋은 예제가 아니라는 자바지기(박재성)님과 OKKY fender님의 이야기로 시작한 …

+ 여기에 더 보기

Source: jojoldu.tistory.com

Date Published: 7/25/2022

View: 1436

[프로젝트] Java기반 Networking 프로젝트 – 마피아 게임 – 문코딩

[프로젝트] Java기반 Networking 프로젝트 – 마피아 게임. 달님 2021. 8. 28. 11:17. 반응형. 자바 기반 네트워킹 프로젝트. The Mafia Game. 프로젝트 시연 동영상.

+ 여기에 표시

Source: moonhy7.tistory.com

Date Published: 6/27/2022

View: 8660

JAVA 게임 프로젝트 – Prezi

JAVA 게임 프로젝트 · Number of times this content has been viewed · Button to like this content · Button to share content · Button to report this content …

+ 여기에 더 보기

Source: prezi.com

Date Published: 10/9/2021

View: 6075

[Java] 연금술 게임(Alchemystics) (Little Alchemy … – 코딩 블로그

[Java] 연금술 게임(Alchemystics) (Little Alchemy 게임을 Java로 구현하고 한글화함). 14253647586970 2019. 7. 21. 14:14. 오늘 준비한 프로젝트는 Java로 제작된 …

+ 여기에 표시

Source: 152535456.tistory.com

Date Published: 9/1/2021

View: 3431

[JAVA] 자바 오목 게임 만들기 – (2)/ DB 연동 / 로그인, 회원가입 …

이번 글에서 설명할 부분은 서버 측에서 회원의 데이터들을 저장하고 관리하는 코드이다. 서버 측 프로젝트 파일에 존재하는 DBTable 클래스와 Database …

+ 여기에 자세히 보기

Source: blog.naver.com

Date Published: 8/27/2021

View: 7948

주제와 관련된 이미지 자바 게임 프로젝트

주제와 관련된 더 많은 사진을 참조하십시오 자바 스네이크 게임 🐍. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

자바 스네이크 게임 🐍

주제에 대한 기사 평가 자바 게임 프로젝트

Author: Bro Code

Views: 조회수 876,443회

Likes: 좋아요 22,609개

Date Published: 2020. 7. 20.

Video Url link: https://www.youtube.com/watch?v=bI6e6qjJ8JQ

[자바로 게임 만들기] 번외 02. 프로젝트 내보내기와 불러오기

안녕하세요 프로젝트를 압축하여 다른 사람에게 전달해야 되는 경우가 있습니다. 방법은 아래와 같습니다. 파일 > 내보내기 아카이브 파일(압축 파일) > 다음 1. 내보낼 프로젝트 선택 2. 찾아보기로 저장할 경로 선택(파일명까지 입력해야 함) 3. 찾아보기를 완료하면 자동으로 적힙니다 4. 끝 이렇게 하면 프로젝트가 압축파일로 생성이 됩니다. 이번엔 압축된 프로젝트를 이클립스에서 불러오는 방법을 알아보겠습니다. 먼저 압축을 풀어놓고 파일 > 프로젝트 열기 디렉토리 slime 폴더가 아니라 그 속에 있는 study를 고르는게 중요합니다. 끝 감사합니다.

객체지향 좀 더 이해하기 – 블랙잭 게임 구현 (1)

순수 Java로 이루어진 프로젝트 객체지향을 이해하는데 있어 게시판은 좋은 예제가 아니라는 자바지기(박재성)님과 OKKY fender님의 이야기로 시작한 프로젝트 Java로 웹을 한다고 하면서 실제로 Java와 객체지향을 공부한적이 없던것 같다는 생각이 있었습니다. 그래서 데이터베이스, JSP를 전혀 사용하지 않고 Java와 객체에 좀 더 집중할 예정입니다. 모든 코드는 Github에 있으니 전체 코드를 보고싶으시면 참고하시면 될것 같습니다. (공부한 내용을 정리하는 Github와 세미나&책 후기를 정리하는 Github 를 star 하시면 실시간으로 feed를 받을 수 있습니다.) 주제 블랙잭 게임(나무위키 참고)을 개량해서 구현할 예정입니다. 블랙잭 규칙 전부를 구현하는건 지나친 감이 있어서 조금은 스펙아웃하였습니다. 화면 구성은 모두 콘솔로 진행할 예정입니다.. 블랙잭 규칙 딜러와 게이머 단 2명만 존재한다. 카드는 조커를 제외한 52장이다. (즉, 카드는 다이아몬드,하트,스페이드,클럽 무늬를 가진 A,2~10,K,Q,J 으로 이루어져있다.) 2~10은 숫자 그대로 점수를, K/Q/J는 10점으로, A는 1로 계산한다. (기존 규칙은 A는 1과 11 둘다 가능하지만 여기선 1만 허용하도록 스펙아웃) 계산한다. (기존 규칙은 A는 1과 11 둘다 가능하지만 여기선 1만 허용하도록 스펙아웃) 딜러와 게이머는 순차적으로 카드를 하나씩 뽑아 각자 2개의 카드를 소지한다. 게이머는 얼마든지 카드를 추가로 뽑을 수 있다. 딜러는 2카드의 합계 점수가 16점 이하이면 반드시 1장을 추가로 뽑고, 17점 이상이면 추가할 수 없다. 양쪽다 추가 뽑기 없이, 카드를 오픈하면 딜러와 게이머 중 소유한 카드의 합이 21에 가장 가까운 쪽이 승리한다. 단 21을 초과하면 초과한 쪽이 진다. 설계원칙 클래스 우선이 아닌, 객체의 속성과 행위가 우선이다. 클래스는 객체를 추상화하는 도구일 뿐이다. 데이터가 아닌 메세지(행위)를 중심으로 객체를 설계해라. 객체는 혼자 있을 수 없다. 다른 객체와의 협력 안에서만 존재할 수 있다. 메세지를 중심으로, 해당 메세지가 어떤 객체를 필요로 하는지를 생각하자. 하나하나 지시하지 말고 요청해라. 예를들어, 판사가 증인에게 1) 목격했던 장면을 떠올리고, 2) 떠오르는 시간을 순서대로 구성하고, 3) 말로 간결하게 표현해라 라고 요청하지 않는다. 그냥 “증언하라” 라고 요청한다. 마찬가지로 객체의 설계단계에서도 책임이 있는 객체에 요청만 하도록 설계한다. 하나의 메소드는 하나의 일만 해야한다. 처음부터 완벽한 설계는 없다. 설계를 코드로 구현해가는 과정에서 수정이 필요하다면 설계를 수정한다. 주요 객체 카드뭉치 (카드덱) 카드 규칙 딜러 게이머 주요 객체들의 속성과 역할 카드뭉치 (카드덱) 52개의 서로 다른 카드를 갖고 있다. 카드 1개를 뽑아준다. 카드 다이아몬드, 하트, 스페이드, 클럽 중 1개의 무늬를 가지고 있다. A,2~10,K,Q,J 중 하나를 가지고 있다. 규칙 점수를 측정해준다. 승패를 판단한다. 딜러 추가로 카드를 받는다. 단, 2카드의 합계 점수가 16점 이하이면 반드시 1장을 추가로 뽑고, 17점 이상이면 받을 수 없다. 뽑은 카드를 소유한다. 카드를 오픈한다. 게이머 추가로 카드를 받는다. 뽑은 카드를 소유한다. 카드를 오픈한다. 1. 추상화된 코드 구현 위의 “객체들의 속성과 역할”을 도식화 하면 아래와 같습니다. 위 관계도에 따라 간략하게 코드를 구현하면 아래와 같습니다. Card.java public class Card { private String pattern; private String denomination; public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getDenomination() { return denomination; } public void setDenomination(String denomination) { this.denomination = denomination; } } Card의 pattern은 무늬를, denomination는 끗수(A,2~10,J,Q,K)를 얘기합니다. CardDeck.java public class CardDeck { private List cards; public Card getCard(){ return null; } } Dealer.java public class Dealer { private List cards; public void receiveCard(Card card) {} public List openCards(){ return null; } } Gamer.java public class Gamer { private List cards; public void receiveCard(Card card) {} public List openCards(){ return null; } } Rule.java public class Rule { public int getScore(List cards){ return 0; } public void getWinner(Dealer dealer, Gamer gamer){} } return 타입이 void가 아닌 경우엔 null을 리턴하도록 하였습니다. 위 선언된 5개의 Java파일 만으로는 블랙잭 게임이 진행될 순 없습니다. 실제로 게임을 진행시킬 Game.java를 구현해보겠습니다. Game.java public class Game { public void play(){ System.out.println(“========= Blackjack =========”); Dealer dealer = new Dealer(); Gamer gamer = new Gamer(); Rule rule = new Rule(); CardDeck cardDeck = new CardDeck(); } } 게임에 필요한 “클래스들의 인스턴스”를 생성시켰습니다. (객체가 아닌, xx클래스의 인스턴스입니다.) 그리고 이를 실행시킬 Application.java입니다. Application.java public class Application { public static void main(String[] args) { Game game = new Game(); game.play(); } } 2-1. 실제 코드 구현 (CardDeck) 이제 좀 더 구체화된 코드를 작성해보겠습니다. 첫번째 카드를 뽑기 위해 play에 아래 코드를 추가하겠습니다. Card card = cardDeck.draw(); CardDeck.draw 메소드는 실제로 카드를 뽑아줘야 하기 때문에 구체적된 코드를 작성해보겠습니다. draw는 남아 있는 카드 중 랜덤한 1개의 카드를 준다 라는 CardDeck의 유일한 역할을 하고 있습니다. 즉, CardDeck은 본인의 역할을 수행하기 위해 52개의 서로 다른 카드가 존재 해야만 합니다. 생성 되는 시점에는 이 조건을 만족해야만 하기 때문에 생성자 를 사용하겠습니다. CardDeck.java private static final String[] PATTERNS = {“spade”, “heart”, “diamond”, “club”}; private static final int CARD_COUNT = 13; public CardDeck() { cards = new ArrayList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination; if(i == 1){ denomination = "A"; }else if(i == 11){ denomination = "J"; }else if(i == 12){ denomination = "Q"; }else if(i == 13){ denomination = "K"; }else { denomination = String.valueOf(i); } card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } } 아주 빠르게 코드를 작성하면 위와 같이 작성할 수 있을것 같습니다. 현재 코드에서는 몇가지 개선할 것들이 보입니다. 카드의 끗수(denomination)를 결정하는 부분은 생성자의 역할이 아닙니다. 즉, 1~13 이라는 숫자를 통해 끗수를 정하는 것은 다른 메소드에서 해야할 일입니다. 그래서 numberToDenomination 라는 메소드를 통해 이 역할을 분리하겠습니다. private static final String[] PATTERNS = {"spade", "heart", "diamond", "club"}; private static final int CARD_COUNT = 13; public CardDeck() { cards = new ArrayList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination = this.numberToDenomination(i); card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } } private String numberToDenomination(int number){ if(number == 1){ return "A"; }else if(number == 11){ return "J"; }else if(number == 12){ return "Q"; }else if(number == 13){ return "K"; } return String.valueOf(number); } numberToDenomination 메소드를 작성하게 되면 한가지 더 마음에 안드는 것이 보일것입니다. 바로 52개의 Card List를 생성하는 코드입니다. 이 코드 역시 생성자의 역할은 아닙니다. 생성자가 실행을 시킬 역할이 있을 뿐이지 실제 비지니스 로직을 알고 있어야 할 필요는 없습니다. 그렇기에 이 역시 코드를 분리하도록 하겠습니다. private static final String[] PATTERNS = {"spade", "heart", "diamond", "club"}; private static final int CARD_COUNT = 13; public CardDeck() { cards = this.generateCards(); } private List generateCards() { List cards = new LinkedList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination = this.numberToDenomination(i); card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } return cards; } private String numberToDenomination(int number){ if(number == 1){ return "A"; }else if(number == 11){ return "J"; }else if(number == 12){ return "Q"; }else if(number == 13){ return "K"; } return String.valueOf(number); } 이렇게 분리하고 나면, 각 메소드는 하나의 역할에만 충실할 수 있게 되었습니다. 여기서 추가로, Card의 인스턴스를 생성하고 뒤에 set메소드를 통해 끗수(denomination)와 무늬(pattern)를 지정하는 코드를 개선해보겠습니다. Card.java private String pattern; private String denomination; public Card(String pattern, String denomination) { this.pattern = pattern; this.denomination = denomination; } public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getDenomination() { return denomination; } public void setDenomination(String denomination) { this.denomination = denomination; } CardDeck.java private List generateCards() { List cards = new LinkedList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { String denomination = this.numberToDenomination(i); Card card = new Card(pattern, denomination); cards.add(card); } } return cards; } 기본 생성자와 set메소드를 사용하지 않고, 인자가 추가된 생성자를 사용한 이유는 무엇일까요? (참고로 Java는 생성자가 없으면 기본생성자가 자동 추가되며, 별도의 생성자가 추가되면 기본생성자가 자동 추가되지 않습니다.) 끗수와 무늬를 가지고 Card가 어떤 행위를 하는지 CardDeck은 몰라도 된다. 즉, Card에서 끗수와 무늬를 마음대로 활용하더라도 CardDeck은 아무런 영향이 없다. Card는 끗수와 무늬가 필수임을 강제 할 수 있다. Card에 기본 생성자가 있으면 끗수와 무늬가 없는 Card가 생성 될 수 있다. 하지만 이렇게 하게 되면 끗수와 무늬가 없는 Card는 생성 될 수 없다 할 수 있다. 자 그럼 CardDeck이 잘 생성되는지 확인하기 위해 간단하게 출력을 시켜보겠습니다. Card.java @Override public String toString() { return "Card{" + "pattern='" + pattern + ", denomination='" + denomination + '}'; } CardDeck.java @Override public String toString() { StringBuilder sb = new StringBuilder(); for(Card card : cards){ sb.append(card.toString()); sb.append(" "); } return sb.toString(); } Game.java public void play(){ System.out.println("========= Blackjack ========="); Scanner sc = new Scanner(System.in); Dealer dealer = new Dealer(); Gamer gamer = new Gamer(); Rule rule = new Rule(); CardDeck cardDeck = new CardDeck(); System.out.println(cardDeck.toString()); } 위 코드를 통해 Application.java를 실행시키면! 이렇게 52개의 서로 다른 카드가 생성되었음을 확인할 수 있습니다. 바로 draw기능을 만들어 보겠습니다. draw는 2가지를 해야 합니다. 남아 있는 카드 중 1개를 뽑는다. 뽑은 카드는 카드덱에서 제거한다. 이걸 간단하게 구현하면 아래와 같은 코드가 됩니다. public Card draw(){ int size = cards.size(); int select = (int)(Math.random()*size); Card selectedCard = cards.get(select); cards.remove(select); return selectedCard; } 코드를 작성한 것을 보면 몇가지 개선할 것이 있습니다. remove 기능은 랜덤하게 뽑힌 카드를 제거 하는 작업입니다. 현실에서는 이 작업이 크게 어려운일이 아니지만, 코드속에서는 이 작업은 List별로 구현 방식이 큰 차이가 발생합니다. ArrayList ArrayList의 remove는 해당 인덱스의 인스턴스를 제거하고 남은 데이터들을 다시 Copy 합니다. 즉, ArrayList는 중간중간 인스턴스를 제거하는 방식이 결코 좋은 성능을 내지 못하는 것입니다. 반면에 LinkedList의 경우는 remove를 아래와 같이 합니다. LinkedList LinkedList의 remove와 remove에서 사용되는 unlink 메소드의 코드입니다. 보시는것처럼 LinkedList의 remove는 해당 node와 연결을 맺고 있는 앞 뒤 node의 연결을 끊어버림으로써 remove를 하게됩니다. 즉, 중간중간 인스턴스의 제거 혹은 추가의 경우는 LinkedList가 ArrayList보다 훨씬 더 좋은 성능을 보이게 됩니다. (좀 더 상세하게 알고 싶으시다면 넥스트리의 블로그를 추천드립니다. ) 자 그럼 CardDeck의 cards를 LinkedList로 교체하겠습니다. cards = new LinkedList<>(); List라는 인터페이스로 cards를 선언 하였기에 구현체가 ArrayList가 되든, LinkedList가 되든 다른 코드를 수정할 필요가 없습니다. 그리고 현재 draw에는 남아있는 카드들 중 하나를 뽑는 것과, 카드를 제거하는 것 2가지를 동시에 하고 있기에 이를 분리하겠습니다. public Card draw(){ Card selectedCard = getRandomCard(); cards.remove(selectedCard); return selectedCard; } private Card getRandomCard() { int size = cards.size(); int select = (int)(Math.random()*size); return cards.get(select); } 다른 메소드와 달리 getRandomCard는 접근 제한자를 private로 하였습니다. private 접근 제한자는 해당 클래스외에는 접근할 수가 없습니다. 그래서 외부에서 사용되지 않는 변수/메소드들은 private 접근제한자를 사용하여 타인이 코드만 보고도, 해당 변수/메소드는 현재 클래스에서만 사용된다는 것을 명시 하는 것이 더 좋습니다. 여기까지 CardDeck을 구현하였습니다. 차근차근 나머지 객체들 역시 진행하겠습니다.

[Java] 연금술 게임(Alchemystics) (Little Alchemy 게임을 Java로 구현하고 한글화함)

오늘 준비한 프로젝트는 Java로 제작된 연금술 게임입니다. 원작 게임은 Little Alchemy라는 게임입니다. Little Alchemy라는 원작 게임은 이 링크(https://littlealchemy.com/)에서 플레이하실 수 있습니다. 처음에는 4개 가량의 아이템이 준비되어 있고 이를 이용하여 600개 이상의 다양한 아이템을 합쳐서 만드는 게임입니다. Java 프로젝트의 구조를 약간이라도 더 이해하고, 기존과는 다른 방식으로 GUI를 작성하여 다음에 만들게 될 프로그램을 안정적으로 작동시키기 위하여 어렵지 않은 주제인 이 연금술 게임을 직접 개발하게 되었습니다. 게임 내부에 있는 조합 데이터나 그림 파일들은 시간과 비용 문제로 인해 원작 사이트에서 가져왔습니다. 개발 목적: 다음 프로젝트를 위한 Java 프로젝트 안정성 확보 클래스 다이어그램이라고 부르기에는 연결이 완성되지 않았지만 간단한 프로그램의 구조를 사진으로 나타내어봤습니다. 무료 다이어그램 제작 툴: https://online.visual-paradigm.com/ (유료 광고가 아닙니다.) 사용 라이브러리 * Gson * Commons-IO * JDK 11.0 프로그램 소개 소스 코드: https://github.com/dhkim0800/java-game-alchemystics 게임 플레이 방법 게임을 플레이하면 위와 같은 화면이 표시됩니다. (GUI를 해상도에 따라 변화시키지 않았기에 컴퓨터 해상도에 따라 화면이 일그러질 수도 있습니다. 1920×1080 해상도로 플레이할 것을 권장합니다. HiDpi 배율은 반드시 100%로 설정되어야 합니다.) 화면 좌측에는 수집한 아이템 개수, 하단에는 검은색 메뉴 버튼, 우측에는 가나다순으로 수집한 아이템이 표시됩니다. 게임 플레이 방법은 간단합니다. 오른쪽에 있는 아이템 두개를 왼쪽에 끌어와서 같은 위치에 겹치면 합쳐집니다. 만약 성공적으로 합쳤다면 새로운 아이템이 생깁니다. 힌트 기능도 존재합니다. 단 게임을 재미없게 만든다고 확신합니다. 하단 메뉴 막대기를 위로 올리면 합치는 화면이 지워집니다. 메뉴 막대기를 한 번 클릭하면 힌트가 글로 표시됩니다. 메뉴 막대기를 0.5초 이상 누르면 힌트에 해당하는 아이템이 합치는 화면에 표시됩니다. 다운로드 Alchemystics 게임은 Java 기반으로 JAR 파일로 제공됩니다. Java 11 이상을 사용하지 않으면 실행이 불가능합니다. (OpenJDK 11을 기반으로 만들어졌습니다.) 다운로드 링크: https://github.com/dhkim0800/java-game-alchemystics/releases/download/v1.0/Alchemistics.jar

[JAVA] 자바 오목 게임 만들기 – (2)/ DB 연동 / 로그인, 회원가입 기능 등

프로젝트 [JAVA] 자바 오목 게임 만들기 – (2)/ DB 연동 / 로그인, 회원가입 기능 등 김젼득 ・ URL 복사 본문 기타 기능 공유하기 신고하기 [JAVA] 자바 오목 게임 만들기 – (1)/ 로그인, 회원가입 기능 / DB 연동 / 소켓 통신 / 멀티 스레드 / 멀티룸 서버 // 잠깐 TMI 지난 2학년 2학기, 자바 프로젝트 교수님께서 기말고사 대체 과제로 << 소켓과 DB ... blog.naver.com 다음 포스팅에 코드 첨부해서 설명하겠다고 예고(?)만 해놓고 거의 6개월.. 그니까 반년이 지났다 딱히 바쁜 시간은 아니었지만 사실 코드 수정도 안 했고 할 의지도 없어서 냅뒀다가 이제와서 쓰는 중 ㅠㅠ.. 아무튼 빠르게 시작해보겠슴 ㄱㄱ 우선 TCP 소켓 통신이기 때문에 데이터의 손실이 없다는 가정 하에 만들어져있음을 알린다! 물론 만든 당시에는 모르고 그냥 만들었음.. ㅋㅋ 이번 글에서 설명할 부분은 서버 측에서 회원의 데이터들을 저장하고 관리하는 코드이다. 서버 측 프로젝트 파일에 존재하는 DBTable 클래스와 Database 클래스를 설명할 예정이다. ​ DBTable 클래스 프로그램 첫 실행 시 프로그램에 필요한 테이블을 생성하도록 하는 클래스 이 클래스는 사실 굳이 코드로 구현할 필요는 없다. MySQL workbench에서 스키마 생성과 동시에 테이블을 만들어주면 되기 때문에 생략이 가능하다. ​ 스키마, 테이블 생성 방법 보러가기 > ​ 만들어 둔 오목 데이터베이스 스키마에 member 테이블을 생성하는 코드는 다음과 같다. import java.sql.*; //프로그램 첫 실행 시 프로그램에 필요한 테이블을 생성하는 클래스. //Server 클래스에도 main메소드가 있기 때문에 Server와 상관없이 단독으로 실행된다. public class DBTable { public static void main(String[] args) { //클래스 실행 시 main메소드가 바로 시작한다. /* 데이터베이스와의 연결에 사용할 변수들 */ Connection con = null; Statement stmt = null; String url = “jdbc:mysql://localhost/omok?serverTimezone=Asia/Seoul”; String user = “계정 이름”; String passwd = “계정 비밀번호”; try { //데이터베이스 연결은 try-catch문으로 예외를 잡아준다. //데이터베이스와 연결한다. Class.forName(“com.mysql.cj.jdbc.Driver”); con = DriverManager.getConnection(url, user, passwd); stmt = con.createStatement(); //member라는 테이블 생성하고 테이블 안의 칼럼은 name, nickname, id, password, email, win, lose가 존재. nickname과 id를 기본키로 잡아준다. String createStr = “CREATE TABLE member (name varchar(20) not null, nickname varchar(20) not null, ” + “id varchar(20) not null, password varchar(20) not null, email varchar(40) not null, ” + “win int not null, lose int not null, PRIMARY KEY (nickname, id))”; stmt.executeUpdate(createStr); //업데이트문을 수행한다. System.out.println(“[Server] 테이블 생성 성공”); //업데이트문이 성공하면 테이블 생성 성공을 콘솔로 알린다. } catch(Exception e) { //데이터베이스 연결 및 테이블 생성에 예외가 발생했을 때 실패를 콘솔로 알린다. System.out.println(“[Server] 데이터베이스 연결 혹은 테이블 생성에 문제 발생 > ” + e.toString()); } } } member 테이블에 name, nickname, id, password, email, win(이긴 횟수), lose(진 횟수) 칼럼들을 추가하고, 각 데이터가 Null값으로는 저장될 수 없게 not null로 설정해준다. nickname과 id는 서버가 클라이언트를 관리할 때나 데이터를 주고받을 때 구분할 수 있도록 기본키로 설정해주었다. ​ Database 클래스 클라이언트가 요청한 데이터베이스 업데이트 및 쿼리 작업을 수행하는 클래스 클라이언트가 서버에 요청한 작업이 DB에 저장된 데이터들을 사용해야 되는 작업일 때, 서버와 MySQL을 연동시켜주는 클래스라고 생각하면 된다, 그니까 이 코드로 MySQL 오목 스키마의 Member 테이블을 관리할 수 있는 거다. ​ 그리고 얘는 서버에서 불러야 수행되는 메소드들을 넣어놓았기 때문에 단독으로 실행되는 클래스는 아니다. ​ 아무튼 이 클래스에서는 1. 로그인 2. 회원가입 3. 아이디 및 닉네임 중복 확인 4. 회원 정보 조회 5. 회원 정보 변경 6. 전체 회원 전적 조회 7. 특정 회원 전적 조회 8. 게임 승리 시 전적 업데이트 9. 게임 패배 시 전적 업데이트 의 총 9개 기능을 수행한다. 서버에서 요구하는 데이터 형에 따라 메소드의 반환형이 다르니 이 점 유의하길 바란다. ​ 참고로 전적 조회 UI는 이런 형태로 출력된다. 전체 랭킹(전적) 조회 UI 이긴 횟수와 진 횟수는 정수형으로 저장되기 때문에 해당 정수값을 빼와서 *승*패 형태로 출력하도록 했다 ​ 회원 정보 조회 UI는 이렇게 생겼다 회원 정보 조회 이름, 닉네임, 이메일을 조회할 수 있는 기능임! ​ 이제 코드를 볼 차례 💨💨💨 ​ 코드가 길어서 한 번에 안 들어가는 바람에 두 개로 나눴지만 하나의 클래스이다 .. 주석으로 달아놨으니 코멘트를 추가하진 않겠다. import java.sql.*; //클라이언트가 요청한 데이터베이스 업데이트 및 쿼리 작업을 수행하는 클래스. //서버에서 객체 생성 시에 데이터베이스 연동 작업을 수행하고 다른 부가적인 작업들은 메소드를 통해 서버에서 불려지면 수행하도록 한다. public class Database { /* 데이터베이스와의 연결에 사용할 변수들 */ Connection con = null; Statement stmt = null; String url = “jdbc:mysql://localhost/omok?serverTimezone=Asia/Seoul”; String user = “계정 이름”; String passwd = “계정 비밀번호”; Database() { //Database 객체 생성 시 데이터베이스 서버와 연결한다. try { //데이터베이스 연결은 try-catch문으로 예외를 잡아준다. //데이터베이스와 연결한다. Class.forName(“com.mysql.cj.jdbc.Driver”); con = DriverManager.getConnection(url, user, passwd); stmt = con.createStatement(); System.out.println(“[Server] MySQL 서버 연동 성공”); //데이터베이스 연결에 성공하면 성공을 콘솔로 알린다. } catch(Exception e) { //데이터베이스 연결에 예외가 발생했을 때 실패를 콘솔로 알린다. System.out.println(“[Server] MySQL 서버 연동 실패> ” + e.toString()); } } //로그인 여부를 확인하는 메소드. 서버에 닉네임을 String 형식으로 반환한다. String loginCheck(String _i, String _p) { String nickname = “null”; //반환할 닉네임 변수를 “null”로 초기화. //매개변수로 받은 id와 password값을 id와 pw값에 초기화한다. String id = _i; String pw = _p; try { //id와 일치하는 비밀번호와 닉네임이 있는지 조회한다. String checkingStr = “SELECT password, nickname FROM member WHERE id=’” + id + “‘”; ResultSet result = stmt.executeQuery(checkingStr); int count = 0; while(result.next()) { //조회한 비밀번호와 pw 값을 비교. if(pw.equals(result.getString(“password”))) { //true일 경우 nickname에 조회한 닉네임에 반환하고 로그인 성공을 콘솔로 알린다. nickname = result.getString(“nickname”); System.out.println(“[Server] 로그인 성공”); } else { //false일 경우 nickname을 “null”로 초기화하고 로그인 실패를 콘솔로 알린다. nickname = “null”; System.out.println(“[Server] 로그인 실패”); } count++; } } catch(Exception e) { //조회에 실패했을 때 nickname을 “null”로 초기화. 실패를 콘솔로 알린다. nickname = “null”; System.out.println(“[Server] 로그인 실패 > ” + e.toString()); } return nickname; //nickname 반환 } //회원가입을 수행하는 메소드. 회원가입에 성공하면 true, 실패하면 false를 반환한다. boolean joinCheck(String _n, String _nn, String _i, String _p, String _e) { boolean flag = false; //참거짓을 반환할 flag 변수. 초기값은 false //매개변수로 받은 각 문자열들을 각 변수에 초기화한다. String na = _n; String nn = _nn; String id = _i; String pw = _p; String em = _e; try { //member 테이블에 각 문자열들을 순서대로 업데이트하는 문장. 승, 패는 초기값을 숫자 0으로 한다. String insertStr = “INSERT INTO member VALUES(‘” + na + “‘, ‘” + nn + “‘, ‘” + id + “‘, ‘” + pw + “‘, ‘” + em + “‘, 0, 0)”; stmt.executeUpdate(insertStr); flag = true; //업데이트문이 정상적으로 수행되면 flag를 true로 초기화하고 성공을 콘솔로 알린다. System.out.println(“[Server] 회원가입 성공”); } catch(Exception e) { //회원가입 절차를 수행하지 못하면 flag를 false로 초기화하고 실패를 콘솔로 알린다. flag = false; System.out.println(“[Server] 회원가입 실패 > ” + e.toString()); } return flag; //flag 반환 } //아이디나 닉네임이 중복되었는지 확인해주는 메소드. 중복 값이 존재하면 false, 존재하지 않으면 true를 반환한다. boolean overCheck(String _a, String _v) { boolean flag = false; //참거짓을 반환할 flag 변수. 초기값은 false //att는 속성(아이디, 닉네임)을 구분하고, val은 확인할 값이 초기화. String att = _a; String val = _v; try { //member 테이블에 존재하는 아이디(혹은 닉네임)를 모두 찾는다. String selcectStr = “SELECT ” + att + ” FROM member”; ResultSet result = stmt.executeQuery(selcectStr); int count = 0; while(result.next()) { //조회한 아이디(혹은 닉네임)과 val을 비교. if(!val.equals(result.getString(att))) { //val과 같은 것이 존재하면 flag를 true로 변경한다. flag = true; } else { //val과 같은 것이 존재하지 않으면 flag를 false로 변경한다. flag = false; } count++; } System.out.println(“[Server] 중복 확인 성공”); //정상적으로 수행되었을 때 성공을 콘솔로 알린다. } catch(Exception e) { //정상적으로 수행하지 못하면 실패를 콘솔로 알린다. System.out.println(“[Server] 중복 확인 실패 > ” + e.toString()); } return flag; //flag 반환 } //데이터베이스에 저장된 자신의 정보를 조회하는 메소드. 조회한 정보들을 String 형태로 반환한다. String viewInfo(String _nn) { String msg = “null”; //반환할 문자열 변수를 “null”로 초기화. //매개변수로 받은 닉네임을 nick에 초기화한다. String nick = _nn; try { //member 테이블에서 nick이라는 닉네임을 가진 회원의 이름과 이메일 정보를 조회한다. String viewStr = “SELECT name, email FROM member WHERE nickname=’” + nick + “‘”; ResultSet result = stmt.executeQuery(viewStr); int count = 0; while(result.next()) { //msg에 “이름//닉네임//이메일” 형태로 초기화한다. msg = result.getString(“name”) + “//” + nick + “//” + result.getString(“email”); count++; } System.out.println(“[Server] 회원정보 조회 성공”); //정상적으로 수행되면 성공을 콘솔로 알린다. } catch(Exception e) { //정상적으로 수행하지 못하면 실패를 콘솔로 알린다. System.out.println(“[Server] 회원정보 조회 실패 > ” + e.toString()); } return msg; //msg 반환 } 이어서 //회원정보를 변경을 수행하는 메소드. 변경에 성공하면 true, 실패하면 false를 반환한다. boolean changeInfo(String _nn, String _a, String _v) { boolean flag = false; //참거짓을 반환할 flag 변수. 초기값은 false. //매개변수로 받은 정보들을 초기화한다. att는 속성(이름, 이메일, 비밀번호) 구분용이고 val은 바꿀 값. String nick = _nn; String att = _a; String val = _v; try { //member 테이블에서 nick이라는 닉네임을 가진 회원의 att(이름, 이메일, 비밀번호)를 val로 변경한다. String changeStr = “UPDATE member SET ” + att + “=’” + val + “‘ WHERE nickname=’” + nick +”‘”; stmt.executeUpdate(changeStr); flag = true; //정상적으로 수행되면 flag를 true로 바꾸고 성공을 콘솔로 알린다. System.out.println(“[Server] 회원정보 변경 성공”); } catch(Exception e) { //정상적으로 수행하지 못하면 flag를 false로 바꾸고 실패를 콘솔로 알린다. flag = false; System.out.println(“[Server] 회원정보 변경 실패 > ” + e.toString()); } return flag; //flag 반환 } //전체 회원의 전적을 조회하는 메소드. 모든 회원의 전적을 String 형태로 반환한다. String viewRank() { String msg = “”; //전적을 받을 문자열. 초기값은 “”로 한다. try { //member 테이블의 닉네임, 승, 패를 모두 조회한다. String viewStr = “SELECT nickname, win, lose FROM member”; ResultSet result = stmt.executeQuery(viewStr); int count = 0; while(result.next()) { //기존의 msg에 “닉네임 : n승 n패@” 형태의 문자열을 계속해서 추가한다. msg = msg + result.getString(“nickname”) + ” : ” + result.getInt(“win”) + “승 ” + result.getInt(“lose”) + “패@”; count++; } System.out.println(“[Server] 전적 조회 성공”); //정상적으로 수행되면 성공을 콘솔로 알린다. } catch(Exception e) { //정상적으로 수행하지 못하면 실패를 콘솔로 알린다. System.out.println(“[Server] 전적 조회 실패 > ” + e.toString()); } return msg; //msg 반환 } //한 명의 회원의 전적을 조회하는 메소드. 해당 회원의 전적을 String 형태로 반환한다. String searchRank(String _nn) { String msg = “null”; //전적을 받을 문자열. 초기값은 “null”로 한다. //매개변수로 받은 닉네임을 초기화한다. String nick = _nn; try { //member 테이블에서 nick이라는 닉네임을 가진 회원의 승, 패를 조회한다. String searchStr = “SELECT win, lose FROM member WHERE nickname=’” + nick + “‘”; ResultSet result = stmt.executeQuery(searchStr); int count = 0; while(result.next()) { //msg에 “닉네임 : n승 n패” 형태의 문자열을 초기화한다. msg = nick + ” : ” + result.getInt(“win”) + “승 ” + result.getInt(“lose”) + “패”; count++; } System.out.println(“[Server] 전적 조회 성공”); //정상적으로 수행되면 성공을 콘솔로 알린다. } catch(Exception e) { //정상적으로 수행하지 못하면 실패를 콘솔로 알린다. System.out.println(“[Server] 전적 조회 실패 > ” + e.toString()); } return msg; //msg 반환 } //게임 승리 시 전적을 업데이트하는 메소드. 조회 및 업데이트에 성공하면 true, 실패하면 false를 반환한다. boolean winRecord(String _nn) { boolean flag = false; //참거짓을 반환할 flag 변수. 초기값은 false. //매개변수로 받은 닉네임과 조회한 승리 횟수를 저장할 변수. num의 초기값은 0. String nick = _nn; int num = 0; try { //member 테이블에서 nick이라는 닉네임을 가진 회원의 승리 횟수를 조회한다. String searchStr = “SELECT win FROM member WHERE nickname=’” + nick + “‘”; ResultSet result = stmt.executeQuery(searchStr); int count = 0; while(result.next()) { //num에 조회한 승리 횟수를 초기화. num = result.getInt(“win”); count++; } num++; //승리 횟수를 올림 //member 테이블에서 nick이라는 닉네임을 가진 회원의 승리 횟수를 num으로 업데이트한다. String changeStr = “UPDATE member SET win=” + num + ” WHERE nickname=’” + nick +”‘”; stmt.executeUpdate(changeStr); flag = true; //조회 및 업데이트 성공 시 flag를 true로 바꾸고 성공을 콘솔로 알린다. System.out.println(“[Server] 전적 업데이트 성공”); } catch(Exception e) { //조회 및 업데이트 실패 시 flag를 false로 바꾸고 실패를 콘솔로 알린다. flag = false; System.out.println(“[Server] 전적 업데이트 실패 > ” + e.toString()); } return flag; //flag 반환 } //게임 패배 시 전적을 업데이트하는 메소드. 조회 및 업데이트에 성공하면 true, 실패하면 false를 반환한다. boolean loseRecord(String _nn) { boolean flag = false; //참거짓을 반환할 flag 변수. 초기값은 false. //매개변수로 받은 닉네임과 조회한 패배 횟수를 저장할 변수. num의 초기값은 0. String nick = _nn; int num = 0; try { //member 테이블에서 nick이라는 닉네임을 가진 회원의 패배 횟수를 조회한다. String searchStr = “SELECT lose FROM member WHERE nickname=’” + nick + “‘”; ResultSet result = stmt.executeQuery(searchStr); int count = 0; while(result.next()) { //num에 조회한 패배 횟수를 초기화. num = result.getInt(“lose”); count++; } num++; //패배 횟수를 올림 //member 테이블에서 nick이라는 닉네임을 가진 회원의 승리 횟수를 num으로 업데이트한다. String changeStr = “UPDATE member SET lose=” + num + ” WHERE nickname=’” + nick +”‘”; stmt.executeUpdate(changeStr); flag = true; //조회 및 업데이트 성공 시 flag를 true로 바꾸고 성공을 콘솔로 알린다. System.out.println(“[Server] 전적 업데이트 성공”); } catch(Exception e) { //조회 및 업데이트 실패 시 flag를 false로 바꾸고 실패를 콘솔로 알린다. flag = false; System.out.println(“[Server] Error: > ” + e.toString()); } return flag; //flag 반환 } } // 여기서부턴 TMI ​ 교수님한테 배운대로 나름 코드를 깔끔하게 작성한다고는 했는데 …. ^^ 코드를 쓴 나야 깔끔해보이고 가독성 좋아보일지 모르지만 다른 사람들한테는 어떻게 읽힐지 모르겠다 그리고 과제로 냈던 프로젝트라 중간중간 이건 굳이 왜 주석이 있니? 싶은 부분이 있을지도 모름 🙄 ​ 다음 포스팅으로는 아마도 서버, 멀티룸 서버 쪽을 다루지 않을까 싶은데 작성한지 꽤 오래된 코드라 정확하고 깔끔하게 설명이 가능할 지 모르겠ㄷ..🤪🤪 과제하면서 이곳 저곳 참고한 블로그가 많은데 너무 오래돼서 찾기도 힘들고(그냥 귀찮은게 맞다) ​ 아무튼 오늘은 여기서 급 마무리 !!~ 인쇄

키워드에 대한 정보 자바 게임 프로젝트

다음은 Bing에서 자바 게임 프로젝트 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 자바 스네이크 게임 🐍

Java snake game

Java snake game tutorial

java snake game eclipse

java snake tutorial

java snake code

java

snake

game

tutorial

for beginners

java snake game code eclipse

snake game in java

java snake game

snake game java

java snake

snake in java

자바 #스네이크 #게임 #🐍

YouTube에서 자바 게임 프로젝트 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 자바 스네이크 게임 🐍 | 자바 게임 프로젝트, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

객체지향 좀 더 이해하기 – 블랙잭 게임 구현 (1)

순수 Java로 이루어진 프로젝트

객체지향을 이해하는데 있어 게시판은 좋은 예제가 아니라는 자바지기(박재성)님과 OKKY fender님의 이야기로 시작한 프로젝트

Java로 웹을 한다고 하면서 실제로 Java와 객체지향을 공부한적이 없던것 같다는 생각이 있었습니다.

그래서 데이터베이스, JSP를 전혀 사용하지 않고 Java와 객체에 좀 더 집중할 예정입니다.

모든 코드는 Github에 있으니 전체 코드를 보고싶으시면 참고하시면 될것 같습니다.

(공부한 내용을 정리하는 Github와 세미나&책 후기를 정리하는 Github 를 star 하시면 실시간으로 feed를 받을 수 있습니다.)

주제

블랙잭 게임(나무위키 참고)을 개량해서 구현할 예정입니다.

블랙잭 규칙 전부를 구현하는건 지나친 감이 있어서 조금은 스펙아웃하였습니다.

화면 구성은 모두 콘솔로 진행할 예정입니다..

블랙잭 규칙

딜러와 게이머 단 2명만 존재한다.

카드는 조커를 제외한 52장이다. (즉, 카드는 다이아몬드,하트,스페이드,클럽 무늬를 가진 A,2~10,K,Q,J 으로 이루어져있다.)

2~10은 숫자 그대로 점수를, K/Q/J는 10점으로, A는 1로 계산한다. (기존 규칙은 A는 1과 11 둘다 가능하지만 여기선 1만 허용하도록 스펙아웃)

계산한다. (기존 규칙은 A는 1과 11 둘다 가능하지만 여기선 1만 허용하도록 스펙아웃) 딜러와 게이머는 순차적으로 카드를 하나씩 뽑아 각자 2개의 카드를 소지한다.

게이머는 얼마든지 카드를 추가로 뽑을 수 있다.

딜러는 2카드의 합계 점수가 16점 이하이면 반드시 1장을 추가로 뽑고, 17점 이상이면 추가할 수 없다.

양쪽다 추가 뽑기 없이, 카드를 오픈하면 딜러와 게이머 중 소유한 카드의 합이 21에 가장 가까운 쪽이 승리한다.

단 21을 초과하면 초과한 쪽이 진다.

설계원칙

클래스 우선이 아닌, 객체의 속성과 행위가 우선이다. 클래스는 객체를 추상화하는 도구일 뿐이다.

데이터가 아닌 메세지(행위)를 중심으로 객체를 설계해라. 객체는 혼자 있을 수 없다. 다른 객체와의 협력 안에서만 존재할 수 있다. 메세지를 중심으로, 해당 메세지가 어떤 객체를 필요로 하는지를 생각하자.

하나하나 지시하지 말고 요청해라. 예를들어, 판사가 증인에게 1) 목격했던 장면을 떠올리고, 2) 떠오르는 시간을 순서대로 구성하고, 3) 말로 간결하게 표현해라 라고 요청하지 않는다. 그냥 “증언하라” 라고 요청한다. 마찬가지로 객체의 설계단계에서도 책임이 있는 객체에 요청만 하도록 설계한다.

하나의 메소드는 하나의 일만 해야한다.

처음부터 완벽한 설계는 없다. 설계를 코드로 구현해가는 과정에서 수정이 필요하다면 설계를 수정한다.

주요 객체

카드뭉치 (카드덱)

카드

규칙

딜러

게이머

주요 객체들의 속성과 역할

카드뭉치 (카드덱) 52개의 서로 다른 카드를 갖고 있다. 카드 1개를 뽑아준다.

카드 다이아몬드, 하트, 스페이드, 클럽 중 1개의 무늬를 가지고 있다. A,2~10,K,Q,J 중 하나를 가지고 있다.

규칙 점수를 측정해준다. 승패를 판단한다.

딜러 추가로 카드를 받는다. 단, 2카드의 합계 점수가 16점 이하이면 반드시 1장을 추가로 뽑고, 17점 이상이면 받을 수 없다. 뽑은 카드를 소유한다. 카드를 오픈한다.

게이머 추가로 카드를 받는다. 뽑은 카드를 소유한다.

카드를 오픈한다.

1. 추상화된 코드 구현

위의 “객체들의 속성과 역할”을 도식화 하면 아래와 같습니다.

위 관계도에 따라 간략하게 코드를 구현하면 아래와 같습니다.

Card.java

public class Card { private String pattern; private String denomination; public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getDenomination() { return denomination; } public void setDenomination(String denomination) { this.denomination = denomination; } }

Card의 pattern은 무늬를, denomination는 끗수(A,2~10,J,Q,K)를 얘기합니다.

CardDeck.java

public class CardDeck { private List cards; public Card getCard(){ return null; } }

Dealer.java

public class Dealer { private List cards; public void receiveCard(Card card) {} public List openCards(){ return null; } }

Gamer.java

public class Gamer { private List cards; public void receiveCard(Card card) {} public List openCards(){ return null; } }

Rule.java

public class Rule { public int getScore(List cards){ return 0; } public void getWinner(Dealer dealer, Gamer gamer){} }

return 타입이 void가 아닌 경우엔 null을 리턴하도록 하였습니다.

위 선언된 5개의 Java파일 만으로는 블랙잭 게임이 진행될 순 없습니다.

실제로 게임을 진행시킬 Game.java를 구현해보겠습니다.

Game.java

public class Game { public void play(){ System.out.println(“========= Blackjack =========”); Dealer dealer = new Dealer(); Gamer gamer = new Gamer(); Rule rule = new Rule(); CardDeck cardDeck = new CardDeck(); } }

게임에 필요한 “클래스들의 인스턴스”를 생성시켰습니다.

(객체가 아닌, xx클래스의 인스턴스입니다.)

그리고 이를 실행시킬 Application.java입니다.

Application.java

public class Application { public static void main(String[] args) { Game game = new Game(); game.play(); } }

2-1. 실제 코드 구현 (CardDeck)

이제 좀 더 구체화된 코드를 작성해보겠습니다.

첫번째 카드를 뽑기 위해 play에 아래 코드를 추가하겠습니다.

Card card = cardDeck.draw();

CardDeck.draw 메소드는 실제로 카드를 뽑아줘야 하기 때문에 구체적된 코드를 작성해보겠습니다.

draw는 남아 있는 카드 중 랜덤한 1개의 카드를 준다 라는 CardDeck의 유일한 역할을 하고 있습니다.

즉, CardDeck은 본인의 역할을 수행하기 위해 52개의 서로 다른 카드가 존재 해야만 합니다.

생성 되는 시점에는 이 조건을 만족해야만 하기 때문에 생성자 를 사용하겠습니다.

CardDeck.java

private static final String[] PATTERNS = {“spade”, “heart”, “diamond”, “club”}; private static final int CARD_COUNT = 13; public CardDeck() { cards = new ArrayList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination; if(i == 1){ denomination = "A"; }else if(i == 11){ denomination = "J"; }else if(i == 12){ denomination = "Q"; }else if(i == 13){ denomination = "K"; }else { denomination = String.valueOf(i); } card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } } 아주 빠르게 코드를 작성하면 위와 같이 작성할 수 있을것 같습니다. 현재 코드에서는 몇가지 개선할 것들이 보입니다. 카드의 끗수(denomination)를 결정하는 부분은 생성자의 역할이 아닙니다. 즉, 1~13 이라는 숫자를 통해 끗수를 정하는 것은 다른 메소드에서 해야할 일입니다. 그래서 numberToDenomination 라는 메소드를 통해 이 역할을 분리하겠습니다. private static final String[] PATTERNS = {"spade", "heart", "diamond", "club"}; private static final int CARD_COUNT = 13; public CardDeck() { cards = new ArrayList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination = this.numberToDenomination(i); card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } } private String numberToDenomination(int number){ if(number == 1){ return "A"; }else if(number == 11){ return "J"; }else if(number == 12){ return "Q"; }else if(number == 13){ return "K"; } return String.valueOf(number); } numberToDenomination 메소드를 작성하게 되면 한가지 더 마음에 안드는 것이 보일것입니다. 바로 52개의 Card List를 생성하는 코드입니다. 이 코드 역시 생성자의 역할은 아닙니다. 생성자가 실행을 시킬 역할이 있을 뿐이지 실제 비지니스 로직을 알고 있어야 할 필요는 없습니다. 그렇기에 이 역시 코드를 분리하도록 하겠습니다. private static final String[] PATTERNS = {"spade", "heart", "diamond", "club"}; private static final int CARD_COUNT = 13; public CardDeck() { cards = this.generateCards(); } private List generateCards() { List cards = new LinkedList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { Card card = new Card(); String denomination = this.numberToDenomination(i); card.setDenomination(denomination); card.setPattern(pattern); cards.add(card); } } return cards; } private String numberToDenomination(int number){ if(number == 1){ return "A"; }else if(number == 11){ return "J"; }else if(number == 12){ return "Q"; }else if(number == 13){ return "K"; } return String.valueOf(number); } 이렇게 분리하고 나면, 각 메소드는 하나의 역할에만 충실할 수 있게 되었습니다. 여기서 추가로, Card의 인스턴스를 생성하고 뒤에 set메소드를 통해 끗수(denomination)와 무늬(pattern)를 지정하는 코드를 개선해보겠습니다. Card.java private String pattern; private String denomination; public Card(String pattern, String denomination) { this.pattern = pattern; this.denomination = denomination; } public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; } public String getDenomination() { return denomination; } public void setDenomination(String denomination) { this.denomination = denomination; } CardDeck.java private List generateCards() { List cards = new LinkedList<>(); for(String pattern : PATTERNS){ for(int i=1; i<=CARD_COUNT; i++) { String denomination = this.numberToDenomination(i); Card card = new Card(pattern, denomination); cards.add(card); } } return cards; } 기본 생성자와 set메소드를 사용하지 않고, 인자가 추가된 생성자를 사용한 이유는 무엇일까요? (참고로 Java는 생성자가 없으면 기본생성자가 자동 추가되며, 별도의 생성자가 추가되면 기본생성자가 자동 추가되지 않습니다.) 끗수와 무늬를 가지고 Card가 어떤 행위를 하는지 CardDeck은 몰라도 된다. 즉, Card에서 끗수와 무늬를 마음대로 활용하더라도 CardDeck은 아무런 영향이 없다. Card는 끗수와 무늬가 필수임을 강제 할 수 있다. Card에 기본 생성자가 있으면 끗수와 무늬가 없는 Card가 생성 될 수 있다. 하지만 이렇게 하게 되면 끗수와 무늬가 없는 Card는 생성 될 수 없다 할 수 있다. 자 그럼 CardDeck이 잘 생성되는지 확인하기 위해 간단하게 출력을 시켜보겠습니다. Card.java @Override public String toString() { return "Card{" + "pattern='" + pattern + ", denomination='" + denomination + '}'; } CardDeck.java @Override public String toString() { StringBuilder sb = new StringBuilder(); for(Card card : cards){ sb.append(card.toString()); sb.append(" "); } return sb.toString(); } Game.java public void play(){ System.out.println("========= Blackjack ========="); Scanner sc = new Scanner(System.in); Dealer dealer = new Dealer(); Gamer gamer = new Gamer(); Rule rule = new Rule(); CardDeck cardDeck = new CardDeck(); System.out.println(cardDeck.toString()); } 위 코드를 통해 Application.java를 실행시키면! 이렇게 52개의 서로 다른 카드가 생성되었음을 확인할 수 있습니다. 바로 draw기능을 만들어 보겠습니다. draw는 2가지를 해야 합니다. 남아 있는 카드 중 1개를 뽑는다. 뽑은 카드는 카드덱에서 제거한다. 이걸 간단하게 구현하면 아래와 같은 코드가 됩니다. public Card draw(){ int size = cards.size(); int select = (int)(Math.random()*size); Card selectedCard = cards.get(select); cards.remove(select); return selectedCard; } 코드를 작성한 것을 보면 몇가지 개선할 것이 있습니다. remove 기능은 랜덤하게 뽑힌 카드를 제거 하는 작업입니다. 현실에서는 이 작업이 크게 어려운일이 아니지만, 코드속에서는 이 작업은 List별로 구현 방식이 큰 차이가 발생합니다. ArrayList ArrayList의 remove는 해당 인덱스의 인스턴스를 제거하고 남은 데이터들을 다시 Copy 합니다. 즉, ArrayList는 중간중간 인스턴스를 제거하는 방식이 결코 좋은 성능을 내지 못하는 것입니다. 반면에 LinkedList의 경우는 remove를 아래와 같이 합니다. LinkedList LinkedList의 remove와 remove에서 사용되는 unlink 메소드의 코드입니다. 보시는것처럼 LinkedList의 remove는 해당 node와 연결을 맺고 있는 앞 뒤 node의 연결을 끊어버림으로써 remove를 하게됩니다. 즉, 중간중간 인스턴스의 제거 혹은 추가의 경우는 LinkedList가 ArrayList보다 훨씬 더 좋은 성능을 보이게 됩니다. (좀 더 상세하게 알고 싶으시다면 넥스트리의 블로그를 추천드립니다. ) 자 그럼 CardDeck의 cards를 LinkedList로 교체하겠습니다. cards = new LinkedList<>();

List라는 인터페이스로 cards를 선언 하였기에 구현체가 ArrayList가 되든, LinkedList가 되든 다른 코드를 수정할 필요가 없습니다.

그리고 현재 draw에는 남아있는 카드들 중 하나를 뽑는 것과, 카드를 제거하는 것 2가지를 동시에 하고 있기에 이를 분리하겠습니다.

public Card draw(){ Card selectedCard = getRandomCard(); cards.remove(selectedCard); return selectedCard; } private Card getRandomCard() { int size = cards.size(); int select = (int)(Math.random()*size); return cards.get(select); }

다른 메소드와 달리 getRandomCard는 접근 제한자를 private로 하였습니다.

private 접근 제한자는 해당 클래스외에는 접근할 수가 없습니다.

그래서 외부에서 사용되지 않는 변수/메소드들은 private 접근제한자를 사용하여 타인이 코드만 보고도, 해당 변수/메소드는 현재 클래스에서만 사용된다는 것을 명시 하는 것이 더 좋습니다.

여기까지 CardDeck을 구현하였습니다.

차근차근 나머지 객체들 역시 진행하겠습니다.

키워드에 대한 정보 자바 게임 프로젝트

다음은 Bing에서 자바 게임 프로젝트 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 201332009 – 탁구 게임(자바 프로젝트)

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

201332009 #- #탁구 #게임(자바 #프로젝트)


YouTube에서 자바 게임 프로젝트 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 201332009 – 탁구 게임(자바 프로젝트) | 자바 게임 프로젝트, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  목요일 인사 이미지 | #목요일 아침인사이미지#내가만든이미지 185 개의 새로운 답변이 업데이트되었습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *