Hoppa till innehåll

Wasd 4-i-rad


WASD
 Dela

Rekommendera inlägg

Från skaparen av: WASD Radio, WASD Chat, WASD RPG, WASD Skraplotter, etc... kommer nu: WASD 4-i-rad!

 

http://dl.dropbox.com/u/7999872/WASD%204-i-rad.jar

 

Uppdatering: Botten är nu smart :)

 

Edit: Lagt in Anti-aliasing :D

Före: http://i.imgur.com/gzcIO.png

Efter:

http://i.imgur.com/madJ8.png

 

Gjorde detta programmet på typ 1-2 timmar. Feedback pl0x :)

 

Bottens algoritm:

1. Botten kollar ifall den kan vinna, botten lägger där isåfall.

2. Botten kollar ifall du kan vinna, den blockar dig isåfall.

3. Botten slumpar nånstans att lägga. Ifall du kan vinna efter att den lägger där den slumpade så slumpar den en ny plats tills du inte kan vinna också lägger den där.

4. Om du inte kan vinna var botten än lägger så slumpar den bara nåt.

Exempel: Ifall den lägger på steg 2 hoppar den ur algoritmen och kollar inte 3 och 4.

Har skydd emot att den fastnar i en loop på steg 3 ifall du kan vinna var botten än lägger.

 

 

Källkod: (Algoritmen är inte med här, botten slumpar var den ska lägga)

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main extends Canvas{

   private boolean running = true;
   private int[][] row = new int[7][6];

   private BufferStrategy strategy;
   private JFrame container;
   private Color cc = new Color(0, 0, 180);

   public static void main(String[] args) {
       Main m = new Main();
       m.rita();
   }
   public Main(){
       container = new JFrame("WASD 4-i-rad");
       JPanel panel = (JPanel)container.getContentPane();
       panel.setPreferredSize(new Dimension(460,400));
       panel.setLayout(null);
       setBounds(0,0,605,405);
       container.setLocation(300, 200);
       panel.add(this);
       setIgnoreRepaint(true);
       addMouseListener(new mouseList());
       container.pack();
       container.setResizable(false);
       container.setVisible(true);
       container.addWindowListener(new WindowAdapter() {
           @Override
               public void windowClosing(WindowEvent e) {
                       System.exit(0);
               }
       });
       requestFocus();
       createBufferStrategy(2);
       strategy = getBufferStrategy();
       for (int x = 0; x < 7; x++) {
           for (int y = 0; y < 6; y++) {
               row[x][y]=0;
           }
       }
   }
   private class mouseList extends MouseAdapter{
       @Override
       public void mousePressed(MouseEvent e) {
           if(putnito((e.getX()-7)/64, true))
               botput();
           else
               JOptionPane.showMessageDialog(container, "Du kan inte lägga här.");
       }
   }
   private void rita(){
       while(running){
           Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
           g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
           RenderingHints.VALUE_ANTIALIAS_ON);
           g.setColor(cc);
           g.fillRect(0,0,605,405);
           for (int x = 0; x < 7; x++) {
               for (int y = 0; y < 6; y++) {
                   switch(row[x][y]){
                       case 0:
                           g.setColor(Color.white);
                           break;
                       case 1:
                           g.setColor(Color.green);
                           break;
                       case 2:
                           g.setColor(Color.red);
                           break;
                   }
                   g.fillOval(15+x*64, 15+y*64, 50, 50);
               }
           }
           g.dispose();
           strategy.show();
           try {
               Thread.sleep(20);
           } catch (Exception ex) {
           }
       }
   }
   private boolean putnito(int x, boolean player){
       boolean avalible=(row[x][0]==0);
       if(avalible){
           int y=5;
           for (int i = 5; i > -1; i--) {
               if(row[x][i]==0){
                   y=i;
                   row[x][i]=(player? 1 : 2);
                   break;
               }
           }
       }
       testwin();
       return avalible;
   }
   private void botput(){
       Random rand = new Random();
       boolean temp = false;
       do{
           temp = putnito(rand.nextInt(7), false);
       }while(!temp);
   }
   private void checknowinner(){
       boolean nowin = true;
       for (int x = 0; x < 7; x++) {
           for (int y = 0; y < 6; y++) {
               if(row[x][y]==0)
                   nowin=false;
           }
       }

       if(nowin){
           JOptionPane.showMessageDialog(container, "Ingen vann denna rundan!\n
           Tryck OK för att starta nytt spel.");
           newgame();
       }
   }
   private void testwin(){
       int winner = 0;
       
       for (int x = 0; x < 4; x++) { //   -
           for (int y = 0; y < 6; y++) {
               if(row[x][y]==1 && row[x+1][y]==1 && row[x+2][y]==1 && row[x+3][y]==1)
                   winner=1;
               else if(row[x][y]==2 && row[x+1][y]==2 && row[x+2][y]==2 && row[x+3][y]==2)
                   winner=2;
           }
       }
       for (int x = 0; x < 7; x++) { //   |
           for (int y = 0; y < 3; y++) {
               if(row[x][y]==1 && row[x][y+1]==1 && row[x][y+2]==1 && row[x][y+3]==1)
                   winner=1;
               else if(row[x][y]==2 && row[x][y+1]==2 && row[x][y+2]==2 && row[x][y+3]==2)
                   winner=2;
           }
       }
       for (int x = 0; x < 4; x++) { //   \
           for (int y = 0; y < 3; y++) {
               if(row[x][y]==1 && row[x+1][y+1]==1 && row[x+2][y+2]==1 && row[x+3][y+3]==1)
                   winner=1;
               else if(row[x][y]==2 && row[x+1][y+1]==2 && row[x+2][y+2]==2 && row[x+3][y+3]==2)
                   winner=2;
           }
       }
       for (int x = 3; x < 7; x++) { //   /
           for (int y = 0; y < 3; y++) {
               if(row[x][y]==1 && row[x-1][y+1]==1 && row[x-2][y+2]==1 && row[x-3][y+3]==1)
                   winner=1;
               else if(row[x][y]==2 && row[x-1][y+1]==2 && row[x-2][y+2]==2 && row[x-3][y+3]==2)
                   winner=2;
           }
       }
       if(winner==1){
           JOptionPane.showMessageDialog(container, "Du vann denna rundan!\n
           Tryck OK för att starta ett nytt spel.");
           newgame();
       }
       else if(winner==2){
           JOptionPane.showMessageDialog(container, "WASDs professionellt kodade bot vann denna rundan!
           \nTryck OK för att starta ett nytt spel.");
           newgame();
       }
       else
           checknowinner();
   }
   private void newgame(){
       for (int x = 0; x < 7; x++) {
           for (int y = 0; y < 6; y++) {
               row[x][y]=0;
           }
       }
   }
}

Jag tycker koden ser proffsig ut http://www.fuska.se/forum/style_images/ip.boardpr/folder_post_icons/icon12.gif Metoden "putnito" var misstype av "putinto" (put into, lägg i) men jag lät den vara putnito :P Ni som blivit inspirerade av mig att lära er Java får gärna kopiera den och experimentera runt och fråga ifall det är något ni inte förstår.

Redigerat av WASD
Länk till kommentar
Dela på andra sajter

  • Svar 27
  • Skapat
  • Senaste svar

Ledande medlemmar i detta ämne

Ledande medlemmar i detta ämne

Skrivet (redigerat)

Uppdatering: Lagt in Anti-aliasing :D Ladda ner i första inlägget, samma länk. Källkoden också uppdaterad.

 

Före och Efter Anti-aliasing:

 

http://i.imgur.com/gzcIO.png

 

http://i.imgur.com/madJ8.png

Redigerat av WASD
Länk till kommentar
Dela på andra sajter

Gäst CrazyCake

Gött spel

 

är bara lite för lätt att vinna

det är jag som spelar :)

 

 

Wasd 4 i rad ...Jag spelar

Såklart så vill vi se när du spelar.

Fast kanske inte.

 

Fint WASD, men du får verkligen fixa boten, way to easy :)

 

Edit:"WASDs professionellt kodade bot vann denna runda" :D

 

Redigerat av CrazyCake
Länk till kommentar
Dela på andra sajter

Gå med i konversationen

Du kan skriva nu och registrera dig senare. Om du har ett konto, logga in nu för att posta med ditt konto.

Gäst
Svara på det här ämnet...

×   Klistrade in som rich text.   Klistra in som vanlig text istället

  Endast 75 emojis är tillåtet.

×   Din länk har automatiskt inbäddats.   Visa som en länk istället

×   Ditt tidigare innehåll har återställts.   Rensa redigeraren

×   Du kan inte klistra in bilder direkt. Ladda upp eller infoga bilder från URL.

 Dela

×
  • Skapa ny...