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.