J2ME+NOKIA7210学习笔记(三)飞猴不飞

       

         之前那个诡异的飞猴已经不飞了,改成一个天上随机的位置往下掉各种各样的东西然后由用户操纵一张猴子脸左右跑来跑去去接这些东西。有的东西掉的快,接到的话就得的分儿多,有的掉的慢,接到就得的分儿少。还有一个黑色的炸弹脸,掉的很慢,但是碰到就会减分儿或者结束游戏。

·《诡异的飞猴》里提到的异常:java.sun.NullPointerException已经搞明白了,本质上是没有使用的数组指针的内存溢出报错。为什么会“Cannot read”第二张图片呢?明明已经把图片放进RES资源文件夹里了嘛!——是这样的,因为在工程文件夹里有个class文件夹里并没有那张图片,编译的时候程序应该自动拷贝一张进去,但是有时就不会拷,有时就会拷- _-|||,所以要么自己动手把图片拷进去,要么关了JB重新进去,就能编译了,而且不会报错。

代码:

// ok3.java

package ok3;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ok3 extends MIDlet {

  private Canvas canvas;
  private Canvas canvas2;
  private Display display;

  public void startApp() throws MIDletStateChangeException  {
    display = Display.getDisplay(this);
    canvas = new ok3Displayable();
    display.setCurrent(canvas);
  }
  public void pauseApp() {}
  public void destroyApp(boolean bool) throws MIDletStateChangeException {
  }
}

// ok3Displayable.java

package ok3;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.Random;

public class ok3Displayable extends Canvas implements Runnable{

 private Image[] monkey;
 private int x = 70;//猴子x坐标
 private int y = 80;//猴子y坐标
 private Random random = new Random();
 private int xiongX = Math.abs(random.nextInt() % 128);
 private int xiongY = 0;
 private int neiX = Math.abs(random.nextInt() % 128);
 private int neiY = 0;
 private int shoseX = Math.abs(random.nextInt() % 128);
 private int shoseY = 0;
 private int deadX = Math.abs(random.nextInt() % 128);
 private int deadY = 0;
 private int s = 0; //分数

 public ok3Displayable(){
  try {
   monkey = new Image[6];
   monkey[0] = Image.createImage("/ohyeah.png");
   monkey[1] = Image.createImage("/back.png");
   monkey[2] = Image.createImage("/xiong.png");
   monkey[3] = Image.createImage("/nei.png");
   monkey[4] = Image.createImage("/shose.png");
   monkey[5] = Image.createImage("/dead.png");
   }
  catch(IOException e) {e.printStackTrace();}

  Thread th1 = new Thread(this);//制作新线程
  th1.start();//开始线程
 }
 protected void paint(Graphics g) {
    g.setColor(225, 255, 255);  // white
    g.fillRect(0, 0, getWidth(), getHeight());
    g.drawImage(monkey[1],0,0, Graphics.LEFT | Graphics.TOP );
    g.drawImage(monkey[0],x,y, Graphics.HCENTER | Graphics.VCENTER );
    g.drawImage(monkey[2],xiongX,xiongY, Graphics.HCENTER | Graphics.VCENTER );
    g.drawImage(monkey[3],neiX,neiY, Graphics.HCENTER | Graphics.VCENTER );
    g.drawImage(monkey[4],shoseX,shoseY, Graphics.HCENTER | Graphics.VCENTER );
    g.drawImage(monkey[5],deadX,deadY, Graphics.HCENTER | Graphics.VCENTER );
    g.drawString("Score:"+s,0,0,0);
   }
 public void run() {
   while (true){
   if(x < 0)x = getWidth();
   if(x > getWidth())x = 0;
   if(y > getHeight()) y = 0;

   //xiong下落
   xiongY+=3;
   if(xiongY > getHeight()) {
     xiongX = Math.abs(random.nextInt() % 128);
     xiongY = 0;
   }
   //nei下落
   neiY+=5;
   if(neiY > getHeight()) {
     neiX = Math.abs(random.nextInt() % 128);
     neiY = 0;
   }
   //shose下落
   shoseY+=7;
   if(shoseY > getHeight()) {
     shoseX = Math.abs(random.nextInt() % 128);
     shoseY = 0;
   }
   //dead下落
   deadY+=1;
   if(deadY > getHeight()) {
     deadX = Math.abs(random.nextInt() % 128);
     deadY = 0;
   }

   try { //判断与xiong的碰撞
    if(x-monkey[0].getWidth()/2 <xiongX +monkey[2].getWidth()/2 &&
       x+monkey[0].getWidth()/2 >xiongX -monkey[2].getWidth()/2){
      if(y-monkey[0].getHeight()/2 < xiongY + monkey[2].getHeight()/2 &&
         y+monkey[0].getHeight()/2 > xiongY - monkey[2].getHeight()/2){
         xiongX = Math.abs(random.nextInt() % 128);
         xiongY = 0;

         s+=5;
         Thread.sleep(300);//0.3秒待机,用于吃到东西时的停顿感
        //repaint();
        //wait();//使游戏停顿 (目前使用时总是出错)
      }
    }
   } catch (InterruptedException e1) {}

   try { //判断与nei的碰撞
    if(x-monkey[0].getWidth()/2 <neiX +monkey[3].getWidth()/2 &&
       x+monkey[0].getWidth()/2 >neiX -monkey[3].getWidth()/2){
      if(y-monkey[0].getHeight()/2 < neiY + monkey[3].getHeight()/2 &&
         y+monkey[0].getHeight()/2 > neiY - monkey[3].getHeight()/2){
         neiX = Math.abs(random.nextInt() % 128);
         neiY = 0;
         s+=15;
         Thread.sleep(100);//0.1秒待机
      }
    }
   } catch (InterruptedException e2) {}

   try { //判断与shose的碰撞
    if(x-monkey[0].getWidth()/2 <neiX +monkey[4].getWidth()/2 &&
       x+monkey[0].getWidth()/2 >neiX -monkey[4].getWidth()/2){
      if(y-monkey[0].getHeight()/2 < neiY + monkey[4].getHeight()/2 &&
         y+monkey[0].getHeight()/2 > neiY - monkey[4].getHeight()/2){
         shoseX = Math.abs(random.nextInt() % 128);
         shoseY = 0;
         s+=30;
         Thread.sleep(300);//0.3秒待机
      }
    }
   } catch (InterruptedException e3) {}

   try { //判断与dead的碰撞
    if(x-monkey[0].getWidth()/2 <neiX +monkey[5].getWidth()/2 &&
       x+monkey[0].getWidth()/2 >neiX -monkey[5].getWidth()/2){
      if(y-monkey[0].getHeight()/2 < neiY + monkey[5].getHeight()/2 &&
         y+monkey[0].getHeight()/2 > neiY - monkey[5].getHeight()/2){
         deadX = Math.abs(random.nextInt() % 128);
         deadY = 0;
         s+=-10;
         Thread.sleep(400);//0.4秒待机
      }
    }
   } catch (InterruptedException e4) {}

   repaint();

   try{
   Thread.sleep(60);//60毫秒待机,用于控制游戏速度。
   }catch(InterruptedException e){}

 }//while()
}//run()

 public void keyPressed(int key) {
   int gameaction = getGameAction(key);
   switch(gameaction){
     case Canvas.RIGHT:
      x+=3;
      break;
     case Canvas.LEFT:
      x-=3;
      break;
     default :
   }
 }
}

=============================================

·之前在这里:

         xiongX = Math.abs(random.nextInt() % 128);
         xiongY = 0;

是写的“wait()”,表示让线程暂停。但是之后会出现异常:java/lang/IllegalMoniterStateException。后来我在网上找到一篇文章这样说的:“在Runnable接口定义的线程里,有两种等待方法,一种是wait,一种是sleep,如果使用wait方法,则要注意在线程run方法里,用synchonized标志符将该线程设置为同步锁定状态,否则会出现该异常,大致意思是线程当前请求的监视器对象不能响应,因为被别的线程占用了。”——所以这里干脆改成让图片回到天上去算了。

·在这里:

       g.drawString("Score:"+s,0,0,0);

会出现DEBUG报错:cannot access java.lang.StringBuilder,在网上查了查,据说是JB2006 的 JDK1.5的问题,暂时还没有改成1.4,所以也没有验证,所以目前只好先把“+s”给去了再说了。

·另外,导进去四张图片的时候(一张背景、一张猴子脸和两张从天上掉下来的东西)都没有问题,再加两张图片(一张加分的东西和一颗地雷脸)的时候,那新加的图片竟然不对碰撞算法进行反映!!烦死了,就很牛儿逼的从猴子脸上划了过去,重起了机器和JB还是没有解决,暂时不知道怎么回事……


 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值