//定义一个接口Shape,有两判指个抽象方法:getArea()和getPerimeter()interface Shape { double getArea() double getPerimeter()
}//定义一个类Circle,实现Shape接口class Circle implements Shape { //定义一个私有属性radius,表示圆的半径
private double radius //定义一个公有构造方法,用于初始化radius
public Circle(double radius) {this.radius = radius
} //实现getArea()方法,返回圆的面积
public double getArea() {return Math.PI * radius * radius
} //实现getPerimeter()方法,返回圆的周长
public double getPerimeter() {return Math.PI * radius * 2
}
}//定义一个类Rectangle,实现Shape接口class Rectangle implements Shape { //定义两个私有属性width和height,表示矩形的宽度和高度
private double width private double height //定义一个公有构造方法,用于初始化width和height
public Rectangle(double width, double height) {this.width = width this.height = height
} //实现getArea()方法,返回矩形的面积
public double getArea() {return width * height
} //实现getPerimeter()方法,返回矩形的周长
public double getPerimeter() { return (width + height) *2
}
}//定义一个类Triangle,实现Shape接口class Triangle implements Shape { //定义三个私有属性a,b,c表示三角形的三条边长
private double a private double b private double c //定义一个公有构造方法,用于初始化a,b,c,并检查是否满足三角形条件(任意两边之和大于第三边)
public Triangle(double a, double b, double c) throws Exception{ if (a + b >c &&a + c >b &&b + c >a) {
this.a = a this.b = b
this.c = c
} else {
throw new Exception("Invalid triangle")
}
} //实现getArea()方法,返回三角形的面积(使用海伦公式)
public double getArea() { //计算半周长p
double p = (a + b + c) /2//计算并返回面积s(使用Math.sqrt()函数求平方根)
return Math.sqrt(p * (p - a) * (p - b) * (p - c))
}//实现getPerimeter()方法,返回三角形的周长
public double getPerimeter(){ return a + b + c
}
}//定义一个类Square,继承Rectangle类,并重写构造方法和toString()方法class Square extends Rectangle { //重写构造方法,在调用父类构造方法时传入相弊者同的参数side作为width和height
public Square(double side){ super(side, side)
} //重写toString()方法,在原来基础上加上"Square:"前缀,并只显示side属性而不显示width和height属性(使用String.format()函数格式化字符串)
@Override
public String toString(){ return String.format("Square: side=%.2f", super.width) /* 或者直接使用super.getPerimeter()/4作为side */
/* return String.format("Square: side=%.2f", super.getPerimeter()/4)*/
/* 注意:不能直接访问super.side属性,
import java.awt.*import javax.swing.*
@SuppressWarnings("serial")
public class MainClass extends JFrame {
ControlSnake control
Toolkit kit
Dimension dimen
public static void main(String[] args) {
new MainClass("my snake")
}
public MainClass(String s) {
super(s)
control = new ControlSnake()
control.setFocusable(true)
kit = Toolkit.getDefaultToolkit()
dimen = kit.getScreenSize()
add(control)
setLayout(new BorderLayout())
setLocation(dimen.width / 3, dimen.height / 3)// dimen.width/3,dimen.height/3
setSize(FWIDTH, FHEIGHT)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
setResizable(false)
setVisible(true)
}
public static final int FWIDTH = 315
public static final int FHEIGHT = 380
}
import java.util.*
import java.awt.*
import java.awt.event.*
import javax.swing.*
import javax.swing.Timer
import java.util.Random
@SuppressWarnings("serial")
public class ControlSnake extends JPanel implements ActionListener {
Random rand
ArrayList<Point> list, listBody
String str, str1
static boolean key
int x, y, dx, dy, fx, fy, flag
int snakeBody
int speed
public ControlSnake() {
snakeBody = 1
str = "上下左右方向键控制 P键暂停..."
str1 = "现在的长度为:" + snakeBody
key = true
flag = 1
speed = 700
rand 御磨= new Random()
list = new ArrayList<Point>()
listBody = new ArrayList<Point>()
x = 5
y = 5
list.add(new Point(x, y))
listBody.add(list.get(0))
dx = 10
dy = 0
fx = rand.nextInt(30) * 10 + 5// 2
fy = rand.nextInt(30) * 10 + 5// 2
setBackground(Color.WHITE)
setSize(new Dimension(318, 380))
final Timer time = new Timer(speed, this)
迟镇 time.start()
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 37) {
dx = -10
dy = 0
} else if (e.getKeyCode() == 38) {
dx = 0
dy = -10
} else if (e.getKeyCode() == 39) {
dx = 10
dy = 0
} else if (e.getKeyCode() == 40) {
dx = 0
dy = 镇旦斗10
} else if (e.getKeyCode() == 80) {
if (flag % 2 == 1) {
time.stop()
}
if (flag % 2 == 0) {
time.start()
}
flag++
}
}
})
}
public void paint(Graphics g) {
g.setColor(Color.WHITE)
g.fillRect(0, 0, 400, 400)
g.setColor(Color.DARK_GRAY)
g.drawLine(3, 3, 305, 3)
g.drawLine(3, 3, 3, 305)
g.drawLine(305, 3, 305, 305)
g.drawLine(3, 305, 305, 305)
g.setColor(Color.PINK)
for (int i = 0 i < listBody.size() i++) {
g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9)
}
g.fillRect(x, y, 9, 9)
g.setColor(Color.ORANGE)
g.fillRect(fx, fy, 9, 9)
g.setColor(Color.DARK_GRAY)
str1 = "现在的长度为:" + snakeBody
g.drawString(str, 10, 320)
g.drawString(str1, 10, 335)
}
public void actionPerformed(ActionEvent e) {
x += dx
y += dy
if (makeOut() == false) {
JOptionPane.showMessageDialog(null, "重新开始......")
speed = 700
snakeBody = 1
x = 5
y = 5
list.clear()
list.add(new Point(x, y))
listBody.clear()
listBody.add(list.get(0))
dx = 10
dy = 0
}
addPoint(x, y)
if (x == fx && y == fy) {
speed = (int) (speed * 0.8)//速度增加参数
if (speed < 200) {
speed = 100
}
fx = rand.nextInt(30) * 10 + 5// 2
fy = rand.nextInt(30) * 10 + 5// 2
snakeBody++// 2
} // 2
repaint()
}
public void addPoint(int xx, int yy) {
// 动态的记录最新发生的50步以内的移动过的坐标
// 并画出最新的snakeBody
if (list.size() < 100) {//蛇身长度最长为100
list.add(new Point(xx, yy))
} else {
list.remove(0)
list.add(new Point(xx, yy))
}
if (snakeBody == 1) {
listBody.remove(0)
listBody.add(0, list.get(list.size() - 1))
} else {
listBody.clear()
if (list.size() < snakeBody) {
for (int i = list.size() - 1 i > 0 i--) {
listBody.add(list.get(i))
}
} else {
for (int i = list.size() - 1 listBody.size() < snakeBody i--) {
listBody.add(list.get(i))
}
}
}
}
public boolean makeOut() {
if ((x < 3 || y < 3) || (x > 305 || y > 305)) {
return false
}
for (int i = 0 i < listBody.size() - 1 i++) {
for (int j = i + 1 j < listBody.size() j++) {
if (listBody.get(i).equals(listBody.get(j))) {
return false
}
}
}
return true
}
}
贪吃蛇游戏 望采纳import java.awt.Button
import java.awt.Color
import java.awt.GridLayout
import java.awt.Point
import java.awt.event.KeyEvent
import java.awt.event.KeyListener
import java.util.*
import javax.swing.JFrame
import javax.swing.JOptionPane
public class Snake extends JFrame implements KeyListener{
int Count=0
Button[][] grid = new Button[20][20]
ArrayList<Point>snake_list=new ArrayList<Point>()
Point bean=new Point(-1,-1)//保存随机豆子【坐标】
int Direction = 1//方向标志 1:上2:下 3:左 4:右
//构造方法
public Snake()
{
//窗体初始化
this.setBounds(400,300,390,395)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
GridLayout f=new GridLayout(20,20)
this.getContentPane().setBackground(Color.gray)
this.setLayout(f)
//初始化20*20个按钮
for(int i=0i<20i++)
for(int j=0j<20j++)
{
grid[i][j]=new Button()
this.add(grid[i][j])
grid[i][j].setVisible(false)
grid[i][j].addKeyListener(this)
grid[i][j].setBackground(Color.blue)
}
//蛇体初始化
grid[10][10].setVisible(true)
grid[11][10].setVisible(true)
grid[12][10].setVisible(true)
grid[13][10].setVisible(true)
grid[14][10].setVisible(true)
//在动态数组中保存蛇体按钮坐毁歼蔽标【行列】信息
snake_list.add(new Point(10,10))
snake_list.add(new Point(11,10))
snake_list.add(new Point(12,10))
snake_list.add(new Point(13,10))
snake_list.add(new Point(14,10))
this.rand_bean()
this.setTitle("总分:0")
this.setVisible(true)
}
//该方法随机一个豆子,且不在蛇体上,并使豆子可见
public void rand_bean(){
Random rd=new Random()
do{
bean.x=rd.nextInt(20)//纤州行
bean.y=rd.nextInt(20)//列
}while(snake_list.contains(bean))
grid[bean.x][bean.y].setVisible(true)
grid[bean.x][bean.y].setBackground(Color.red)
}
//判断拟增蛇头是否与自身有碰撞改含
public boolean is_cross(Point p){
boolean Flag=false
for(int i=0i<snake_list.size()i++){
if(p.equals(snake_list.get(i) )){
Flag=truebreak
}
}
return Flag
}
//判断蛇即将前进位置是否有豆子,有返回true,无返回false
public boolean isHaveBean(){
boolean Flag=false
int x=snake_list.get(0).x
int y=snake_list.get(0).y
Point p=null
if(Direction==1)p=new Point(x-1,y)
if(Direction==2)p=new Point(x+1,y)
if(Direction==3)p=new Point(x,y-1)
if(Direction==4)p=new Point(x,y+1)
if(bean.equals(p))Flag=true
return Flag
}
//前进一格
public void snake_move(){
if(isHaveBean()==true){//////////////有豆子吃
Point p=new Point(bean.x,bean.y)//【很重要,保证吃掉的是豆子的复制对象】
snake_list.add(0,p)//吃豆子
grid[p.x][p.y].setBackground(Color.blue)
this.Count++
this.setTitle("总分:"+Count)
this.rand_bean() //再产生一个豆子
}else{///////////////////无豆子吃
//取原蛇头坐标
int x=snake_list.get(0).x
int y=snake_list.get(0).y
//根据蛇头坐标推算出拟新增蛇头坐标
Point p=null
if(Direction==1)p=new Point(x-1,y)//计算出向上的新坐标
if(Direction==2)p=new Point(x+1,y)//计算出向下的新坐标
if(Direction==3)p=new Point(x,y-1)//计算出向左的新坐标
if(Direction==4)p=new Point(x,y+1)//计算出向右的新坐标
//若拟新增蛇头碰壁,或缠绕则游戏结束
if(p.x<0||p.x>19|| p.y<0||p.y>19||is_cross(p)==true){
JOptionPane.showMessageDialog(null, "游戏结束!")
System.exit(0)
}
//向蛇体增加新的蛇头坐标,并使新蛇头可见
snake_list.add(0,p)
grid[p.x][p.y].setVisible(true)
//删除原蛇尾坐标,使蛇尾不可见
int x1=snake_list.get(snake_list.size()-1).x
int y1=snake_list.get(snake_list.size()-1).y
grid[x1][y1].setVisible(false)
snake_list.remove(snake_list.size()-1)
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP &&Direction!=2) Direction=1
if(e.getKeyCode()==KeyEvent.VK_DOWN &&Direction!=1) Direction=2
if(e.getKeyCode()==KeyEvent.VK_LEFT &&Direction!=4) Direction=3
if(e.getKeyCode()==KeyEvent.VK_RIGHT &&Direction!=3) Direction=4
}
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyTyped(KeyEvent e) { }
public static void main(String[] args) throws InterruptedException {
Snake win=new Snake()
while(true){
win.snake_move()
Thread.sleep(300)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)