티스토리 툴바


Diary2012/01/13 19:53


  사내 기숙사로 옮긴 이후 인터넷 사용에 제약이 생기는 바람에 블로그를 하지 못했다.
  요즘에는 대회 때문에 하지 못했던 이것저것들을 많이 해보는 중이다.
  특히 프로그래밍 언어의 경우 다음과 같은 것들을 중급 단계 정도까지 해보았다.



Java Programming (이제는 이 놈을 VBA 보다 더 선호한다.)
cURL
HTML5 (캔버스가 참 맘에 들어...)
jQuery
jQueryMobile
PHP/JSP
C/C++
Win32 API (이 놈은 책까지 샀다. 어차피 알아야 하니까.)


엄청 많이 했던 것 같은데 써놓고 보니 별로 없는 것 같다.
jQuery Mobile은 특히 모바일 페이지를 만들기 쉽고 이뻐서 좋다.
나중에 사외 기숙사로 옮기면 데스크 탑을 하나 질러서 서버나 하나 차려야겠다.

저작자 표시 비영리 변경 금지
Posted by 리에
Programming/JAVA2011/12/08 08:50


자바를 처음 접한지 2주만에 만든 게임 하나
객체 지향 프로그래밍을 제대로 활용하지 못하고 있다는 증거 코드이다.
클래스 단 하나에 몽땅 때려 박은 것이 그 증거.



객체 지향에 언제쯤 익숙해질 수 있을까 모르겠네.

플레이 해보고 싶으신 분들은 1번 링크에서 자바 런타임을 설치한 뒤에 첨부한 jar 파일을 받아 실행하시면 됩니다.

1. 자바 런타임 (jre)

http://www.java.com/ko/download/



2. 실행 파일 (jar)



3. 소스 코드 (java)



아래는 그 코드
package game;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.Timer;
import java.util.TimerTask;;

public class game extends TimerTask { 
 
 public static final int defaultSize = 15;
 public static final int defaultBlock = 30;
 public static final int defaultBlank = 3;
 public static final int defaultSnake = 5;
 public static final int defaultItem = 15;
 
 public int moveMode=2;
 public LinkedList<DrawObject> arrSnake = new LinkedList<DrawObject>();
 public LinkedList<DrawObject> arrMeat = new LinkedList<DrawObject>();
 
 public Timer timer = new Timer();
 public Random random = new Random();

 JFrame frame = new JFrame("Snake");
 public static void main(String[] args) {
  new game().go();
 }
 
 public void go() {
  createGUI();
  InitializeGame();
  createItem(defaultItem);
  timer.schedule(this, 0, 200);
 }
 
 private void createGUI() {
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setContentPane(new MyDrawPanel());
  frame.setSize(600,600);
  frame.setResizable(false);
  frame.setVisible(true);
  frame.addKeyListener(new KeyEvent());
 }
 
 private void InitializeGame() {
  arrSnake.clear();
  arrMeat.clear();
  
  // Create Deafult Snake
  int Left=(int)(defaultBlock / 2);
  int Top=(int)((defaultBlock-defaultSnake) / 2);
  for(int i=0; i<defaultSnake; i++)
   arrSnake.add(new DrawObject(Left, Top++, Color.blue));
  arrSnake.get(0).color = Color.red;
 }
 
 private void createItem() { createItem(1); }
 private void createItem(int itemCnt) {
  int rndX, rndY;
  
  for (int i=0; i<itemCnt; i++) {
   while (true) {
    rndX = random.nextInt(defaultBlock-2)+1;
    rndY = random.nextInt(defaultBlock-2)+1;
    
    for (DrawObject d : arrMeat)
     if (d.X == rndX && d.Y == rndY) continue;
    
    for (DrawObject d : arrSnake)
     if (d.X == rndX && d.Y == rndY) continue;
    
    arrMeat.add(new DrawObject(rndX, rndY, Color.green));
    break;
   }
  }
 }
 
 public void run() { // Timer
  move();
 }
 
 private void move() {  
  if (arrSnake.size() >= 1) {
   DrawObject prevHead = arrSnake.get(0);
   DrawObject nextHead = new DrawObject(prevHead.X, prevHead.Y, Color.red);
   
   prevHead.color = Color.blue;
   if (moveMode == 1) {
    nextHead.X--;
   } else if(moveMode == 2) {
    nextHead.Y--;
   } else if(moveMode == 3) {
    nextHead.X++;
   } else if(moveMode == 4) {
    nextHead.Y++;
   }
   
   // 맵 아웃 테스트
   if (nextHead.X < 0 || nextHead.Y < 0 || nextHead.X >= defaultBlock || nextHead.Y >= defaultBlock ) {
    gameOver();
   }
   
   // 몸통과 아이템 충돌 테스트
   if (crashCheck(arrSnake, nextHead.X, nextHead.Y)) {
    gameOver();
   } else if (crashCheck(arrMeat, nextHead.X, nextHead.Y)) {
    createItem();
   } else {
    arrSnake.remove(arrSnake.size()-1);
   }
   
   arrSnake.addFirst(nextHead);
   frame.repaint();
  }
 }
 
 private boolean crashCheck(LinkedList<DrawObject> arrItems, int X, int Y) {
  for (DrawObject d : arrItems) {
   if (d.X == X && d.Y == Y){
    arrItems.remove(d); // 충돌된 객체를 삭제
    return true;
   }
  }
  return false;
 }
 
 private void drawArray(LinkedList<DrawObject> arrItems, Graphics g) {
  for(DrawObject d : arrItems){
   g.setColor(d.color);
   g.fillRect(d.X*(defaultSize+defaultBlank)+defaultBlank, d.Y*(defaultSize+defaultBlank)+defaultBlank, defaultSize, defaultSize);
  }
 }
 
 private void gameOver() {
  JOptionPane.showMessageDialog(frame, "Game Over!", "Game Over", JOptionPane.ERROR_MESSAGE);
  System.exit(0);
 }
 
 public class MyDrawPanel extends JPanel {
  private static final long serialVersionUID = 1L;

  @Override
  protected void paintComponent(Graphics g) {
   g.setColor(Color.white);
   g.fillRect(0, 0, getWidth(), getHeight());
   
   // 채우기 그리기
   drawArray(arrMeat,g);
   drawArray(arrSnake,g);
   
   // 외곽선 그리기
   g.setColor(Color.gray);
   for (int i=0; i<defaultBlock; i++) {
    for (int j=0; j<defaultBlock; j++) {
     g.drawRect(j*(defaultSize+defaultBlank)+defaultBlank, i*(defaultSize+defaultBlank)+defaultBlank, defaultSize, defaultSize);
    }
   }
  }
 }
 
 public class KeyEvent implements KeyListener {
  public void keyPressed(java.awt.event.KeyEvent e) {
   int keyNum = e.getKeyCode();
   
   if (keyNum==37 && moveMode != 3) {
    moveMode = 1;
   } else if (keyNum == 38 && moveMode != 4){
    moveMode = 2;
   } else if (keyNum == 39 && moveMode != 1) {
    moveMode = 3;
   } else if (keyNum == 40 && moveMode != 2){
    moveMode = 4;
   }
//   move(); //Test
  }
  public void keyReleased(java.awt.event.KeyEvent e) {}
  public void keyTyped(java.awt.event.KeyEvent e) {}
 }
 
 public class DrawObject {
  int X, Y;
  Color color;
  
  public DrawObject(int x, int y, Color color) {
   X = x;
   Y = y;
   this.color = color;
  }
 }
}





 

저작자 표시 비영리 변경 금지
Posted by 리에
Media2011/11/27 18:40


귀요미... 키운지 이제 한 2년 되었나. 
나중에 기숙사 나와서 자취 시작하면 얘 데리고 살아야지. 
그나저나 사진에 나오는 날짜가 왜 잘못 나왔을까.
내가 설정을 잘못 건든 모양. 
저작자 표시 비영리 변경 금지
Posted by 리에
Diary2011/11/23 00:18
  며칠 전일까 아침에 세수를 하다가 그만 평소 사용하던 면도기를 놓고 나온 모양이었다. 
  그것도 몇개월 전에 수원 기숙사에 살 때에 4중날 면도기를 잃어버려서 새로 사기도 귀찮아 줄곧
  여행용 세안 세트에 있던 일회용 면도기를 이름과는 디르게 굉장히 오래 써 왔는데
  정들었던 그 녀석을 그만 잊어버리고 말았나보다.

   수염도 꽤 자라서 거뭇거뭇 해진 바람에 끝나고 돌아오는 길에 사내 편의점엘 갔더니
   무려 전동 기능이 있는 5중날 면도기가 있었다. 왠지 전동이라고 하면 비쌀 거 같아서
   이거 얼마에요 하고 물어보니 1만 4천원이랜다.

   음 적절하군 하고 바로 계산대에 올려놓고 덤으로 섬유유연제도 같이 질렀다.
   방금 전에 샤워를 하면서 써보니 과연 설명서에 적힌 듯 부드럽게 면도가 된다.
   혹시 문구를 봐서 괜히 그런 생각이 드는가 싶기도 하고, 면도날이 새거라 그런가
  싶기도 하지만 왠지 전동이라고 하니 신기해보였다. 

  그나저나 어제 질렀던 이어폰하고 블루투스 키보드는 언제 오는겨...

   
저작자 표시 비영리 변경 금지
Posted by 리에
Diary2011/11/20 16:08

대회도 끝났고, 이제 충분히 휴식을 취했다고 생각한다.
이제는 자기 개발을 해야 할 시간이라고 생각한다.

프로그래밍 공부 뿐만이 아니라 내가 못하는 것에 대해서 배워보고 싶다.

요즘 생각 하고 있는 것으로는 수영, 기타, 영어 같은 것들이 있다.
학원을 통해서 배우면 될 거라고 생각 중이다. 회사 근처에 이러한 학원도 꽤 있는 것 같다.
취미로는 어플리케이션을 만들어보고 싶은데 아직은 문법을 배우는 단계니까..

내일부터 구체적으로 계획을 잡아봐야겠다.
저작자 표시 비영리 변경 금지
Posted by 리에