用JAVA编一个小游戏或其他程序
GreedSnake.java(也是节目入口):
导入Java . awt . borderlayout;
导入Java . awt . canvas;
导入Java . awt . color;
导入Java . awt . container;
导入Java . awt . graphics;
导入Java . awt . event . key event;
导入Java . awt . event . key listener;
导入Java . util . iterator;
导入Java . util . linked list;
导入javax . swing . jframe;
导入javax . swing . jlabel;
导入javax . swing . jpanel;
公共类GreedSnake实现KeyListener {
JFrame主机;
画布paintCanvas
JLabel labelScore//记分卡
SnakeModel snakeModel = null//蛇
public static final int canvas width = 200;
public static final int canvasHeight = 300;
公共静态final int node width = 10;
public static final int nodeHeight = 10;
// -
//greedsnake():初始化游戏界面。
// -
公共GreedSnake() {
//设置界面元素
mainFrame = new JFrame(" GreedSnake ");
container CP = mainframe . getcontentpane();
labelScore = new JLabel(" Score:");
cp.add(labelScore,BorderLayout。北);
paintCanvas =新画布();
paint canvas . setsize(canvas width+1,canvas 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或R或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_R || keyCode == KeyEvent。VK_S
|| keyCode == KeyEvent。VK _回车){
snakeModel.running = false
begin();
}
}
// -
// keyReleased():空函数
// -
public void key released(key event e){
}
// -
// keyTyped():空函数
// -
公共void键入的(KeyEvent e) {
}
// -
// repaint():绘制游戏界面(包括蛇和食物)
// -
void repaint() {
graphics g = paint canvas . get graphics();
//绘制背景
g.setColor(颜色。白色);
g.fillRect(0,0,canvasWidth,canvas 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 *节点宽度,n.y *节点高度,节点宽度- 1,
nodeHeight-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,canvasWidth / nodeWidth,
this . canvasheight/nodeHeight);
(新线程(snakeModel))。start();
}
}
// -
// main():主函数
// -
公共静态void main(String[] args) {
GreedSnake GS = new GreedSnake();
}
}
节点. java:
公共类节点{
int x;
int y;
Node(int x,int y) {
this.x = x
this.y = y
}
}
SnakeModel.java:
导入Java . util . arrays;
导入Java . util . linked list;
导入Java . util . random;
导入javax . swing . joptionpane;
公共类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//越线(撞墙)
}
// -
// run():蛇形运动线程
// -
公共无效运行(){
跑步=真;
(跑步时){
尝试{
Thread.sleep(时间间隔);
} catch(异常e) {
打破;
}
如果(!暂停){
If (moveOn())//未完成
{
GS . repaint();
} else//游戏结束
{
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() {
暂停了=!暂停;
}
}