Java小游戏示例
包com.hbsi
导入Java . awt . *;
导入Java . awt . event . *;
导入javax . swing . *;
导入Java . util . *;
//主类
公共类GreedSnake扩展KeyAdapter{
JFrame主机;
画布paintCanvas
JLabel labelScore//记分卡
SnakeModel snakeModel = null//蛇
公共静态final int DEFAULT _ WIDTH = 500
公共静态final int DEFAULT _ HEIGHT = 300
公共静态final int node width = 10;
public static final int nodeHeight = 10;
///GreedSnake():初始化游戏界面。
公共GreedSnake(){
//设置界面元素
大型机=新JFrame(《贪吃蛇游戏》);
container CP = mainframe . getcontentpane();
LabelScore=new JLabel("分数是:",JLabel。中心);
cp.add(labelScore,BorderLayout。北);
paintCanvas =新画布();
paint canvas . setsize(DEFAULT _ WIDTH+1,DEFAULT _ HEIGHT+1);
paint canvas . addkey listener(this);
cp.add(paintCanvas,BorderLayout。中心);
JPanel panel buttom = new JPanel();
panel buttom . set layout(new BorderLayout());
JLabel labelHelp//帮助信息
LabelHelp=new JLabel("按PageUP或PageDown键改变速度",JLabel。中心);
panel button . add(label help,BorderLayout。北);
LabelHelp=new JLabel("按Enter或S重新开始游戏",JLabel。中心);
panel button . add(label help,BorderLayout。中心);
LabelHelp=new JLabel("按空格键或p键暂停游戏",JLabel。中心);
panel button . add(label help,BorderLayout。南);
CP . add(panel button,BorderLayout。南);
mainframe . addkey listener(this);
大型机. pack();
mainframe . setresizable(false);//设置窗口大小不能更改。
mainframe . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);
mainframe . set visible(true);
begin();
}
//keyPressed():按键检测
公共void按键(按键事件e){
int key code = e . get key code();
if(snakeModel.running)
开关(键码){
案例关键事件。VK_UP:
snake model . change direction(snake model。UP);
打破;
案例关键事件。VK _唐:
snake model . change direction(snake model。向下);
打破;
案例关键事件。VK _左:
snake model . change direction(snake model。左);
打破;
案例关键事件。VK右:
snake model . change direction(snake model。对);
打破;
案例关键事件。VK _添加:
案例关键事件。VK _第_页起:
snake model . speedup();//加速
打破;
案例关键事件。VK减去:
案例关键事件。VK _下一页:
snake model . speeddown();//慢下来
打破;
案例关键事件。VK _空间:
案例关键事件。VK_P:
snake model . changepousestate();//暂停或继续
打破;
默认值:
}
//重新开始
if(keyCode==KeyEvent。VK_S || keyCode==KeyEvent。VK _回车){
snakeModel.running = false
begin();
}
}
//repaint():绘制游戏界面(包括蛇和食物)
void repaint(){
graphics g = paint canvas . get graphics();
//绘制背景
g.setColor(颜色。浅_灰色);
g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT _ HEIGHT);
//画蛇
g.setColor(颜色。黑色);
linked list na = snake model . node array;
迭代器it = na . iterator();
while(it.hasNext()){
节点n =(Node)it . next();
drawNode(g,n);
}
//画出食物
g.setColor(颜色。红色);
Node n = snakeModel.food
drawNode(g,n);
update score();
}
//drawNode():绘制一个节点(蛇或食物)
私有void drawNode(图形g,节点n){
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,node height-1);
}
//updateScore():更改记分卡。
public void updateScore(){
string s = " score为:"+snake model . score;
labelScore.setText
}
//begin():游戏开始,放蛇。
void begin(){
if(snakeModel==null||!snakeModel.running){
snakeModel=new SnakeModel(this,DEFAULT_WIDTH/nodeWidth,
DEFAULT _ HEIGHT/nodeHeight);
(新线程(snakeModel))。start();
}
}
//main():主函数
公共静态void main(String[] args){
GreedSnake GS = new GreedSnake();
}
}
//Node:节点类
类节点{
int x;
int y;
Node(int x,int y){
this.x = x
this.y = y
}
}
//SnakeModel:蛇模型
SnakeModel类实现Runnable{
GreedSnake gs
布尔[][]矩阵;//接口数据保存在数组中。
linked list node array = new linked list();
节点食物;
int maxX//最大宽度
int maxY//最大长度
int direction = 2;//方向
布尔运行=假;
int timeInterval = 200//间隔时间(速度)
double speedChangeRate = 0.75//速度变化程度
布尔暂停=假;//游戏状态
int得分= 0;
int count move = 0;
//上下是偶数,左右是奇数。
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
//GreedModel():初始化接口
public SnakeModel(GreedSnake gs,int maxX,int maxY){
this.gs = gs
this.maxX = maxX
this.maxY = maxY
matrix = new boolean[maxX][];
for(int I = 0;我& ltmaxX++i){
matrix[I]= new boolean[maxY];
Arrays.fill(matrix[i],false);//在没有蛇或食物的区域设置false。
}
//初始化Snake
int initArrayLength = maxX & gt20 ?10:maxX/2;
for(int I = 0;我& ltinitArrayLength++i){
int x = maxX/2+I;
int y = maxY/2;
nodeArray.addLast(新节点(x,y));
matrix[x][y]= true;//snake处置真
}
food = create food();
matrix[food . x][food . y]= true;//食品处理真
}
//changeDirection():改变运动的方向。
public void change direction(int new direction){
如果(方向%2!=newDirection%2){//避免冲突。
direction = newDirection
}
}
//moveOn():蛇形运动函数
公共布尔moveOn(){
Node n =(Node)Node array . get first();
int x = n.x
int y = n.y
开关(方向){
案例向上:
y-;
打破;
案例向下:
y++;
打破;
案例左侧:
x-;
打破;
案例权利:
x++;
打破;
}
如果((0 & lt= x & amp& ampx & ltmaxX)和amp& amp(0 & lty & amp& ampy & ltmaxY)){
If(matrix[x][y]){//吃食物或者打身体。
if(x = = food . x & amp;& ampY==food.y){//吃货。
nodeArray.addFirst(食物);//在标头中添加一个节点。
//评分规则与移动长度和速度有关。
int score get =(10000-200 * count move)/time interval;
score+= score get & gt;0 ?score get:10;
count move = 0;
food = create food();
matrix[food . x][food . y]= true;
返回true
}
否则返回false//击中身体
}
Else{//我什么都没碰
nodeArray.addFirst(新节点(x,y));//添加头部
matrix[x][y]= true;
n =(Node)Node array . remove last();//移除尾部
matrix[n . x][n . y]= false;
count move++;
返回true
}
}
返回false//越线(撞墙)
}
/*我发了一个贪吃蛇游戏的代码。谁能帮我解释一下snake程序的运行过程和步骤*/
//run():蛇形运动线程
公共无效运行(){
跑步=真;
(跑步时){
尝试{
Thread.sleep(时间间隔);
}
捕捉(异常e){
打破;
}
如果(!暂停){
If(moveOn()){//未完成。
GS . repaint();
}
否则{//游戏结束
JOptionPane.showMessageDialog(空,“游戏结束”,
“游戏结束”,JOptionPane。信息_消息);
打破;
}
}
}
跑步=假;
}
//createFood():生成食物并放置。
私有节点createFood(){
int x = 0;
int y = 0;
做{
Random r = new Random();
x = r . nextint(maxX);
y = r . nextint(maxY);
}
while(matrix[x][y]);
返回新节点(x,y);
}
//speedUp():加快蛇的移动速度。
公共void加速(){
timeInterval * = speedChangeRate
}
//speedDown():减缓蛇的速度。
公共void减速(){
time interval/= speed change rate;
}
//changePauseState():改变游戏状态(暂停或继续)
public void changePauseState(){
暂停了=!暂停;
}
}