💬
Logga in
Fuska.se

Wasd 4-i-rad

27 svar · startad

Trådstartare #1

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.

Senast ändrad:

#2

Nice! Jag tycker spelet borde ligga i WASD.nu efter den är klar :)

Trådstartare #3
↗ till inlägget

Nice! Jag tycker spelet borde ligga i WASD.nu efter den är klar :)

Det är tänkt att WASD.nu ska bli ett textbaserat spel men jag kanske skaffar en sida där jag lägger in alla javaprogram jag gjort :)
22 Jul 2010
#4
↗ till inlägget
↗ till inlägget

Nice! Jag tycker spelet borde ligga i WASD.nu efter den är klar :)

Det är tänkt att WASD.nu ska bli ett textbaserat spel men jag kanske skaffar en sida där jag lägger in alla javaprogram jag gjort :)

 

Ok :)

Trådstartare #5

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

Senast ändrad:

#6

Gött spel

 

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

det är jag som spelar :)

 

 

Wasd 4 i rad ...Jag spelar

Senast ändrad:

#7

Bra och snyggt men du kanske kan göra så att man kan ställa in svårighetsgrad, huruvida det ska vara 2, 3, 4, 5 eller t.o.m 6 i rad etc.

#8

Som sagt är det för lätt att vinna, klicka bara på samma rad hela tiden utan att bry dig om vad motståndare gör så vinner du.

#9
↗ till inlägget

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

 

Senast ändrad:

#10

Gör det svårare.. alldeles för lätt nu :(

#11

Sätt in en hjärna på botten så funkar den bättre.

Trådstartare #12

Jag har skrivit i första inlägget att jag ska det. Antagligen fixar jag det idag.

Trådstartare #13

Botten är nu färdig :D Posta gärna eran win/lose ratio. Algoritmen som botten går efter finns i första inlägget. Källkoden är inte uppdaterad med algoritmen.

Jag misstänker att det kan finnas småbuggar, rapporterar gärna dem.

Jag är ganska skillad på 4-i-rad och brukar vinna när jag kör mot kompisar, jag vinner mest mot botten också. Det är inte den bästa botten i världen men det duger, antar att de flesta vinner och förlorar ungefär 50/50.

Senast ändrad:

#14

Oh no, botten har 900 IQ nu :)

 

Edit: Fixa också så att inte dom kommer där instant där man lägger :S

 

Asså att dom typ runda sakerna åker ner sakta

Senast ändrad:

Trådstartare #15

Förlorar du mycket? :D

#16
↗ till inlägget

Förlorar du mycket? :D

Nej, :P men man blir lite yr eftersom när man lägger någonstans så lägger botten exakt samtidigt :S

 

Dom dära små runda grejerna som man lägger borde typ åka neråt som irl ._. om du förstår vad jag menar.

#17

Just nu 15:4 V/F ratio. Kunde varit lite svårare, men bra gjort ändå!

Trådstartare #18

En perfekt programmerad bot vinner ju alltid. Jag är nöjd med min algoritm och kommer inte uppdatera detta programmet mer. Vanligaste sättet att vinna tror jag är när man får 3 i rad och kan lägga i båda "ändarna" av dessa 3 i rad, när botten bara kan blocka en ände. Min algoritm har inte skydd mot det.

23 Jul 2010
#19

10-0

 

Seriöst, botten suger fortfarande mot dom som är duktiga på Fyra i Rad.

 

Gör den svårare, och så man kan ställa in från 1-10.

Trådstartare #20

Jag kommer inte på så många sätt att göra den svårare :P

Vill du vara med i diskussionen?

Bli medlem Logga in