public class Bomba extends GraphicsProgram { public static final int WINDOW_SIZE = 500; public static final int FIELD_SIZE=10; public static final int MASHTAB=50; public static final int SPEED=5; public static final GImage bombs[]=new GImage[10]; public static final int count[]=new int[10]; public static final int countPl[]=new int[10]; public static final GImage fire[][]=new GImage[10][18]; public static final int countFire[]=new int[10]; public static final GRect block[]=new GRect[20];
private int kolvoKvadr=16; private GLabel lifeL1,lifeL2; private int life1=3,life2=3; private int explode1Length=2,explode2Length=3; private int bomb1=0,bomb2=0; private int bomb1Max=5,bomb2Max=5; private int lol1; private int lol2; private int dX1,dX2,dY1,dY2; private GImage player1; private GImage player2;
private Random random = new Random(); }
Знаете такую игру бомберы? Ну вот тут по сути основная оболочка игрового процесса. Осталось только ещё понакидать разрушаемые ящики и апгрейды в них. А всё передвижение, блоки, взаимодействие с бомбами уже реализовано. В первый день это было интересно. Сегодня это уже просто сложно. Мб просто я болею и мало хаваю, а это сразу настроение не оч.
Добавлено (24.11.2012, 02:56) --------------------------------------------- Это пиздец... тут буквально несколько страниц, сколько же Скайнет въебывал хз, после этого можно точно сказать, что карту делать не стоит.
Ок, тогда я не делаю английский, украинский, матанализ. дискретную математику, не хожу на физру.
Въебывал весь день, хоть и суббота. Зато доделал. Реализована вся хуйня, кроме красивой графики. Ну первоначальное поле также рисуется вручную, ибо рандомом будет хуйня.
public class Bomba extends GraphicsProgram { public static final int WINDOW_SIZE = 500; public static final int FIELD_SIZE=10; public static final int MASHTAB=50; public static final int SPEED=5; public static final GImage bombs[]=new GImage[10]; public static final int count[]=new int[10]; public static final int countPl[]=new int[10]; public static final GImage fire[][]=new GImage[10][18]; public static final int countFire[]=new int[10]; public static final GRect block[]=new GRect[20]; public static final GRect box[]=new GRect[100]; public static final GImage prize[]=new GImage[100]; public static final int prizeType[]=new int [100];
//Initialising; public void init(){ this.setSize(WINDOW_SIZE+150,WINDOW_SIZE); createField(); addPlayers(); addKeyListeners(listener); lifeL1=new GLabel("Жизни первого: "+life1); lifeL2=new GLabel("Жизни второго: "+life2); add(lifeL1,510,50); add(lifeL2,510,100); immuneBlocks(); notImmuneBlocks(); //скорость бега для первого run1.schedule(leha1(), 0, speed1);
//cкорость бега для второго run2.schedule(leha2(), 0, speed2);
KeyListener listener = new KeyListener(){ @Override public void keyTyped(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) { switch(e.getKeyCode()){ case 39: case 37: dX1 = 0; dY1=0; break; case 38: case 40: dY1 = 0; dX1=0; } switch(e.getKeyChar()){ case 'ф': case 'в': dX2=0; dY1=0; break; case 'ц': case 'ы': dY2=0; dX1=0; } } @Override public void keyPressed(KeyEvent e){ // 32 пробел, 10 энтер switch(e.getKeyCode()){ case 37: if(dX1==1){dX1-=2;} else if (dX1==0) {dX1--;} lol1=1; break; case 38: if(dY1==1){dY1-=2;} else if (dY1==0) {dY1--;} lol1=0; break; case 39: if(dX1==-1){dX1+=2;} else if (dX1==0) {dX1++;} lol1=1; break; case 40: if(dY1==-1){dY1+=2;} else if (dY1==0) {dY1++;} lol1=0; break; case 10: bomb(1); break; case 32: bomb(2); } switch(e.getKeyChar()){ case 'ф': if(dX2==1){dX2-=2;} else if (dX2==0) {dX2--;} lol2=1; break; case 'ц': if(dY2==1){dY2-=2;} else if (dY2==0) {dY2--;} lol2=0; break; case 'в': if(dX2==-1){dX2+=2;} else if (dX2==0) {dX2++;} lol2=1; break; case 'ы': if(dY2==-1){dY2+=2;} else if (dY2==0) {dY2++;} lol2=0; } } };
//Взрывает бомбу через время Timer timer2 = new Timer(); TimerTask mainTask2 = new TimerTask(){ @Override public void run(){ for(int i=0; i<bombs.length; i++){ if (count[i]!=0) {count[i]--; if(count[i]==0) { playAnimation(bombs[i],countPl[i]); countCurrentBomb--; remove(bombs[i]); bombs[i]=null; if (countPl[i]==1) bomb1--; else bomb2--; } }
} } };
//Убирает огонь через время Timer timer3 = new Timer(); TimerTask mainTask3 = new TimerTask(){ @Override public void run(){ for(int i=0; i<countFire.length; i++){ if(countFire[i]!=0){ countFire[i]--; if(countFire[i]==0){ for(int l=0; l<18; l++){ if(fire[i][l]!=null){ remove(fire[i][l]); fire[i][l]=null; } else break; } } } } } };
//Рисует огонь и запускает проверки на пересечение с блоком или игроком private void playAnimation(GImage bomb,int player){ int k,n=0,explode,mnog=1,mnog1=1; boolean mognoPlus=true,mognoMinus=true; for(k=0; k<10;){ if (fire[k][0]==null) break; else k++; } if(player==1)explode=explode1Length; else explode=explode2Length; for(int i=0; i<=explode; i+=mnog,mnog1*=-1,mnog=(mnog+mnog1*(-1))*(-1)){ if(((bomb.getX()-1)+i*50)>=0 && ((bomb.getX()-1)+i*50)<=(WINDOW_SIZE-MASHTAB)){
//Метод описывает как огонь убивает разрушаемый блок. private void destroyBox(GRect box, int i){ addPrize(box); remove(box); for(int k=i+1; k<countBox; k++){ this.box[k-1]=this.box[k]; } countBox--; }
private void addPrize(GRect box){ int n=1+random.nextInt(2); if(n==1){ n=1+random.nextInt(4); switch(n){ case 1:{ n=countPrize; prize[n]=new GImage("plusBomb.png",box.getX(),box.getY()); countPrize++; prizeType[n]=1; add(prize[n]); break; } case 2:{ n=countPrize; prize[n]=new GImage("plusHealth.png",box.getX(),box.getY()); countPrize++; prizeType[n]=2; add(prize[n]); break; } case 3:{ n=countPrize; prize[n]=new GImage("plusRadius.png",box.getX(),box.getY()); countPrize++; prizeType[n]=3; add(prize[n]); break; } case 4:{ n=countPrize; prize[n]=new GImage("plusSpeed.png",box.getX(),box.getY()); countPrize++; prizeType[n]=4; add(prize[n]); } } }
}
//Проверяет не появится ли огонь на блоке. private boolean checkFireBlock(double x, double y){ for(int i=0; i<16; i++){ if(block[i].getX()-1==x && block[i].getY()-1==y) return false; } return true; }
//Даёт награду игроку за поднятый итем. private void givePrize(int player,int nomer){ if(player==1){ switch(prizeType[nomer]){ case 1: if(bomb1Max!=5) bomb1Max++; break; case 2: if(life1!=3) {life1++; table();} break; case 3: if(explode1Length!=4)explode1Length++; break; case 4: if(speed1!=5) {speed1--; run1.cancel(); run1=new Timer(); run1.schedule(leha1(), speed1, speed1);} } } else switch(prizeType[nomer]){ case 1: if(bomb2Max!=5) bomb2Max++; break; case 2: if(life2!=3) {life2++; table();} break; case 3: if(explode2Length!=4)explode2Length++; break; case 4: if(speed2!=5) {speed2--; run2.cancel(); run2=new Timer(); run2.schedule(leha2(), speed1, speed2);} } remove(prize[nomer]); for(int i=nomer; i<countPrize-1; i++){ prize[i]=prize[i+1]; prizeType[i]=prizeType[i+1]; } countPrize--;
private int speed1=10,speed2=10; private int countPrize=0; private int countCurrentBomb=0; private int countBox; private int kolvoKvadr=0; private GLabel lifeL1,lifeL2; private int life1=3,life2=3; private int explode1Length=1,explode2Length=1; private int bomb1=0,bomb2=0; private int bomb1Max=1,bomb2Max=1; private int lol1; private int lol2; private int dX1,dX2,dY1,dY2; private GImage player1; private GImage player2;
private Random random = new Random(); }
665 строк кода за 3 дня. хороший высер Принцесса
Сообщение отредактировал kebal - Воскресенье, 25.11.2012, 02:33
Ну это не форум программистов, хотя там просто помогать не будут)) Ну если есть желание искать ошибки в коде, то playerX.move(d??, d??); Когда ты делал код, не посещала идея, что копирование строчек кода, это, как странно... Есть такая вещь, как функция, она сократит твой код где то строчек 100.
Нихуя. Когда препод сегодня говорит: Сколько у тебя строк в коде? Я говорю, там с движением у меня в два раза больше, чем должно быть, поэтому по идее раза в полтора меньше, чем вы тут видите. Поэтому идите нахуй. Какая функциональность? Оно бы только визуально было бы меньше. А так оно что первый, что второй вызывает только по вызову.
Добавлено (26.11.2012, 22:56) --------------------------------------------- ciklopper, это можно сделать иначе, чем передавать методу дохуя параметров? и тогда он будет подставлять эти параметры, например первый Player, второй это строка lol которая переделывается либо в lol1 либо в lol2 и так для каждого параметра?
Ну блин, ты же знаешь что такое ООП. Вот в данном случае ты им не пользуешься и так прогать грешно=) Смысл вот в чем у тебя мув.плэир 1, 2, вверх, вниз, право, лево, лень вникать в код, но ты это делаешь повторяя 2 разных кода по 4ре раза! Вместо этого можно создать 2 функции которой будут передаваться определенные параметры, тем саммым уменьшая код и делая возможность усовершенствования программы. Вот ты сейчас себе вбил, что у меня 2 игрока. А если их сделать 4? То у тебя код увеличится в 1.5 раза??? А если 8 игроков(не вдумываясь про клаву). То всё прога растёт на глазах и мы ловим полный пиздец! Хотя у обычного прогера с добавлением еще 1го игрока добавилось пару строк. Прогать функциями придётся всегда и в любом языке без этого в сложных прогах не обойтись, защищу диплом выложу свою прогу.
Нихуя. Когда препод сегодня говорит: Сколько у тебя строк в коде? Я говорю, там с движением у меня в два раза больше, чем должно быть, поэтому по идее раза в полтора меньше, чем вы тут видите. Поэтому идите нахуй. Какая функциональность? Оно бы только визуально было бы меньше. А так оно что первый, что второй вызывает только по вызову. Добавлено (26.11.2012, 22:56) --------------------------------------------- ciklopper, это можно сделать иначе, чем передавать методу дохуя параметров? и тогда он будет подставлять эти параметры, например первый Player, второй это строка lol которая переделывается либо в lol1 либо в lol2 и так для каждого параметра?
какая нахуй разница, я повторюсь - код нихуя не граммотный, + не выёбывайся, гы
Добавлено (20.12.2012, 01:49) --------------------------------------------- ciklopper, слышишь, умник. Task для Timera по сути создается единожды и работает дальше. В таске соответственно dx1, dy1 для первого игрока и dx2, dy2 для второго игрока. По ходу игры они постоянно изменяются, а вот сам Task нет. Соответственно при запуске этого Task я смогу передать эти dx и dy только вначале. Соответственно когда dx и dy будут меняться, сам Task это нихуя колыхать не будет, и он соответственно работать не будет, так как первоначальные значения dx и dy передаваемые в метод были равны 0.