J2ME贪吃蛇源代码——200行左右,包含详细注释

本文介绍了一个基于Java的贪吃蛇游戏实现方法,详细展示了如何利用Java Micro Edition API进行游戏开发,包括游戏逻辑、界面绘制及用户输入处理等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//文件名:SnakeMIDlet .java

package snake;

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

public class SnakeMIDlet extends MIDlet {
    SnakeCanvas displayable = new SnakeCanvas();
    public SnakeMIDlet() {
        Display.getDisplay(this).setCurrent(displayable);
    }

    public void startApp() {}

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

 

//文件名:SnakeCanvas.java

package snake;

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

/**
 * 贪吃蛇游戏
 */
public class SnakeCanvas extends Canvas  implements Runnable{
    /**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/
    int[][] snake = new int[200][2];
    /**已经使用的节点数量*/
    int snakeNum;
    /**贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右*/
    int direction;
    /*移动方向*/
    /**向上*/
    private final int DIRECTION_UP = 0;
    /**向下*/
    private final int DIRECTION_DOWN = 1;
    /**向左*/
    private final int DIRECTION_LEFT = 2;
    /**向右*/
    private final int DIRECTION_RIGHT = 3;

    /**游戏区域宽度*/
    int width;
    /**游戏区域高度*/
    int height;

    /**蛇身单元宽度*/
    private final byte SNAKEWIDTH = 4;

    /**是否处于暂停状态,true代表暂停*/
    boolean isPaused = false;
    /**是否处于运行状态,true代表运行*/
    boolean isRun = true;

    /**时间间隔*/
    private final int SLEEP_TIME = 300;
   
    /**食物的X坐标*/
    int foodX;
    /**食物的Y坐标*/
    int foodY;
    /**食物的闪烁控制*/
    boolean b = true;
   
    /**Random对象*/
    Random random = new Random();
   
    public SnakeCanvas() {
     //初始化
        init();
        width = this.getWidth();
        height = this.getHeight();
        //启动线程
        new Thread(this).start();
    }

    /**
     * 初始化开始数据
     */
    private void init(){
        //初始化节点数量
        snakeNum = 7;
        //初始化节点数据
        for(int i = 0;i < snakeNum;i++){
                snake[i][0] = 100 - SNAKEWIDTH * i;
                snake[i][1] = 40;
        }
        //初始化移动方向
        direction = DIRECTION_RIGHT;
        //初始化食物坐标
        foodX = 100;
        foodY = 100;
    }

    protected void paint(Graphics g) {
        //清屏
        g.setColor(0xffffff);
        g.fillRect(0,0,width,height);
        g.setColor(0);

        //绘制蛇身
        for(int i = 0;i < snakeNum;i++){
            g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,SNAKEWIDTH);
        }
        //绘制食物
        if(b){
         g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH);
        }
    }

    private void move(int direction){
        //蛇身移动
        for(int i = snakeNum - 1;i > 0;i--){
            snake[i][0] = snake[i - 1][0];
            snake[i][1] = snake[i - 1][1];
        }

        //第一个单元格移动
        switch(direction){
        case DIRECTION_UP:
            snake[0][1] = snake[0][1] - SNAKEWIDTH;
            break;
        case DIRECTION_DOWN:
            snake[0][1] = snake[0][1] + SNAKEWIDTH;
            break;
        case DIRECTION_LEFT:
            snake[0][0] = snake[0][0] - SNAKEWIDTH;
            break;
        case DIRECTION_RIGHT:
            snake[0][0] = snake[0][0] + SNAKEWIDTH;
            break;
        }
    }
    /**
     * 吃掉食物,自身增长
     */
    private void eatFood(){
     //判别蛇头是否和食物重叠
     if(snake[0][0] == foodX && snake[0][1] == foodY){
      snakeNum++;
      generateFood();
     }
    }
    /**
     * 产生食物
     * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合
     */
    private void generateFood(){
     while(true){
      foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1))
                        / SNAKEWIDTH * SNAKEWIDTH;
      foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1))
                        / SNAKEWIDTH * SNAKEWIDTH;
      boolean b = true;
      for(int i = 0;i < snakeNum;i++){
       if(foodX == snake[i][0] && snake[i][1] == foodY){
        b = false;
        break;
       }
      }
      if(b){
       break;
      }
     }
    }
   
    /**
     * 判断游戏是否结束
     * 结束条件:
     *        1、蛇头超出边界
     *        2、蛇头碰到自身
     */
    private boolean isGameOver(){
     //边界判别
     if(snake[0][0] < 0 || snake[0][0] > (width - SNAKEWIDTH) ||
        snake[0][1] < 0 || snake[0][1] > (height - SNAKEWIDTH)){
      return true;
     }
     //碰到自身
     for(int i = 4;i < snakeNum;i++){
      if(snake[0][0] == snake[i][0]
         && snake[0][1] == snake[i][1]){
       return true;
      }       
     }
     
     return false;
    }

 /**
  * 事件处理
  */
    public void keyPressed(int keyCode){
        int action = this.getGameAction(keyCode);
        //改变方向
        switch(action){
        case UP:
            if(direction != DIRECTION_DOWN){
                direction = DIRECTION_UP;
            }
            break;
        case DOWN:
            if(direction != DIRECTION_UP){
                direction = DIRECTION_DOWN;
            }
            break;
        case LEFT:
            if(direction != DIRECTION_RIGHT){
                direction = DIRECTION_LEFT;
            }
            break;
        case RIGHT:
            if(direction != DIRECTION_LEFT){
                direction = DIRECTION_RIGHT;
            }
            break;
        case FIRE:
         //暂停和继续
            isPaused = !isPaused;
            break;
        }
    }

 /**
  * 线程方法
  * 使用精确延时
  */
    public void run(){
        try{
            while (isRun) {
             //开始时间
             long start = System.currentTimeMillis();
               
               
                if(!isPaused){
                    //吃食物
                    eatFood();
                    //移动
                    move(direction);
                   
                    //结束游戏
                    if(isGameOver()){
                     break;
                    }
                   
                    //控制闪烁
                    b = !b;
                }
                //重新绘制
                repaint();
               
                long end = System.currentTimeMillis();
               
                //延时
                if(end - start < SLEEP_TIME){
                 Thread.sleep(SLEEP_TIME - (end - start)); 
                }
            }
        }catch(Exception e){}
    }
}

 

广告:如果觉得文章对你有帮助,请在MVB评选中投我一票,谢谢!投票地址:


Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1372083


时间函数举例程序分析 2.程序源代码: #include "stdio.h" #include "time.h" void main() { time_t lt; /*define a longint time varible*/ lt=time(NULL);/*system time and date*/ printf(ctime(<)); /*english format output*/ printf(asctime(localtime(<)));/*tranfer to tm*/ printf(asctime(gmtime(<))); /*tranfer to Greenwich time*/ } 【程序92】 题目:时间函数举例2 1.程序分析: 2.程序源代码: /*calculate time*/ #include "time.h" #include "stdio.h" main() { time_t start,end; int i; start=time(NULL); for(i=0;i<3000;i++) { printf("\1\1\1\1\1\1\1\1\1\1\n"); } end=time(NULL); printf("\1: The different is %6.3f\n",difftime(end,start)); } 【程序93】 题目:时间函数举例3 1.程序分析: 2.程序源代码: /*calculate time*/ #include "time.h" #include "stdio.h" main() { clock_t start,end; int i; double var; start=clock(); for(i=0;ii) { printf("please input a little smaller.\n"); scanf("%d",&guess); } else { printf("please input a little bigger.\n"); scanf("%d",&guess); } } end=clock(); b=time(NULL); printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2); printf("\1: it took you %6.3f seconds\n\n",difftime(b,a)); if(var<15) printf("\1\1 You are very clever! \1\1\n\n"); else if(var<25) printf("\1\1 you are normal! \1\1\n\n"); else printf("\1\1 you are stupid! \1\1\n\n"); printf("\1\1 Congradulations \1\1\n\n"); printf("The number you guess is %d",i); } printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n"); if((c=getch())=='y') goto loop; } 【程序95】 题目:家庭财务管理小程序 1.程序分析: 2.程序源代码: /*money management system*/ #include "stdio.h" #include "dos.h" main() { FILE *fp; struct date d; float sum,chm=0.0; int len,i,j=0; int c; char ch[4]="",ch1[16]="",chtime[12]="",chshop[16],chmoney[8]; pp: clrscr(); sum=0.0; gotoxy(1,1);printf("|----------------------------------------------------|"); gotoxy(1,2);printf("| money management system(C1.0) 2000.03 |"); gotoxy(1,3);printf("|----------------------------------------------------|"); gotoxy(1,4);printf("| -- money records -- | -- today cost list -- |"); gotoxy(1,5);printf("| ------------------------ |-----------------------------|"); gotoxy(1,6);printf("| date: -------------- | |"); gotoxy(1,7);printf("| | | | |"); gotoxy(1,8);printf("| -------------- | |"); gotoxy(1,9);printf("| thgs: ------------------ | |"); gotoxy(1,10);printf("| | | | |"); gotoxy(1,11);printf("| ------------------ | |"); gotoxy(1,12);printf("| cost: ---------- | |"); gotoxy(1,13);printf("| | | | |"); gotoxy(1,14);printf("| ---------- | |"); gotoxy(1,15);printf("| | |"); gotoxy(1,16);printf("| | |"); gotoxy(1,17);printf("| | |"); gotoxy(1,18);printf("| | |"); gotoxy(1,19);printf("| | |"); gotoxy(1,20);printf("| | |"); gotoxy(1,21);printf("| | |"); gotoxy(1,22);printf("| | |"); gotoxy(1,23);printf("|--------------------------------------------------|"); i=0; getdate(&d); sprintf(chtime,"%4d.%02d.%02d",d.da_year,d.da_mon,d.da_day); for(;;) { gotoxy(3,24);printf(" Tab __browse cost list Esc __quit"); gotoxy(13,10);printf(" "); gotoxy(13,13);printf(" "); gotoxy(13,7);printf("%s",chtime); j=18; ch[0 ]=getch(); if(ch[0]==27) break; strcpy (chshop,""); strcpy(chmoney,""); if(ch[0]==9) { mm:i=0; fp=fopen("home.dat","r+"); gotoxy(3,24);printf(" "); gotoxy(6,4);printf(" list records "); gotoxy(1,5);printf("|-------------------------------------|"); gotoxy(41,4);printf(" "); gotoxy(41,5);printf(" |"); while(fscanf(fp,"%10s%14s%f\n",chtime,chshop,&chm)!=EOF) { if(i==36) { getch(); i=0; } if ((i%36)16) { gotoxy(41,4+i-17); printf(" "); gotoxy(42,4+i-17); } i++; sum=sum+chm; printf("%10s %-14s %6.1f\n",chtime,chshop,chm);} gotoxy(1,23);printf("|----------------------------------------------|"); gotoxy(1,24);printf("| |"); gotoxy(1,25);printf("|----------------------------------------------|"); gotoxy(10,24);printf("total is %8.1f$",sum); fclose(fp); gotoxy(49,24);printf("press any key to.....");getch();goto pp; } else { while(ch[0]!='\r') { if(j15) { len=len+1; j=11; } strcpy(ch1,""); j=j-2; strncat(ch1,chtime,len); strcpy(chtime,""); strncat(chtime,ch1,len-1); gotoxy(13,7);printf(" "); } gotoxy(13,7);printf("%s",chtime);ch[0]=getch(); if(ch[0]==9) goto mm; if(ch[0]==27) exit(1); } gotoxy(3,24);printf(" "); gotoxy(13,10); j=0; ch[0]=getch(); while(ch[0]!='\r') { if (j<14) { strncat(chshop,ch,1); j++; } if(ch[0]==8) { len=strlen(chshop)-1; strcpy(ch1,""); j=j-2; strncat(ch1,chshop,len); strcpy(chshop,""); strncat(chshop,ch1,len-1); gotoxy(13,10);printf(" "); } gotoxy(13,10);printf("%s",chshop);ch[0]=getch();} gotoxy(13,13); j=0; ch[0]=getch(); while(ch[0]!='\r') { if (j='a'&&str[i]<='z') str[i]=str[i]-32; fputc(str[i],fp); i++; } fclose(fp); fp=fopen("test","r"); fgets(str,strlen(str)+1,fp); printf("%s\n",str); fclose(fp); } 【程序99】 题目:有两个磁盘文件A和B,各存放一字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中。 1.程序分析: 2.程序源代码: #include "stdio.h" main() { FILE *fp; int i,j,n,ni; char c[160],t,ch; if((fp=fopen("A","r"))==NULL) { printf("file A cannot be opened\n"); exit(0); } printf("\n A contents are :\n"); for(i=0;(ch=fgetc(fp))!=EOF;i++) { c[i]=ch; putchar(c[i]); } fclose(fp); ni=i; if((fp=fopen("B","r"))==NULL) { printf("file B cannot be opened\n"); exit(0); } printf("\n B contents are :\n"); for(i=0;(ch=fgetc(fp))!=EOF;i++) { c[i]=ch; putchar(c[i]); } fclose(fp); n=i; for(i=0;i<n;i++) for(j=i+1;jc[j]) { t=c[i];c[i]=c[j];c[j]=t; } printf("\n C file is:\n"); fp=fopen("C","w"); for(i=0;i<n;i++) { putc(c[i],fp); putchar(c[i]); } fclose(fp); } 【程序100】 题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。 1.程序分析: 2.程序源代码: #include "stdio.h" struct student { char num[6]; char name[8]; int score[3]; float avr; } stu[5]; main() { int i,j,sum; FILE *fp; /*input*/ for(i=0;i<5;i++) { printf("\n please input No. %d score:\n",i); printf("stuNo:"); scanf("%s",stu[i].num); printf("name:"); scanf("%s",stu[i].name); sum=0; for(j=0;j<3;j++) { printf("score %d.",j+1); scanf("%d",&stu[i].score[j]); sum+=stu[i].score[j]; } stu[i].avr=sum/3.0; } fp=fopen("stud","w"); for(i=0;i<5;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值