الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تطوير لعبة الرقم السري في الجوال

مغلق
بدأه حسام الملحم في 16 فبراير 2005 · 2 رد · 830 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم،

لمن لعب الرقم السري، نريد أن نصدر إصدارا يتم فيه تطوير اللعبة لتكون أكثر تحديا.

عرضنا للشفرة ومناقشتها يساعد على التعلم. لمن لم يجرب البرنامج يمكنك ذلك هنا:

/index.ph...ndpost&p=271581

حاليا: طريق الفوز مكون من 10 مراحل، تستطيع التفكير في كل مرحلة على حدة مع توفر الوقت اللازم لذلك. إن حللتها في أقل عدد من الضغطات حصلت على 5 نقاط، أما إن زدت في الضغطات حصلت على 3، وإن زدت كثيرا لم تحصل إلا على نقطة.

مجربو اللعبة لاحظوا وجود أسلوبين في اللعبة:

1-عادي ومن غير نقاط(تستطيع اللعب على الطاولة من دون فوز أو خسارة مع إمكانية التقليب)

2-لعبة جديدة (وهي عشر مراحل دون حساب الوقت)

نريد إضافة أسلوب ثالث في اللعبة يتضمن الوقت وحفظ بيانات الفائز. الذي يتعدى الدقيقة لا يأخذ أي نقاط. وتحفظ أعلى مجموع للنقاط تم الحصول عليها.

خطة التطوير: اللعبة يجب أن تكون موقوتة. كل مرحلة يجب أن يتوفر لها دقيقة على الأكثر. فإن تخطى اللاعب هذه الدقيقة كان مجموع نقاطه صفرا في تلك المرحلة.

#2

لإنشاء أسلوب جديد للعبة، يمكنك تطوير الواجهة Game

interface Game {
	public void varify();
	public void start();
	public int score();
}

انظر كيف تستعمل هذه الواجهة في Class PasswordCanvas التي تعرض اللوحة.

اقرأ الطريقة setGameMode و setNormalMode اللذان يحددان أسلوبي اللعبة. واقرأ كيفية إنشاء أسلوب جديد باستخدام واجهة Game.

import javax.microedition.lcdui.*;
import java.util.*;

public class PasswordCanvas extends Canvas implements CommandListener{

	int clicks=0;

	int height;
	int width;

	int col;
	int row;
	Vector nodes;
	final int BASE=48;
	Random random;
	Font f=Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE);
	Command help;
	Command rand;
	Command startGame;
	Command exit;
	Command stop;
	Form aboutForm;

	Game game;
	PasswordCanvas(int col, int row){
  aboutForm=new AboutForm(this);
  help=new Command("Íæá ÇáÈÑäÇãÌ", Command.HELP,1);
  rand=new Command("ÞáÈ", Command.OK,1);
  startGame=new Command("áÚÈÉ ÌÏíÏÉ", Command.OK,2);
  stop=new Command("ÅíÞÇÝ", Command.STOP,1);
  exit=new Command("ÎÑæÌ", Command.EXIT,2);
  addCommand(help);
  addCommand(exit);
  random=new Random(System.currentTimeMillis());
  this.col=col;
  this.row=row;
  createNodes();
  linkNodes();
  calculateSize();
  setNormalMode();
  setCommandListener(this);
	}

	private void setNormalMode(){
  removeCommand(stop);
  addCommand(rand);
  addCommand(startGame);
  game=new Game(){
 	 public void varify(){}
 	 public void start(){
    resetNodes();
    repaint();
 	 }
 	 public int score(){return 0;}
  };
  game.start();
	}

	private void setGameMode(){
  removeCommand(rand);
  removeCommand(startGame);
  addCommand(stop);
  game=new Game(){
 	 int level=0;
 	 int score=0;
 	 int clicks=0;
 	 int minimumClicks=0;
 	 public void varify(){
    clicks++;
    Enumeration e=nodes.elements();
    Node n=null;
    boolean win=true;
    while(win & e.hasMoreElements()){
   	 n=(Node)e.nextElement();
   	 win=win&n.getState();
    }
    if(win){
   	 if(clicks==minimumClicks)displayMessage("ããÊÇÒ", 5);
   	 else if(clicks>minimumClicks+4)displayMessage("ãÞÈæá", 1);
   	 else displayMessage("ÌíÏ ÌÏÇ", 3);
   	 start();
    }
 	 }
 	 private void displayMessage(String message, int sc){
    this.score+=sc;
    Codes.display.setCurrent(new Alert("ÇáÏÑÌÉ", message+" "+sc+"   \tÇáãÌãæÚ"+score+"    \t"+"ÇáãÑÍáÉ"+level, null, AlertType.INFO));
 	 }

 	 public void start(){
    if(level==10){
   	 setNormalMode();
   	 return;
    }
    resetNodes();
    level++;
    minimumClicks=random();
    clicks=0;

 	 }
 	 public int score(){
    return score;
 	 }
  };
  game.start();
	}

	public void commandAction(Command c,Displayable d){
  if(c.equals(help))displayHelp();
  else if(c.equals(rand))random();
  else if(c.equals(startGame))setGameMode();
  else if(c.equals(stop))setNormalMode();
  else if(c.equals(exit))exit();
	}
	public void exit(){
  Codes.codes.notifyDestroyed();
	}
	public int random(){
  Vector v=new Vector();
  int ran=Math.abs(random.nextInt()%6)+2;//(int)random.nextInt(5)+2;
  int n;

  while(v.size()!=ran){
 	 n=Math.abs(random.nextInt()%9)+1;//(int)random.nextInt(9)+1;
 	 if(!v.contains(new Integer(n))){
    v.addElement(new Integer(n));

 	 }
  }

  Enumeration e=v.elements();
  int no;
  while(e.hasMoreElements()){
 	 no=((Integer)e.nextElement()).intValue();
 	 getNode(no).click();
  }
  repaint();
  return v.size();


	}
	public void resetNodes(){
  Enumeration e=nodes.elements();
  Node n=null;
  while(e.hasMoreElements()){
 	 n=(Node)e.nextElement();
 	 n.setState(true);
  }
	}
	public void displayHelp(){
  Codes.display.setCurrent(aboutForm);
	}



	private void calculateSize(){
  height=getHeight()/row;
  width=getWidth()/col;
	}
	int getRow(int i){
  int r=(i-1)%row;
  return r;
	}
	int getCol(int i){
  int c=(i-1)/col;
  return c;
	}

	Node getNode(int i){
  return (Node)nodes.elementAt(i-1);
	}
	private void linkNodes(){
  getNode(1).addNode(getNode(2)).addNode(getNode(4));
  getNode(2).addNode(getNode(1)).addNode(getNode(3)).addNode(getNode(5));
  getNode(3).addNode(getNode(2)).addNode(getNode(6));
  getNode(4).addNode(getNode(1)).addNode(getNode(5)).addNode(getNode(7));
  getNode(5).addNode(getNode(2)).addNode(getNode(4)).addNode(getNode(6)).addNode(getNode(8));
  getNode(6).addNode(getNode(3)).addNode(getNode(5)).addNode(getNode(9));
  getNode(7).addNode(getNode(4)).addNode(getNode(8));
  getNode(8).addNode(getNode(5)).addNode(getNode(7)).addNode(getNode(9));
  getNode(9).addNode(getNode(6)).addNode(getNode(8));
	}
	private  void createNodes(){
	/*	nodes=new Node[row][col];
  for(int i=0;i<row;i++)
 	 for(int o=0;0<col;o++)
    nodes[row][col]=new Node(""+((i+1)*(o+1)));
  //*/
  nodes=new Vector();
  for (int i=1;i<col*row+1;i++)
 	 nodes.addElement(new Node(i));

	}

	protected void keyPressed(int keyCode){
  int key=keyCode-BASE;
  try{
 	 getNode(key).click();
 	 clicks++;
 	 game.varify();
  }catch(ArrayIndexOutOfBoundsException e){

 	 //nothing

  }
  repaint();

	}

	public void paint(Graphics g){
  g.setFont(f);
  Enumeration e=nodes.elements();
  Node node;
  g.setColor(0,0,0);
  g.fillRect(0,0,getWidth(),getHeight());
	/*	for(int x=0;x<row;x++)
 	 g.drawLine(x*width, 0, 0,getHeight());
  for(int y=0;y<row;y++)
 	 g.drawLine(0, y*height, getWidth(),0);//*/
  while(e.hasMoreElements()){
 	 node=(Node)e.nextElement();
 	 drawNode(g,node);
  }


	}

	public void drawNode(Graphics g, Node n){
  if(!n.getState())g.setColor(255,0,0);
  else g.setColor(0,255,0);
  int x=getRow(n.number())*width+1;
  int y=getCol(n.number())*height+1;
  g.fillRect(x,y,width-1,height-1);
  g.setColor(0,0,0);
  String name=""+n.number();

  g.drawString(name, x+width/2-f.stringWidth(name),y+height/2-10,0);
	}

}

من يود المشاركة في التطوير؟

إليكم الشفرة كاملة.

src.zip

#3

هذا الموضوع كان بقسم مناقشة المشاريع ..

نقلته لهنا لكي تعم الفائدة

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

هذا الموضوع مغلق.

مواضيع مشابهة