private synchronized void Start_Newgame()
{
Pre_Start();
score = 0;
curlen = 1;
stpt = 1;
slpt = 0;
voks = -1;
xp[0] = -1;
yp[0] = 0;
curx = 10;//蛇的出发时的坐标
cury = 10;
key_anter=3;//出发时初始向右
last_key_anter=2;
new_request = false;
pause = false;
alive = true;
starttid = System.currentTimeMillis();//starttid记录下新游戏的开始时间
slutttid = starttid;
sistmat = starttid;
Draw_Sorearea(dg, true);//初始化时参数为true,强制写状态区
} private void Pre_Start()//每次开始新游戏主界面的初始化及字体的设定
{
bgfx.setFont(skrift);
dg.setFont(skrift);
bgfx.setColor(dif_Color[7]);//边框的颜色
bgfx.fillRect(0, 0, playw, playh);
bgfx.setColor(dif_Color[0]);//游戏区(除去边框)的颜色
bgfx.fillRect(border, border, bricksw * pixsz, bricksh * pixsz);
bgfx.setColor(dif_Color[9]);
dg.drawImage(imb, 0, 0, this);
for(int i = 0; i < bricksh; i++)
{
for(int j = 0; j < bricksw; j++)
valueOfPlayField[j][i] = false;//初始化游戏区,让每个格子都为false.
}
Place_food();//初始放置食物
}
private void Place_food()//放置食物,也在线程中被调用
{
do
{
foodx = (int)(Math.random() * (double)bricksw);//随机放置食物
foody = (int)(Math.random() * (double)bricksh);
} while(valueOfPlayField[foodx][foody] || foodx == curx && foody == cury);//看是否在蛇上
Paint_snakeOrfood(dg, foodx, foody, false, dif_Color[5], true);//把食物画到面板上
} public void stop()
{
snake_Thread = null;
} public void Updating(Graphics g, boolean flag)//在线程中不断执行的函数,由update()函数调用
{
if(!flag)
Draw_Sorearea(g, true);
if(!flag)
g.drawImage(imb, 0, 0, this);//add!!!!!!!!!!!!!!!!!!!!!!!!!
if(alive)
{
switch(key_anter)
{
case 0: // 向上,纵坐标(格数)-1
cury--;
break; case 1: // 向下,纵坐标(格数)+1
cury++;
break; case 2: // '向左,横坐标(格数)-1
curx--;
break; case 3: // 向右,横坐标(格数)+1
curx++;
break;
}
xp[stpt] = curx;//stpt初始为1,把蛇的初始位置记下
yp[stpt] = cury;
stpt++;
stpt %= makslengde;
slutttid = System.currentTimeMillis();
if(curx == foodx && cury == foody)//当蛇头碰到食物时
{
int k1 = 0
k1 += 2000;
int i2 = (8000 * curlen) / k1;//计分函数
score += i2;//加分
Place_food();//重新放置食物
voks += 1;//蛇的长度每次加1
}
if(curx >= bricksw || cury >= bricksh || curx < 0 || cury < 0 || If_Onsnake(curx,cury))//当出界或碰到自己的身体时死亡
alive = false;
int i3 = 5 + (alive ? 1 : -2);//如果死亡则换颜色dif_Color[i3],否则为蛇的颜色
if(voks < 0)//voks初始为-1,当voks小于0时才执行下段代码, {
int i1 = xp[slpt];
int j1 = yp[slpt++];
slpt %= makslengde;//让它以2500为单位,蛇的最大值
if(i1 >= 0)
{
//(i1,j1)分别为蛇尾及蛇尾上一个格的坐标
Paint_snakeOrfood(g, i1, j1, false, dif_Color[0], false);//蛇经过后把颜色画为原来的背景色
}
} else
{
score += curlen + voks;//score中要衡量蛇的长度
voks--;
curlen++;
}
Paint_snakeOrfood(g, curx, cury, true, dif_Color[i3],true);//画蛇身体
if(!alive)
checkhighscore();//查最高分,以后添加!!!!!!!!!!!!
}
} private void Paint_snakeOrfood(Graphics g, int i1, int j1, boolean flag, Color color, boolean isSnake)
{
int i2 = i1 * pixsz + border;//从格子位置转化为绝对坐标
int j2 = j1 * pixsz + border;
int i3 = i2+2;
int j3 = j2+2;
bgfx.setColor(color);//off-screen画笔画食物用到的
g.setColor(color);//系统画笔的颜色
bgfx.fillRect(i2, j2, pixsz, pixsz);//画食物时的画笔
g.fillRect(i2, j2, pixsz, pixsz);
if(isSnake)
{
bgfx.setColor(dif_Color[9]);
g.setColor(dif_Color[9]);
bgfx.fillRect(i3, j3, pixsz-4, pixsz-4);
g.fillRect(i3, j3, pixsz-4, pixsz-4);
}
if(i1 < bricksw && j1 < bricksh && i1 >= 0 && j1 >= 0)
valueOfPlayField[i1][j1] = flag;//重新设置布尔值,若为蛇身体,则为true,否则为true
}
{
Pre_Start();
score = 0;
curlen = 1;
stpt = 1;
slpt = 0;
voks = -1;
xp[0] = -1;
yp[0] = 0;
curx = 10;//蛇的出发时的坐标
cury = 10;
key_anter=3;//出发时初始向右
last_key_anter=2;
new_request = false;
pause = false;
alive = true;
starttid = System.currentTimeMillis();//starttid记录下新游戏的开始时间
slutttid = starttid;
sistmat = starttid;
Draw_Sorearea(dg, true);//初始化时参数为true,强制写状态区
} private void Pre_Start()//每次开始新游戏主界面的初始化及字体的设定
{
bgfx.setFont(skrift);
dg.setFont(skrift);
bgfx.setColor(dif_Color[7]);//边框的颜色
bgfx.fillRect(0, 0, playw, playh);
bgfx.setColor(dif_Color[0]);//游戏区(除去边框)的颜色
bgfx.fillRect(border, border, bricksw * pixsz, bricksh * pixsz);
bgfx.setColor(dif_Color[9]);
dg.drawImage(imb, 0, 0, this);
for(int i = 0; i < bricksh; i++)
{
for(int j = 0; j < bricksw; j++)
valueOfPlayField[j][i] = false;//初始化游戏区,让每个格子都为false.
}
Place_food();//初始放置食物
}
private void Place_food()//放置食物,也在线程中被调用
{
do
{
foodx = (int)(Math.random() * (double)bricksw);//随机放置食物
foody = (int)(Math.random() * (double)bricksh);
} while(valueOfPlayField[foodx][foody] || foodx == curx && foody == cury);//看是否在蛇上
Paint_snakeOrfood(dg, foodx, foody, false, dif_Color[5], true);//把食物画到面板上
} public void stop()
{
snake_Thread = null;
} public void Updating(Graphics g, boolean flag)//在线程中不断执行的函数,由update()函数调用
{
if(!flag)
Draw_Sorearea(g, true);
if(!flag)
g.drawImage(imb, 0, 0, this);//add!!!!!!!!!!!!!!!!!!!!!!!!!
if(alive)
{
switch(key_anter)
{
case 0: // 向上,纵坐标(格数)-1
cury--;
break; case 1: // 向下,纵坐标(格数)+1
cury++;
break; case 2: // '向左,横坐标(格数)-1
curx--;
break; case 3: // 向右,横坐标(格数)+1
curx++;
break;
}
xp[stpt] = curx;//stpt初始为1,把蛇的初始位置记下
yp[stpt] = cury;
stpt++;
stpt %= makslengde;
slutttid = System.currentTimeMillis();
if(curx == foodx && cury == foody)//当蛇头碰到食物时
{
int k1 = 0
k1 += 2000;
int i2 = (8000 * curlen) / k1;//计分函数
score += i2;//加分
Place_food();//重新放置食物
voks += 1;//蛇的长度每次加1
}
if(curx >= bricksw || cury >= bricksh || curx < 0 || cury < 0 || If_Onsnake(curx,cury))//当出界或碰到自己的身体时死亡
alive = false;
int i3 = 5 + (alive ? 1 : -2);//如果死亡则换颜色dif_Color[i3],否则为蛇的颜色
if(voks < 0)//voks初始为-1,当voks小于0时才执行下段代码, {
int i1 = xp[slpt];
int j1 = yp[slpt++];
slpt %= makslengde;//让它以2500为单位,蛇的最大值
if(i1 >= 0)
{
//(i1,j1)分别为蛇尾及蛇尾上一个格的坐标
Paint_snakeOrfood(g, i1, j1, false, dif_Color[0], false);//蛇经过后把颜色画为原来的背景色
}
} else
{
score += curlen + voks;//score中要衡量蛇的长度
voks--;
curlen++;
}
Paint_snakeOrfood(g, curx, cury, true, dif_Color[i3],true);//画蛇身体
if(!alive)
checkhighscore();//查最高分,以后添加!!!!!!!!!!!!
}
} private void Paint_snakeOrfood(Graphics g, int i1, int j1, boolean flag, Color color, boolean isSnake)
{
int i2 = i1 * pixsz + border;//从格子位置转化为绝对坐标
int j2 = j1 * pixsz + border;
int i3 = i2+2;
int j3 = j2+2;
bgfx.setColor(color);//off-screen画笔画食物用到的
g.setColor(color);//系统画笔的颜色
bgfx.fillRect(i2, j2, pixsz, pixsz);//画食物时的画笔
g.fillRect(i2, j2, pixsz, pixsz);
if(isSnake)
{
bgfx.setColor(dif_Color[9]);
g.setColor(dif_Color[9]);
bgfx.fillRect(i3, j3, pixsz-4, pixsz-4);
g.fillRect(i3, j3, pixsz-4, pixsz-4);
}
if(i1 < bricksw && j1 < bricksh && i1 >= 0 && j1 >= 0)
valueOfPlayField[i1][j1] = flag;//重新设置布尔值,若为蛇身体,则为true,否则为true
}
解决方案 »
- 一个关于位移的小问题
- 一个有趣的程序问题,我没搞清楚,欢迎大家猜一下执行结果,一定要先猜再去测试
- 求助~!关于反编译的问题!
- jmf中的medialocator
- Struts 的web.xml配置问题
- new () 和instance()有什么区别?
- 再次发布-----上海某外企诚聘日语软件研发工程师(月薪7000RMB+)
- 请教如何试用Method.invoke()传入整形的参数
- SQL-Server2000的JDBC问题
- 初学JAVA 在JDK1.3.1下出现:Exception in thread "main" java.lang.NoClassDefFoundError: test/java 怎么解决!
- 关于xml文件解析的问题
- java3d编程遇到的问题
{
g.drawImage(imb, 0, 0, this);//Test!!!!不加会有bug,?????
Updating(g,true);//不断更新整个游戏区。
}
public void paint(Graphics g)//初始时,只画出状态区及Off_screen画板,以后每次屏幕有变化时,重绘off_screen
{
Updating(g,false);
//g.drawImage(imb, 0, 0, this);//test!!!!!!
}
public void run()
{
while(snake_Thread != null)
{
int i = 100 + (int)(sistflytt - System.currentTimeMillis());
if(i < 20 || i > 100)
i = 20;
try
{
Thread.sleep(100);
}
catch(InterruptedException interruptedexception) { }
sistflytt = System.currentTimeMillis();
if(new_request)//不断测试用户是否按下重新游戏
Start_Newgame();
if(!pause) //如果未停止,做repaint();,若停止,则停止重绘但线程继续运行
repaint();
Draw_Sorearea(dg, false);//写状态及分数,参数为false,有变化是才写
}
snake_Thread = null;
}
private void Write_Toscroearea(String string, int i)//写函数,负责向状态区中写相应的信息
{
int j = dg.getFontMetrics().stringWidth(string);
dg.drawString(string, i - j, playh +15);
bgfx.drawString(string, i - j, playh + 15);
} private boolean If_Onsnake(int i, int j)//返回此点的布尔值
{
return valueOfPlayField[i][j];
} private void checkhighscore()//检查分数最大值
{//以后做!!
} private void Draw_Sorearea(Graphics g, boolean flag1)/**此函数在线程中被调用
*写分,及其状态,长度,时间
*初始化时flag1为true,强制写
*当flage1为false时,则有变化才写
*/
{
if(flag1)//如果参数为真,则强制写
{
dg.setColor(dif_Color[8]);
bgfx.setColor(dif_Color[8]);
dg.fillRect(0, pixsz * bricksh + border2, width, 25);
bgfx.fillRect(0, playh, playw, 16);
dg.setColor(dif_Color[5]);
bgfx.setColor(dif_Color[5]);
Write_Toscroearea("状态:", 50);
Write_Toscroearea("时间:", 150);
Write_Toscroearea("长度:", 250);
Write_Toscroearea("分数:", 350);
dg.setColor(dif_Color[9]);
bgfx.setColor(dif_Color[9]);
Write_Toscroearea("最好成绩: 213234", 540);
}
String string = alive ? "活" : "死";
if(pause)
string = "暂停";
g.setColor(dif_Color[8]);
bgfx.setColor(dif_Color[8]);
boolean flag4 = !string.equals(SistStatus);
if(flag4)
{
Write_Toscroearea(SistStatus, 90);
SistStatus = string;
}
int i = (int)((slutttid - starttid) / 1000L);
string = i + "";
boolean flag2 = !string.equals(SistTid);
if(flag2)
{
Write_Toscroearea(SistTid, 180);
SistTid = string;
}
string = curlen + "";
boolean flag5 = !string.equals(SistLengde);
if(flag5)
{
Write_Toscroearea(SistLengde, 280);
SistLengde = string;
}
string = score + "";
boolean flag3 = !string.equals(SistScore);/**
*这种写法是为了:有变化就修改,没有变化,就不改
*/
if(flag3)
{
Write_Toscroearea(SistScore, 400);
SistScore = string;
}
dg.setColor(dif_Color[4]);
bgfx.setColor(dif_Color[4]);
if(flag4 || flag1)
Write_Toscroearea(SistStatus, 90);
if(flag2 || flag1)
Write_Toscroearea(SistTid, 180);
if(flag5 || flag1)
Write_Toscroearea(SistLengde, 280);
if(flag3 || flag1)
Write_Toscroearea(SistScore, 400);
}
public void keyPressed(KeyEvent evt){
if(key_anter!=last_key_anter)
last_key_anter=key_anter;
int keyCode=evt.getKeyCode();
if(keyCode==KeyEvent.VK_LEFT)
key_anter=2; //向左
if(keyCode==KeyEvent.VK_RIGHT)
key_anter=3; //向右
if(keyCode==KeyEvent.VK_UP)
key_anter=0; //向上
if(keyCode==KeyEvent.VK_DOWN)
key_anter=1; //向下
if(keyCode==KeyEvent.VK_SPACE && evt.isShiftDown())
new_request=true; //当按下空格后按扭后,重设此值,重新游戏。
if(keyCode==KeyEvent.VK_S)
{ pause=!pause;
if(pause)
{
pausetime = System.currentTimeMillis();
} else
{
pausetime -= System.currentTimeMillis();
starttid -= pausetime;
sistmat -= pausetime;
}
}
/*
* 用以判断蛇的方向,当蛇向左时则不能突然点击向右,其他类似
*/
if(key_anter==0 && last_key_anter==1)
key_anter=last_key_anter;
else if(key_anter==1 && last_key_anter==0)
key_anter=last_key_anter;
else if(key_anter==2 && last_key_anter==3)
key_anter=last_key_anter;
else if(key_anter==3 && last_key_anter==2)
key_anter=last_key_anter;
}
public void keyReleased(KeyEvent evt){
}
public void keyTyped(KeyEvent evt){
}
}