?? j2me的rpg游戲核心代碼.txt
字號(hào):
/*游戲場(chǎng)景類(lèi)
包括如下場(chǎng)景:
場(chǎng)景一:城郊
場(chǎng)景二:荒島
場(chǎng)景三:女兒國(guó)
場(chǎng)景四:勇士國(guó)
場(chǎng)景五:真假蓬萊
場(chǎng)景六:軍營(yíng)*/
//邏輯處理
import javax.microedition.lcdui.*;
import java.io.*;
import java.lang.*;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;
public class MGC extends Canvas implements CommandListener
{
/*角色變量*/
static int l,m,le,ex,sp,d,gold,x,y,lm,mm,dr;//l,m為當(dāng)前的血和氣,lm,mm為當(dāng)前的血?dú)獾淖畲笾?le為人物等級(jí),ex為經(jīng)驗(yàn),sp為剩余技能點(diǎn),d為基礎(chǔ)物理攻擊力,dr為人物的方向標(biāo)志
int D;//角色的物理總攻擊力,包括基礎(chǔ)攻擊力和加成攻擊力
int[] s,tn;//s[]為技能等級(jí),tn[]為任務(wù)物品的收集數(shù)量
int addMd,addPd;//武器附加的魔法攻擊和物理攻擊
int stealB;//偷血量
int addPdP;//基礎(chǔ)攻擊力提升比例
int curnpc;//當(dāng)前對(duì)話的NPC序號(hào)
int speed=8;//行走的速度
int count;//通用變量,用于各種情況下的計(jì)數(shù)
int[] weapon;//武器
static int[] startx,starty;//初生地的坐標(biāo)
int curweapon;//當(dāng)前使用的武器
int curEl;//當(dāng)前戰(zhàn)斗中的怪物等級(jí)
boolean task,task2;//任務(wù)的觸發(fā)標(biāo)志,task為前四個(gè)任務(wù),task2為最后一個(gè)任務(wù)
boolean boat;//判斷是否已經(jīng)購(gòu)買(mǎi)過(guò)船
boolean t;//隱身標(biāo)志
boolean tran;//附身標(biāo)志
boolean walk;//是否持續(xù)移動(dòng)
boolean[] dlg;//和NPC的對(duì)話標(biāo)志
boolean win,die;//戰(zhàn)斗勝利和陣亡的標(biāo)志
String tip;//提示信息
String dlgm;
int dlgn;
static Image poc;//主角的圖片
/*游戲控制變量*/
static int x0,y0,w,h,sl,i,j;//sl為場(chǎng)景號(hào),i,j為菜單選項(xiàng)編號(hào),i為一級(jí)菜單,j為二級(jí)菜單,x0,y0為屏幕左上角相對(duì)大場(chǎng)景的坐標(biāo)
int killCount;//競(jìng)技場(chǎng)的競(jìng)技計(jì)數(shù)
static int[] W,H;//場(chǎng)景的長(zhǎng)和寬(Tile為單位)
int[] sc;//地圖索引數(shù)組
int[] spn;//精靈的數(shù)量
static int[] screenStart=new int[]{16,29,33,47,68,77,83};//場(chǎng)景圖片編號(hào)的起點(diǎn)
int sx,sy;//技能圖片的坐標(biāo)
int sn;//對(duì)話的序號(hào)(兼戰(zhàn)斗中獲得的經(jīng)驗(yàn)值)
SP[] spi;//戰(zhàn)斗場(chǎng)景中的精靈對(duì)象
SP[] NPC;//非戰(zhàn)斗場(chǎng)景中的精靈對(duì)象
int an;//攻擊順序
int nn;//當(dāng)前與主角對(duì)話的NPC序號(hào)(兼戰(zhàn)斗中獲得的金錢(qián))
boolean pm,am,tm;//屬性菜單,戰(zhàn)斗菜單和傳送菜單的彈出標(biāo)志
boolean atm;//戰(zhàn)斗場(chǎng)景
boolean me;//對(duì)話控制開(kāi)關(guān)
boolean change;//場(chǎng)景切換開(kāi)關(guān)
boolean gameMenu;//游戲菜單開(kāi)關(guān)
boolean playOn;
boolean showW;
static boolean running;
String[] dlgM;//對(duì)話的內(nèi)容
static Image screenPic;//場(chǎng)景大圖
static Image NPCPic;//精靈大圖
InputStream is;//輸入流
static Image[] p;
static Image[] screen;//場(chǎng)景圖片
static Image[] spic;//技能圖片
static Image atpic;//戰(zhàn)斗場(chǎng)景中的圖片
static Image spic0;
Image dlgpic;//對(duì)話的圖片
static Graphics g1;
Random rd;
Timer ti;
TI mo,atw,atc,changeMap,playsound;//mo控制人物移動(dòng),atw控制技能效果,atc控制攻擊順序切換,changeMap控制場(chǎng)景切換
Command choose,gmenu,con;
public MGC()
{
running=true;
w=176;
h=182;
choose=new Command("",Command.OK,0);
gmenu=new Command("菜單",Command.SCREEN,0);
choose=new Command("選擇",Command.OK,0);
con=new Command("繼續(xù)",Command.OK,0);
//addCommand(choose);
//addCommand(gmenu);
setCommandListener(this);
}
--------------------------------------------------------------------------------
回復(fù):
辛苦啦!
--------------------------------------------------------------------------------
回復(fù):
/*初始化*/
void ge()
{
addCommand(gmenu);
i=0;
le=1;
ex=0;
sp=1;
d=7;
gold=100;
lm=71;
l=71;
m=40;
mm=40;
dr=6;
addMd=0;
addPd=0;
stealB=0;
addPdP=0;
curweapon=9;
D=d+addPd+addPdP*d/100;
weapon=new int[]{9,9,9,9,9,9};
s=new int[]{0,0,0,0,0,0,0,0,0,1,0};
spn=new int[]{60,28,153,76,16,2,0};
startx=new int[]{464,144,32,192,32,128,16};
starty=new int[]{448,432,224,320,144,176,112};
dlg=new boolean[]{false,false,false,false,false,false,false};
tn=new int[]{0,0,0,0,0};
W=new int[]{32,32,32,24,24,16,16};
H=new int[]{32,32,32,24,24,16,16};
if(sl==0)
{
if(dlg[0])
{
x=startx[0];
y=starty[0];
message(2);
}
else
{
x=384;
y=304;
}
}
else
{
x=startx[sl];
y=starty[sl];
}
if(x>=w/2)
{
if(x<=W[sl]*16-w/2)
x0=x-w/2;
else
x0=W[sl]*16-w;
}
else
x0=0;
if(y>=h/2)
{
if(y<=H[sl]*16-h/2)
y0=y-h/2;
else
y0=H[sl]*16-h;
}
else
y0=0;
task=false;
task2=false;
boat=false;
showW=false;
die=false;
win=false;
walk=false;
t=false;
tran=false;
playOn=true;
pm=false;
am=false;
atm=false;
change=false;
gameMenu=false;
me=false;
tip=null;
dlgm=null;
spi=new SP[8];
ti=new Timer();
rd=new Random(1000);
changeMap=null;
is=getClass().getResourceAsStream("/Screen"+ts(sl)+".txt");
rS(is);//讀取指定的地圖索引
if(spn[sl]!=0)
{
is=getClass().getResourceAsStream("/sp"+ts(sl)+".txt");
rSp(is);//讀取精靈索引
}
if(sl==0&&!dlg[0])
message(2);
}
/*讀取精靈索引*/
void rSp(InputStream s)
{
int i,c,temp;
i=0;
c=0;
temp=0;
NPC=null;
NPC=new SP[spn[sl]];
try
{
while((c=s.read())!=-1)
{
switch(c)
{
case '*':
NPC[i++]=new SP(
temp/10000,
temp%10000/100,
temp%100);
temp=0;
break;
default:
temp=10*temp+c-48;
break;
}
}
}
catch(java.io.IOException ioe)
{
}
is=null;
}
/*讀取相應(yīng)場(chǎng)景的地圖*/
void rS(InputStream s)
{
int x,y,c,temp;
x=0;
y=0;
temp=0;
sc=null;
sc=new int[W[sl]*H[sl]];
int i = 0;
try
{
while((c=s.read())!=-1)
{
switch(c)
{
case ' ':
y++;
x=0;
temp=0;
break;
case '*':
sc[y*W[sl]+x++]=temp;
temp=0;
break;
default:
temp=10*temp+c-48;
break;
}
}
}
catch(java.io.IOException ioe)
{
}
if(sl==3)//在勇士國(guó)隨機(jī)生成兩個(gè)寶箱所在地,和寶箱周?chē)墓治?{
x=rR(96)+72;
if(sc[x]/100==1)
{
sc[x]=sc[x]%100+9800;
{
if(sc[x+1]/100==1)
sc[x+1]=sc[x+1]%100+1800;
if(sc[x-1]/100==1)
sc[x-1]=sc[x-1]%100+1900;
if(sc[x-24]/100==1)
sc[x-24]=sc[x-24]%100+1600;
if(sc[x+24]/100==1)
sc[x+24]=sc[x+24]%100+1700;
}
}
x=rR(96)+264;
if(sc[x]/100==1)
{
sc[x]=sc[x]%100+9800;
{
if(sc[x+1]/100==1)
sc[x+1]=sc[x+1]%100+1800;
if(sc[x-1]/100==1)
sc[x-1]=sc[x-1]%100+1900;
if(sc[x-24]/100==1)
sc[x-24]=sc[x-24]%100+1600;
if(sc[x+24]/100==1)
sc[x+24]=sc[x+24]%100+1700;
}
}
}
else
if(sl==6)//在競(jìng)技場(chǎng)隨機(jī)生成六到八級(jí)的怪物
{
for(int ii=0;ii<256;ii++)
{
if(sc[ii]/100==1)
sc[ii]=sc[ii]%100+(rR(100)<70 (rR(3)+16)*100:100);
}
}
is=null;
}
--------------------------------------------------------------------------------
回復(fù):
頂你啊。。。。太牛了。。
--------------------------------------------------------------------------------
回復(fù):
public void keyReleased(int keyCode)
{
int act=getGameAction(keyCode);
if(act==Canvas.UP||act==Canvas.DOWN||act==Canvas.LEFT||act==Canvas.RIGHT)
{
walk=false;
}
}
/*構(gòu)建一個(gè)從0到n-1范圍的隨機(jī)數(shù)*/
public int rR(int n)
{
int r =rd.nextInt();
if(r<0)
r=-r;
r=r%n;
return r;
}
/*移動(dòng)方式選擇,移動(dòng)可能性判斷和移動(dòng)計(jì)時(shí)器觸發(fā)*/
public void stm()
{
System.out.println("startmove");
if(c()>10&&c()<=20)//怪物出現(xiàn)的Tile
{
fi(chn(),c()-10);//調(diào)出戰(zhàn)斗場(chǎng)景
if(!atm)//沒(méi)有怪出現(xiàn)
{
dr++;
if(dr%3==0)
dr-=2;
switch(dr)
{
//case 7://向上1
//y-=speed;
//if(y0>0&&y-y0<=64)
//y0-=speed;
//repaint();
//break;
//case 4://向下1
//y+=speed;
//if(y0<128&&y-y0>=48)
//y0+=speed;
//repaint();
//break;
//case 1://向左1
//x-=speed;
//if(x0>0&&x-x0<=64)
//x0-=speed;
//repaint();
//break;
//case 10://向右1
//x+=speed;
//if(x0<24*16&&x-x0>=64)
//x0+=speed;
//repaint();
//break;
//default://靜止?fàn)顟B(tài)
//repaint();
//break;
case 7://向上1
y-=speed;
if(y0>0&&y-y0<=h/2)
y0-=speed;
repaint();
break;
case 4://向下1
y+=speed;
if(y0<(H[sl]-(h+15)/16)*16&&y-y0>=h/2)
y0+=speed;
repaint();
break;
case 1://向左1
x-=speed;
if(x0>0&&x-x0<=w/2)
x0-=speed;
repaint();
break;
case 10://向右1
x+=speed;
if(x0<(W[sl]-w/16)*16&&x-x0>=w/2)
x0+=speed;
repaint();
break;
default://靜止?fàn)顟B(tài)
repaint();
break;
}
walk=true;
mo=new TI(this,7);
ti.schedule(mo,0,300);
}
else
{
switch(dr/3)
{
case 0://向左
x-=16;
break;
case 1://向下
y+=16;
break;
case 2://向上
y-=16;
break;
case 3://向右
x+=16;
break;
}
if(x>=w/2)
{
if(x<=W[sl]*16-w/2)
x0=x-w/2;
else
x0=W[sl]*16-w;
}
else
x0=0;
if(y>=64)
{
if(y<=H[sl]*16-h/2)
y0=y-h/2;
else
y0=H[sl]*16-h;
}
else
y0=0;
}
}
else
if(c()>1&&c()<10)//對(duì)話NPC出現(xiàn)的Tile
{
if(c()==4)
{
if(tn[0]==10&&tn[1]==5&&tn[2]==10&&tn[3]==5)
message(c());
}
else
message(c());
}
else
if(c()==99)//場(chǎng)景出入口
{
if(boat)
{
tm=true;
i=0;
}
else
tip="請(qǐng)去找船工買(mǎi)船";
repaint();
}
else
if(c()==98)//寶箱
{
int ii=rR(2*sl+1)*50;
gold+=ii*(2*sl+1);
tip=ii>0 "獲得"+ts(ii*(2*sl+1))+"兩銀子":"一無(wú)所獲";
switch(dr/3)//將寶箱所在Tile設(shè)為平地
{
case 1://向下
if(y<H[sl]*16-32)
sc[((y+31)/16+1)*W[sl]+x/16]=sc[(y+31)/16*W[sl]+x/16];
break;
case 0://向左
if(x!=0)
sc[(y+31)/16*W[sl]+x/16-1]=sc[(y+31)/16*W[sl]+x/16];
break;
case 3://向右
if(x!=W[sl]*16-16)
sc[(y+31)/16*W[sl]+x/16+1]=sc[(y+31)/16*W[sl]+x/16];
break;
case 2://向上
if(y!=0)
sc[((y+31)/16-1)*W[sl]+x/16]=sc[(y+31)/16*W[sl]+x/16];
break;
}
repaint();
}
else
if(c()==97)//大Boss
{
if(tn[0]==10&&tn[1]==5&&tn[2]==10&&tn[3]==5&&tn[4]==20)
fi(1,15);
else
{
tm=true;
repaint();
}
}
else
{
walk=true;
mo=new TI(this,7);
ti.schedule(mo,0,150);
}
}
/*對(duì)話控制*/
public void message(int ii)
{
i=0;
dlgM=null;
me=true;
curnpc=ii-2;
switch(ii)
{
case 2://母親
dlgM=new String[5];
dlgM[0]="景鴻:孩兒此去不知何時(shí)才能回,母親要保重身體.";
dlgM[1]="母親:我兒一路上要多加小心";
dlgM[2]="景鴻:孩兒記住了";
dlgM[3]="母親:......(嗚咽)";
dlgM[4]="母親:大事為重,不用掛念我.";
break;
case 3://皇榜
dlgM=new String[1];
dlgM[0]="由于最近山賊橫行,朝廷懸賞緝拿,抓住山賊頭領(lǐng)將有重金獎(jiǎng)賞。";
break;
case 4://長(zhǎng)須仙人
dlgM=new String[3];
dlgM[0]="長(zhǎng)須仙人:你從很遠(yuǎn)的地方來(lái)的,是為了找徐承志與駱承志二人吧!";
dlgM[1]="景鴻:是,求仙人指點(diǎn)。";
dlgM[2]="長(zhǎng)須仙人:好,隨我來(lái)";
break;
case 5://徐承志與駱承志
dlgM=new String[8];
dlgM[0]="徐承志:現(xiàn)在有一件很重要的事需要你的幫忙。";
dlgM[1]="景鴻:將軍請(qǐng)說(shuō)!";
dlgM[2]="徐承志:馬上就到冬季,將士們需要100件去寒之物。";
dlgM[3]="景鴻:這個(gè)好辦,我來(lái)的路上經(jīng)過(guò)一個(gè)荒島,上面野獸眾多,找點(diǎn)皮毛還不容易。";
dlgM[4]="徐承志:這樣便好,那就托付與你了,這些銀兩你帶上。";
dlgM[5]="獲得銀兩10000";
dlgM[6]="徐承志:早去早回。";
dlgM[7]="徐承志:太好了,有了這些虎皮,整個(gè)冬天都不怕了,過(guò)了這個(gè)冬天就是我們討伐武后,復(fù)我河山之時(shí)!";
break;
case 6://競(jìng)技官
dlgM=new String[1];
dlgM[0]="你希望參加這個(gè)勇士的競(jìng)技嗎 需要收取350兩費(fèi)用,競(jìng)技必須是殺死所有野獸才會(huì)停止 參加 離開(kāi)";
break;
case 7://多九公
dlgM=new String[4];
dlgM[0]="最近老覺(jué)得身體不好,本想自己去收集些藥引,可是力不從心了,希望你可以幫助我,我將會(huì)給你一會(huì)報(bào)酬";
dlgM[1]=" 分配技能 任務(wù) 離開(kāi)";
dlgM[2]="重新分配技能點(diǎn)需要10000兩,交納費(fèi)用后你可以將技能點(diǎn)重新分配 馬上分配 下次再說(shuō)";
dlgM[3]="在荒島收集10棵鶴靈草,5顆狼牙,在女兒國(guó)收集10棵米云香,在蓬萊收集5個(gè)雪巖";
break;
case 8://船工
dlgM=new String[1];
dlgM[0]="在京城你找不到比我這更好的船了!船只價(jià)格是600兩,你趕緊買(mǎi)吧! 購(gòu)買(mǎi) 離開(kāi)";
break;
}
if(!dlg[ii-2])//如果沒(méi)有和某個(gè)NPC對(duì)完話,則每次對(duì)話從第一句開(kāi)始。
sn=0;
else
if(ii<5)
sn=dlgM.length-1;
else
if(ii==5)
{
if(tn[4]==20)
sn=7;
else
sn=6;
}
else
sn=0;
createDlgPic(dlgM[sn],8);
repaint();
}
--------------------------------------------------------------------------------
回復(fù):
我找的辛苦``貼的辛苦``不過(guò)的確米什么研究?jī)r(jià)值~!~ ~!~ 我剛剛把這個(gè)RPG游戲重新調(diào)試過(guò)了1邊 終于調(diào)過(guò)去了 等下再繼續(xù)貼
--------------------------------------------------------------------------------
回復(fù):
/*戰(zhàn)斗菜單繪制*/
if(am)
{
System.out.println("tmd3");
g.setFont(Loading.myfont);
g.setColor(0,255,0);
g.fillRect(29,47,140,75);
g.setColor(0,0,255);
g.drawRect(29,47,140,75);
g.drawString("火球",31,49,0);
g.drawString("落星",65,49,0);
g.drawString("風(fēng)殘",99,49,0);
g.drawString("召狼",133,49,0);
g.drawString("召熊",31,71,0);
g.drawString("召龍",65,71,0);
g.drawString("隱身",99,71,0);
g.drawString("遁走",133,71,0);
g.drawString("附身",31,93,0);
g.drawString("回血",65,93,0);
g.drawString("回氣",99,93,0);
g.drawString("攻擊",133,93,0);
if(i<11)
{
if(s[i]==0)
g.setColor(255,0,0);
else
g.setColor(0,0,255);
}
else
g.setColor(0,0,255);
g.drawRect(i%4*34+30,i/4*22+48,34,18);
}
/*屬性菜單繪制*/
if(pm)
{
g.setFont(Loading.myfont);
g.setColor(104,135,196);
g.fillRect(0,0,160,128);
g.setColor(0,0,0);
g.drawRect(0,0,40,127);
g.drawRect(40,0,119,127);
g.drawString("屬性",5,10,0);
g.drawString("技能",5,37,0);
g.drawString("任務(wù)",5,64,0);
g.drawString("裝備",5,91,0);
switch(i)
{
case 0://屬性顯示
g.drawString("血:"+ts(l)+"/"+ts(lm),41,5,0);
g.drawString("氣:"+ts(m)+"/"+ts(mm),41,25,0);
g.drawString("經(jīng)驗(yàn)值: ",41,45,0);
g.drawString(ts(ex)+"/"+ts(m(le+1)),41,65,0);
g.drawString("攻擊:"+ts(d)+"+"+ts(addPd+d*addPdP/100),41,85,0);
g.drawString("當(dāng)前等級(jí):"+ts(le),41,105,0);
break;
case 1://技能顯示
if(j<4)
{
g.drawString("火球:"+(s[0]>0 "等級(jí)"+ts(s[0]):"未修煉"),41,5,0);
g.drawString("落星:"+(s[1]>0 "等級(jí)"+ts(s[1]):"未修煉"),41,27,0);
g.drawString("風(fēng)殘:"+(s[2]>0 "等級(jí)"+ts(s[2]):"未修煉"),41,49,0);
g.drawString("召狼:"+(s[3]>0 "等級(jí)"+ts(s[3]):"未修煉"),41,71,0);
}
else
if(j<8)
{
g.drawString("召熊:"+(s[4]>0 "等級(jí)"+ts(s[4]):"未修煉"),41,5,0);
g.drawString("召龍:"+(s[5]>0 "等級(jí)"+ts(s[5]):"未修煉"),41,27,0);
g.drawString("隱身:"+(s[6]>0 "等級(jí)"+ts(s[6]):"未修煉"),41,49,0);
g.drawString("遁走:"+(s[7]>0 "等級(jí)"+ts(s[7]):"未修煉"),41,71,0);
}
else
{
g.drawString("附身:"+(s[8]>0 "等級(jí)"+ts(s[8]):"未修煉"),41,5,0);
g.drawString("治療:"+(s[9]>0 "等級(jí)"+ts(s[9]):"未修煉"),41,27,0);
g.drawString("回氣:"+(s[10]>0 "等級(jí)"+ts(s[10]):"未修煉"),41,49,0);
}
g.drawString("技能點(diǎn):"+ts(sp),41,98,0);
g.setColor(255,0,255);
g.drawRect(40,4+j%4*22,100,20);
break;
case 2://任務(wù)顯示
if(task)
{
g.drawString("收集物品",50,5,0);
g.drawString("鶴靈草:"+(tn[0]==10 "完成":ts(tn[0])),41,25,0);
g.drawString("狼牙:"+(tn[1]==5 "完成":ts(tn[1])),41,45,0);
g.drawString("米云香:"+(tn[2]==10 "完成":ts(tn[2])),41,65,0);
g.drawString("雪巖:"+(tn[3]==5 "完成":ts(tn[3])),41,85,0);
if(task2)
g.drawString("虎皮: "+(tn[4]==20 "完成":ts(tn[4])),41,105,0);
}
break;
case 3://裝備顯示
String temp=new String();
for(int ii=0;ii<6;ii++)
{
switch(weapon[ii])
{
case 0:
temp="短劍";
break;
case 1:
temp="鐵劍";
break;
case 2:
temp="守護(hù)劍";
break;
case 3:
temp="青劍";
break;
case 4:
temp="烈焰槍";
break;
case 5:
temp="紫砂劍";
break;
case 6:
temp="榔頭";
break;
case 7:
temp="戰(zhàn)斧";
break;
case 8:
temp="戰(zhàn)神劍";
break;
}
if(weapon[ii]!=9)
g.drawString(temp,41+ii%2*55,2+ii/2*21,0);
}
g.drawString("按"1"賣(mài)掉",41,108,0);
g.setColor(255,0,255);
g.drawRect(40+j%2*55,1+j/2*21,53,20);
if(curweapon!=9)//如果當(dāng)前裝備有武器就用藍(lán)色框顯示
{
for(int iii=0;iii<6;iii++)
{
if(weapon[iii]==curweapon)
{
g.setColor(0,0,255);
g.drawRect(40+iii%2*55,1+iii/2*21,53,20);
break;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -