Puissance4 1 joueur contre l'ordi

Description

C'est un jeu de puissance 4,l'interfaces est intuitive(il devrait pas yavoir de problèmes) l'ordi joue assez humainement Bref c'est un jeu dont le code peut servir a celui qui veut faire une interface graphique (certes assez simple mais quand même fonctionnelle) ou qui se demande comment faire une IA sans fonction du genre minimax et alphabeta( excusez si le code est pas très clair je le retoucherai de temps en temps pour qu'il devienne compréhensible)

Source / Exemple :

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
import java.io.*;


class panneau extends JPanel implements ActionListener
{
	JButton bouton1=new JButton();
	JButton bouton2=new JButton();
	JButton bouton3=new JButton();
	JButton bouton4=new JButton();
	JButton bouton5=new JButton();
	JButton bouton6=new JButton();
	JButton bouton7=new JButton();
	JButton bouton8=new JButton();
	JButton bouton9=new JButton();
	JButton bouton10=new JButton();
	JButton bouton11=new JButton();
	JButton nouv=new JButton("Nouv. Part");
	JButton ret=new JButton("Retour");
	JLabel la=new JLabel();
	JLabel evalA=new JLabel();
	JLabel evalB=new JLabel();
	JLabel evalC=new JLabel();
	JLabel evalD=new JLabel();
	JLabel evalE=new JLabel();
	JLabel evalF=new JLabel();
	JLabel evalG=new JLabel();
	JLabel evalH=new JLabel();
	JLabel evalI=new JLabel();
	JLabel evalJ=new JLabel();
	JLabel evalK=new JLabel();	
	JLabel eval=new JLabel();	
	
	public panneau() 
	{
		super();
		setLayout(null);
		setBackground(Color.white);
		setForeground(Color.black);
		la.setOpaque(true);
		la.setBounds(0,340,440,30);
		la.setVisible(true);
		add(la);
		evalA.setOpaque(true);
		evalA.setBounds(450,0,120,20);
		evalA.setVisible(true);
		add(evalA);
		evalB.setOpaque(true);
		evalB.setBounds(450,20,120,20);
		evalB.setVisible(true);
		add(evalB);
		evalC.setOpaque(true);
		evalC.setBounds(450,40,120,20);
		evalC.setVisible(true);
		add(evalC);
		evalD.setOpaque(true);
		evalD.setBounds(450,60,120,20);
		evalD.setVisible(true);
		add(evalD);
		evalE.setOpaque(true);
		evalE.setBounds(450,80,120,20);
		evalE.setVisible(true);
		add(evalE);
		evalF.setOpaque(true);
		evalF.setBounds(450,100,120,20);
		evalF.setVisible(true);
		add(evalF);
		evalG.setOpaque(true);
		evalG.setBounds(450,120,120,20);
		evalG.setVisible(true);
		add(evalG);
		evalH.setOpaque(true);
		evalH.setBounds(450,140,120,20);
		evalH.setVisible(true);
		add(evalH);
		evalI.setOpaque(true);
		evalI.setBounds(450,160,120,20);
		evalI.setVisible(true);
		add(evalI);
		evalJ.setOpaque(true);
		evalJ.setBounds(450,180,120,20);
		evalJ.setVisible(true);
		add(evalJ);
		evalK.setOpaque(true);
		evalK.setBounds(450,200,120,20);
		evalK.setVisible(true);
		add(evalK);
		eval.setOpaque(true);
		eval.setBounds(450,250,120,20);
		eval.setVisible(true);
		add(eval);
		bouton1.addActionListener(this);
		bouton2.addActionListener(this);
		bouton3.addActionListener(this);
		bouton4.addActionListener(this);
		bouton5.addActionListener(this);
		bouton6.addActionListener(this);
		bouton7.addActionListener(this);
		bouton8.addActionListener(this);
		bouton9.addActionListener(this);
		bouton10.addActionListener(this);
		bouton11.addActionListener(this);
		nouv.addActionListener(this);
		ret.addActionListener(this);
		bouton1.setBounds(0,300,40,40);
		bouton2.setBounds(40,300,40,40);
		bouton3.setBounds(80,300,40,40);
		bouton4.setBounds(120,300,40,40);
		bouton5.setBounds(160,300,40,40);
		bouton6.setBounds(200,300,40,40);
		bouton7.setBounds(240,300,40,40);
		bouton8.setBounds(280,300,40,40);
		bouton9.setBounds(320,300,40,40);
		bouton10.setBounds(360,300,40,40);
		bouton11.setBounds(400,300,40,40);	
		
		add(bouton1);
		add(bouton2);
		add(bouton3);
		add(bouton4);
		add(bouton5);
		add(bouton6);
		add(bouton7);
		add(bouton8);
		add(bouton9);
		add(bouton10);
		add(bouton11);
		JLabel lab=new JLabel("     A           B           C           D          E            F           G           H           I            J           K      ");
		lab.setBounds(0,270,500,40);
		lab.setVisible(true);
		add(lab);
		nouv.setBounds(450,280,130,40);
		add(nouv);
		ret.setBounds(450,330,130,40);
		add(ret);
	}
	
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		if(P4G.poss==false)
			ret.setSelected(false);
		if(P4G.poss==false)
			ret.setSelected(true);
		for(int i=0;i<12;i++)
		{
			for(int j=0;j<8;j++)
			{
				g.drawLine(0,40*j,40*11,40*j);
				g.drawLine(40*i,0,40*i,40*7);
			}
		}
		add(la);
		for(int i=0;i<11;i++)
		{
			for(int j=0;j<7;j++)
			{
				if(P4G.grille[j][i]=="x")
				{
					g.setColor(Color.red);
					g.drawLine(40*i+8,40*j+8,40*(i+1)-8,40*(j+1)-8);
					g.drawLine(40*(i+1)-8,40*j+8,40*i+8,40*(j+1)-8);
					g.setColor(Color.black);
				}
				if(P4G.grille[j][i]=="o")
				{
					g.setColor(Color.red);
					g.drawOval(40*i+5,40*j+5,32,32);
					g.setColor(Color.black);
				}
			}
		}
	}
	
	public void actionPerformed(ActionEvent e) 
	{
		
		Object source=e.getSource();
		if(P4G.poss)
		{
			if(source==bouton1)
			{la.setText("envoie 1");
			P4G.placer('a');}
			if(source==bouton2)
			{la.setText("envoie 2");P4G.placer('b');}
			if(source==bouton3)
			{la.setText("envoie 3");P4G.placer('c');}
			if(source==bouton4)
			{la.setText("envoie 4");P4G.placer('d');}
			if(source==bouton5)
			{la.setText("envoie 5");P4G.placer('e');}
			if(source==bouton6)
			{la.setText("envoie 6");P4G.placer('f');}
			if(source==bouton7)
			{la.setText("envoie 7");P4G.placer('g');}
			if(source==bouton8)
			{la.setText("envoie 8");P4G.placer('h');}
			if(source==bouton9)
			{la.setText("envoie 9");P4G.placer('i');}
			if(source==bouton10)
			{la.setText("envoie 10");P4G.placer('j');}
			if(source==bouton11)
			{la.setText("envoie 11");P4G.placer('k');}
		}
		if(source==nouv)
		{
			evalA.setText("A     :   0");
			evalB.setText("B     :  0");
			evalC.setText("C     :  0");
			evalD.setText("D     :  0");
			evalE.setText("E     :  0");
			evalF.setText("F     :  0");
			evalG.setText("G     :  0");
			evalH.setText("H     :  0");
			evalI.setText("I     :  0");
			evalJ.setText("J     :  0");
			evalK.setText("K     :  0");
			eval.setText("coup   :   ");
			P4G.av=true;
			P4G.poss=true;
			P4G.coupnb=0;
			repaint();
		}
		if(source==ret)
		{
			if((P4G.coupnb>=2)&&(P4G.poss))
			{
				P4G.retour();
			}
		}
		add(la);
		repaint();
	}
}







public class P4G
{	
	//Définition des champs de classe
	static int resultaaa=0;
	static BufferedReader coup=new BufferedReader(new InputStreamReader(System.in));
	static int li,co,num;
	static boolean test=false,av=false,poss=true,varvar=true;
	static String forme;
	static int quit=0;
	static String[][] grille=new String[7][11];
	static int[][] liste=new int[78][2];
	static int coupnb=0;
	static String[][] grilleJeu=new String[7][11];
	static String[][] listes=new String[164][4];
	static int[][] grillePoint=new int[7][11];
	static String[][] grilleTest=new String[7][11];
	static String[][] grilleTest2=new String[7][11];
	static int[] coucou=new int[11];
	static int[] coucou1=new int[11];
	static int ligneEnCours;
	static JFrame fenetre=new JFrame();
	public static panneau monpanneau=new panneau();
	static String[] coucoucou=new String[11];
	
	//initialise le champ de classe "grille" pour utilisation
	public static void init()
	{
		for(li=0;li<7;li++)
		{
			for(co=0;co<11;co++)
			{
				grille[li][co]="_";
			}
		}
	}
	
	//égalise deux grilles transmisent comme paramètres (pour IA)
	public static void egaliz(String[][] grille1,String[][] grille2)
	{
		for(li=0;li<7;li++)
		{
			for(co=0;co<11;co++)
			{
				grille1[li][co]=grille2[li][co];
			}
		}
	}
	
	public static void retour()
	{
		grille[liste[coupnb-1][0]][liste[coupnb-1][1]]="_";
		grille[liste[coupnb-2][0]][liste[coupnb-2][1]]="_";
		coupnb-=2;
		monpanneau.repaint();
	}
	
	//retourne true si puissance 4 trouvé dans la grille
	public static boolean verif()
	{
		boolean aligne=false;
		if(verDiagDroit()|verDiagGauch()|verVertic()|verHoriz())
			aligne=true;
		return(aligne);
	}
	
	
	//fonctions de recherche de puissance 4
	public static boolean verDiagDroit()
	{
		boolean align=false;
		for(li=0;li<4;li++)
		{
			for(co=0;co<8;co++)
			{
				if((grille[li][co]==grille[li+1][co+1])&&
				   (grille[li][co]==grille[li+2][co+2])&&
				   (grille[li][co]==grille[li+3][co+3])&&
				   (grille[li][co]!="_"))
					align=true;
			}
		}
		return(align);
	}
	
	
	
	public static boolean verDiagGauch()
	{
		boolean align=false;
		for(li=0;li<4;li++)
		{
			for(co=3;co<11;co++)
			{
				if((grille[li][co]==grille[li+1][co-1])&&
				   (grille[li][co]==grille[li+2][co-2])&&
				   (grille[li][co]==grille[li+3][co-3])&&
				   (grille[li][co]!="_"))
					align=true;
			}
		}
		return(align);
	}
	
	
	
	public static boolean verVertic()
	{
		boolean align=false;
		for(li=0;li<4;li++)
		{
			for(co=0;co<11;co++)
			{
				if((grille[li][co]==grille[li+1][co])&&
				   (grille[li][co]==grille[li+2][co])&&
				   (grille[li][co]==grille[li+3][co])&&
				   (grille[li][co]!="_"))
					align=true;
			}
		}
		return(align);
	}
	
	
	
	public static boolean verHoriz()
	{
		boolean align=false;
		for(li=0;li<7;li++)
		{
			for(co=0;co<8;co++)
			{
				if((grille[li][co]==grille[li][co+1])&&
				   (grille[li][co]==grille[li][co+2])&&
				   (grille[li][co]==grille[li][co+3])&&
				   (grille[li][co]!="_"))
					align=true;
			}
		}
		return(align);
	}
	
	
	
	//modifie le champs de classe "grille" (ajoute une forme)
	public static void placer(char coup1) 
	{
		
		int[] tampon=new int[2];
		int cou=(int)(coup1)-48-49;
		try
		{
			if(grille[0][cou]!="_")
			{
				tampon[0]=0;
				tampon[1]=50;
			}
			else
			{
				for(li=0;li<7;li++)
				{
					if(grille[li][cou]=="_")
					{
						tampon[0]=li;
						tampon[1]=cou;
					}
				}
			}
			int ligne=tampon[0];
			int colonne=tampon[1];
			if(grille[ligne][colonne]!="_")
				tampon[3]=2;
			grille[ligne][colonne]=forme;
			liste[coupnb][0]=ligne;
			liste[coupnb][1]=colonne;
			ligneEnCours=ligne;
			test=true;
		}
		catch(java.lang.ArrayIndexOutOfBoundsException erreur)
		{
			if(resultaaa==0)
			{
				monpanneau.la.setText("   COORDONEES ERRONNEES");
				test=false;	
				
			}
		}
		catch(StringIndexOutOfBoundsException erreur)
		{
			if(resultaaa==0)
			{
				monpanneau.la.setText("   COORDONEES ERRONNEES");
				test=false;	
				
			}
		}
		finally
		{}
	}
	
	
	
	
	
	//vérifie si partie nulle
	public static boolean plein()
	{
		int k=0;
		for(co=0;co<11;co++)
		{
			if(grille[0][co]=="_")
			k++;
		}
		if(k!=0)
			return(false);
		return(true);
	}
	
	//modifie le champs de classe "forme"
	public static void chang()
	{
		if(forme=="x")
		{
			forme="o";
			num=2;
		}
		else
		{
			forme="x";
			num=1;
		}
	}
	
	
	//fonction pour le déroulement du jeu
	public static void jeu()
	{
		
		init();
		av=false;
		forme="x";
		num=1;
		char coup1=' ';
		resultaaa=1;
		
		while((verif()==false)&&(plein()==false)&&(av==false))
		{
			
			monpanneau.repaint();
			test=false;
			if((resultaaa==1)&&(num==2))
			{
				ordi() ;
				coupnb++;
				
			}
			else
			{
				while((test==false)&&(av==false))
				{					
					monpanneau.la.setText("A vous de jouer...");
					
				}
				coupnb++;
				
			}
			chang();
		}
		while(av==false)
		{
			monpanneau.repaint();
			if(verif())
			{
				if(num==1)
				{monpanneau.la.setText("    J'AI   GAGNE!");poss=false;}
				if(num==2)
				{monpanneau.la.setText("   TU AS  GAGNE...");poss=false;}
			}
			if(plein())
			{
				monpanneau.la.setText("       PARTIE NULLE");
				poss=false;
			}
		}
		poss=true;
	}
	
	
	
	
	
	public static int analyseAlign(String[] tampon)
	{
		int ordi=0,jou=0,score=-1;
		String aforme;
		if(forme=="o")			
			{aforme="x";}
		else
			{aforme="o";}
			
			
		for(co=0;co<4;co++)
		{
			if(tampon[co]==forme)
				ordi++;
			if(tampon[co]==aforme)
				jou++;
		}
		
		if(jou==0)
		{
			if(ordi==0)
				score=2;
			if(ordi==1)
				score=20;
			if(ordi==2)
				score=200;
			if(ordi==3)
				score=2000;
			if(ordi==4)
				score=100000;
		}
		else if(ordi==0)
		{
			if(jou==0)
				score=-3;
			if(jou==1)
				score=-31;
			if(jou==2)
				score=-801;
			if(jou==3)
				score=-4001;
			if(jou==4)
				score=-100001;
		}
		return(score);
	}
	
	public static void rempliPoint1() 
	{
		for(int l=0;l<7;l++)
		{
			for(int c=0;c<11;c++)
			{
				if(grille[l][c]=="_")
				{
					if(c<5)
						grillePoint[l][c]=attribPoint(l,c)+1;
					if(c==5)
						grillePoint[l][c]=attribPoint(l,c)+5;
					if(c>5)
						grillePoint[l][c]=attribPoint(l,c)-3;
				}
				else
				{grillePoint[l][c]=0;}
			}
		}
		
		simplifieur();
		
	}
	
	public static void simplifieur()
	{
		int l=0,tampon2=0,tampon=0;
		for(co=0;co<11;co++)
		{
			while((l<7)&&(grillePoint[l][co]!=0))
			{
				if(tampon2<Math.abs(grillePoint[l][co]))
				{tampon2=Math.abs(grillePoint[l][co]); tampon=grillePoint[l][co];}
				l++;
			}
			if(l!=0)
			{
				coucou[co]=grillePoint[l-1][co]+tampon;
			}
			else
			{
				coucou[co]=0;
			}
			tampon=0;
			tampon2=0;
			l=0;
		}
	}
	
	public static int coucousom()
	{
		int som=0;
		for(int c=0;c<11;c++)
		{
			som+=coucou[c];
		}
		return(som);
	}
			
			
	
	
	public static void ordi() 
	{
		rempliPoint1();
		int tampon=-1000000,move=6,move1=-1;
		char r,rk;
		String aff;
//System.out.println("");
//for(co=0;co<11;co++)
//{System.out.print(coucou[co]+" ");} System.out.println("");

		egaliz(grilleTest,grille);
		for(int cos=0;cos<11;cos++)
		{
			egaliz(grille,grilleTest);
			r=(char)(cos+48+49);
			if(grille[0][cos]!="_")
			{
				for(int ck=0;ck<11;ck++)
				{
					coucou[ck]=1000000000;
				}
			}
			else
			{
				placer(r);
				rempliPoint1();
				chang();
				egaliz(grilleTest2,grille);
				for(int ck=0;ck<11;ck++)
				{
					egaliz(grille,grilleTest2);
					rk=(char)(ck+48+49);
					placer(rk);
					if(verif()==true)
					{
						coucou[ck]=-100000;
					}
				}
				chang();
				egaliz(grille,grilleTest2);
			}
			aff=String.valueOf(coucousom());
			if(coucousom()<-1000000)
			{aff="gagne";}
			if((coucousom()>-1000000)&&(coucousom()<=-90000))
			{aff="perd";}
			if(grilleTest[0][cos]!="_")
			{aff="imposs.";}
			coucoucou[cos]=aff;
			if(coucousom()>tampon)
			{
				tampon=coucousom();
				move=cos;
			}
			if(verif()==true)
			{
				move1=cos;
			}
		}
		if(move1!=-1)
		{
			move=move1;
			tampon=100000;
		}
		
		move+=48+49;
		egaliz(grille,grilleTest);
		monpanneau.evalA.setText("A     :  "+coucoucou[0]);
		monpanneau.evalB.setText("B     :  "+coucoucou[1]);
		monpanneau.evalC.setText("C     :  "+coucoucou[2]);
		monpanneau.evalD.setText("D     :  "+coucoucou[3]);
		monpanneau.evalE.setText("E     :  "+coucoucou[4]);
		monpanneau.evalF.setText("F     :  "+coucoucou[5]);
		monpanneau.evalG.setText("G     :  "+coucoucou[6]);
		monpanneau.evalH.setText("H     :  "+coucoucou[7]);
		monpanneau.evalI.setText("I     :  "+coucoucou[8]);
		monpanneau.evalJ.setText("J     :  "+coucoucou[9]);
		monpanneau.evalK.setText("K     :  "+coucoucou[10]);
		monpanneau.eval.setText("coup   :   "+(char)(move-32));
		placer((char)(move));
		monpanneau.la.setText("  "+(char)(move)+"      "+tampon+"\n\n") ;
		
	}
	
	public static int attribPoint(int ligne,int colonne)
	{
		int point=0;
		String[] tampon=new String[4];
		String formOrdi=forme;
		if(colonne+3<11)
		{
			for(co=0;co<4;co++)
			{
				tampon[co]=grille[ligne][co+colonne];
			}
			point+=analyseAlign(tampon);
		}
		if((colonne+2<11)&&(colonne-1>=0))
		{
			for(co=0;co<4;co++)
			{
				tampon[co]=grille[ligne][co+colonne-1];
			}
			point+=analyseAlign(tampon);
		}
		if((colonne+1<11)&&(colonne-2>=0))
		{
			for(co=0;co<4;co++)
			{
				tampon[co]=grille[ligne][co+colonne-2];
			}
			point+=analyseAlign(tampon);
		}
		if((colonne<11)&&(colonne-3>=0))
		{
			for(co=0;co<4;co++)
			{
				tampon[co]=grille[ligne][co+colonne-3];
			}
			point+=analyseAlign(tampon);
		}
		
		
		if(ligne-3>=0)
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-3][colonne];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-2>=0)&&(ligne+1<7))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-2][colonne];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-1>=0)&&(ligne+2<7))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-1][colonne];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne>=0)&&(ligne+3<7))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li][colonne];
			}
			point+=analyseAlign(tampon);
		}
		
		if((ligne-3>=0)&&(colonne+3<11))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-3][colonne+3-li];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-2>=0)&&(colonne+2<11)&&(ligne+1<7)&&(colonne-1>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-2][colonne+2-li];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-1>=0)&&(colonne+1<11)&&(ligne+2<7)&&(colonne-2>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-1][colonne+1-li];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne>=0)&&(colonne<11)&&(ligne+3<7)&&(colonne-3>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li][colonne-li];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne>=0)&&(colonne+3<11)&&(ligne+3<7)&&(colonne>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li][colonne+li];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-1>=0)&&(colonne+2<11)&&(ligne+2<7)&&(colonne-1>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-1][colonne+li-1];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-2>=0)&&(colonne+1<11)&&(ligne+1<7)&&(colonne-2>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-2][colonne+li-2];
			}
			point+=analyseAlign(tampon);
		}
		if((ligne-3>=0)&&(colonne<11)&&(ligne<7)&&(colonne-3>=0))
		{
			for(li=0;li<4;li++)
			{
				tampon[li]=grille[ligne+li-3][colonne+li-3];
			}
			point+=analyseAlign(tampon);
		}
		point+=40-8*Math.abs(6-colonne);
		return(point);
	}
	public static void main(String[] a) throws IOException
	{
		
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenetre.setSize(600,400);
		fenetre.setTitle("Puissance4 New Generation.");
		fenetre.setContentPane(monpanneau);
		fenetre.show();
		while(true)
		{jeu();}
	}
}

Conclusion :

Merci à moi car personne ne m'a aidé

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.