1、
/*
* 程序名称:贪食蛇
* 原作者:BigF
* 修改者:algo
* 说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,
* 但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之
* 下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,
* 因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。
* 我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。
*/
package mvcTest
/**
* @author WangYu
* @version 1.0
* Description:
* </pre>
* Create on :Date :2005-6-13 Time:15:57:16
* LastModified:
* History:
*/
public class GreedSnake {
public static void main(String[] args) {
SnakeModel model = new SnakeModel(20,30)
SnakeControl control = new SnakeControl(model)
SnakeView view = new SnakeView(model,control)
//添加一个观察者,让view成为model的观察者
model.addObserver(view)
(new Thread(model)).start()
}
}
-------------------------------------------------------------
2、
package mvcTest
//SnakeControl.java
import java.awt.event.KeyEvent
import java.awt.event.KeyListener
/**
* MVC中的Controler,负责接收用户的 *** 作,并把用户 *** 作通知Model
*/
public class SnakeControl implements KeyListener{
SnakeModel model
public SnakeControl(SnakeModel model){
this.model = model
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode()
if (model.running){ // 运行状态下,处理的按键
switch (keyCode) {
case KeyEvent.VK_UP:
model.changeDirection(SnakeModel.UP)
break
case KeyEvent.VK_DOWN:
model.changeDirection(SnakeModel.DOWN)
break
case KeyEvent.VK_LEFT:
model.changeDirection(SnakeModel.LEFT)
break
case KeyEvent.VK_RIGHT:
model.changeDirection(SnakeModel.RIGHT)
break
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
model.speedUp()
break
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
model.speedDown()
break
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
model.changePauseState()
break
default:
}
}
// 任何情况下处理的按键,按键导致重新启动游戏
if (keyCode == KeyEvent.VK_R ||
keyCode == KeyEvent.VK_S ||
keyCode == KeyEvent.VK_ENTER) {
model.reset()
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
-------------------------------------------------------------
3、
/*
*
*/
package mvcTest
/**
* 游戏的Model类,负责所有游戏相关数据及运行
* @author WangYu
* @version 1.0
* Description:
* </pre>
* Create on :Date :2005-6-13 Time:15:58:33
* LastModified:
* History:
*/
//SnakeModel.java
import javax.swing.*
import java.util.Arrays
import java.util.LinkedList
import java.util.Observable
import java.util.Random
/**
* 游戏的Model类,负责所有游戏相关数据及运行
*/
class SnakeModel extends Observable implements Runnable {
boolean[][] matrix// 指示位置上有没蛇体或食物
LinkedList nodeArray = new LinkedList()// 蛇体
Node food
int maxX
int maxY
int direction = 2// 蛇运行的方向
boolean running = false// 运行状态
int timeInterval = 200// 时间间隔,毫秒
double speedChangeRate = 0.75// 每次得速度变化率
boolean paused = false// 暂停标志
int score = 0// 得分
int countMove = 0// 吃到食物前移动的次数
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2
public static final int DOWN = 4
public static final int LEFT = 1
public static final int RIGHT = 3
public SnakeModel( int maxX, int maxY) {
this.maxX = maxX
this.maxY = maxY
reset()
}
public void reset(){
direction = SnakeModel.UP// 蛇运行的方向
timeInterval = 200// 时间间隔,毫秒
paused = false// 暂停标志
score = 0// 得分
countMove = 0// 吃到食物前移动的次数
// initial matirx, 全部清0
matrix = new boolean[maxX][]
for (int i = 0i <maxX++i) {
matrix[i] = new boolean[maxY]
Arrays.fill(matrix[i], false)
}
// initial the snake
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX >20 ? 10 : maxX / 2
nodeArray.clear()
for (int i = 0i <initArrayLength++i) {
int x = maxX / 2 + i//maxX被初始化为20
int y = maxY / 2//maxY被初始化为30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
//默认的运行方向向上,所以游戏一开始nodeArray就变为:
// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
nodeArray.addLast(new Node(x, y))
matrix[x][y] = true
}
// 创建食物
food = createFood()
matrix[food.x][food.y] = true
}
public void changeDirection(int newDirection) {
// 改变的方向不能与原来方向同向或反向
if (direction % 2 != newDirection % 2) {
direction = newDirection
}
}
/**
* 运行一次
* @return
*/
public boolean moveOn() {
Node n = (Node) nodeArray.getFirst()
int x = n.x
int y = n.y
// 根据方向增减坐标值
switch (direction) {
case UP:
y--
break
case DOWN:
y++
break
case LEFT:
x--
break
case RIGHT:
x++
break
}
// 如果新坐标落在有效范围内,则进行处理
if ((0 <= x &&x <maxX) &&(0 <= y &&y <maxY)) {
if (matrix[x][y]) { // 如果新坐标的点上有东西(蛇体或者食物)
if (x == food.x &&y == food.y) { // 吃到食物,成功
nodeArray.addFirst(food)// 从蛇头赠长
// 分数规则,与移动改变方向的次数和速度两个元素有关
int scoreGet = (10000 - 200 * countMove) / timeInterval
score += scoreGet >0 ? scoreGet : 10
countMove = 0
food = createFood()// 创建新的食物
matrix[food.x][food.y] = true// 设置食物所在位置
return true
} else // 吃到蛇体自身,失败
return false
} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
nodeArray.addFirst(new Node(x, y))
matrix[x][y] = true
n = (Node) nodeArray.removeLast()
matrix[n.x][n.y] = false
countMove++
return true
}
}
return false// 触到边线,失败
}
public void run() {
running = true
while (running) {
try {
Thread.sleep(timeInterval)
} catch (Exception e) {
break
}
if (!paused) {
if (moveOn()) {
setChanged()// Model通知View数据已经更新
notifyObservers()
} else {
JOptionPane.showMessageDialog(null,
"you failed",
"Game Over",
JOptionPane.INFORMATION_MESSAGE)
break
}
}
}
running = false
}
private Node createFood() {
int x = 0
int y = 0
// 随机获取一个有效区域内的与蛇体和食物不重叠的位置
do {
Random r = new Random()
x = r.nextInt(maxX)
y = r.nextInt(maxY)
} while (matrix[x][y])
return new Node(x, y)
}
public void speedUp() {
timeInterval *= speedChangeRate
}
public void speedDown() {
timeInterval /= speedChangeRate
}
public void changePauseState() {
paused = !paused
}
public String toString() {
String result = ""
for (int i = 0i <nodeArray.size()++i) {
Node n = (Node) nodeArray.get(i)
result += "[" + n.x + "," + n.y + "]"
}
return result
}
}
class Node {
int x
int y
Node(int x, int y) {
this.x = x
this.y = y
}
}
------------------------------------------------------------
4、
package mvcTest
//SnakeView.java
import javax.swing.*
import java.awt.*
import java.util.Iterator
import java.util.LinkedList
import java.util.Observable
import java.util.Observer
/**
* MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑
*/
public class SnakeView implements Observer {
SnakeControl control = null
SnakeModel model = null
JFrame mainFrame
Canvas paintCanvas
JLabel labelScore
public static final int canvasWidth = 200
public static final int canvasHeight = 300
public static final int nodeWidth = 10
public static final int nodeHeight = 10
public SnakeView(SnakeModel model, SnakeControl control) {
this.model = model
this.control = control
mainFrame = new JFrame("GreedSnake")
Container cp = mainFrame.getContentPane()
// 创建顶部的分数显示
labelScore = new JLabel("Score:")
cp.add(labelScore, BorderLayout.NORTH)
// 创建中间的游戏显示区域
paintCanvas = new Canvas()
paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1)
paintCanvas.addKeyListener(control)
cp.add(paintCanvas, BorderLayout.CENTER)
// 创建底下的帮助栏
JPanel panelButtom = new JPanel()
panelButtom.setLayout(new BorderLayout())
JLabel labelHelp
labelHelp = new JLabel("PageUp, PageDown for speed", JLabel.CENTER)
panelButtom.add(labelHelp, BorderLayout.NORTH)
labelHelp = new JLabel("ENTER or R or S for start", JLabel.CENTER)
panelButtom.add(labelHelp, BorderLayout.CENTER)
labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER)
panelButtom.add(labelHelp, BorderLayout.SOUTH)
cp.add(panelButtom, BorderLayout.SOUTH)
mainFrame.addKeyListener(control)
mainFrame.pack()
mainFrame.setResizable(false)
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
mainFrame.setVisible(true)
}
void repaint() {
Graphics g = paintCanvas.getGraphics()
//draw background
g.setColor(Color.WHITE)
g.fillRect(0, 0, canvasWidth, canvasHeight)
// draw the snake
g.setColor(Color.BLACK)
LinkedList na = model.nodeArray
Iterator it = na.iterator()
while (it.hasNext()) {
Node n = (Node) it.next()
drawNode(g, n)
}
// draw the food
g.setColor(Color.RED)
Node n = model.food
drawNode(g, n)
updateScore()
}
private void drawNode(Graphics g, Node n) {
g.fillRect(n.x * nodeWidth,
n.y * nodeHeight,
nodeWidth - 1,
nodeHeight - 1)
}
public void updateScore() {
String s = "Score: " + model.score
labelScore.setText(s)
}
public void update(Observable o, Object arg) {
repaint()
}
}
希望采纳
控制台小游戏 class YZDEL{
public static void main(String[] args)
{
java.util.Random Shiji = new java.util.Random()
java.util.Scanner Shuru = new java.util.Scanner(System.in)
java.util.Scanner Nandu = new java.util.Scanner(System.in)
int YingxHP = 20
int YingxMP = 0
int MogHP = 20
int MogMP = 0
int MogDo = 0
int fangyu = 0
System.out.println("┏━━━━╮┏━━┣┣┓ ╮ ┓┏━┳━┳┓┓━┓ ")
System.out.println("┏┣━━━┓┏━━┣┣┓ ┃┏ ┃ ┃┓┃ ╯ ")
System.out.println("┣┣━━━┫╭━━┻╯╮ ┃╰┓┃ ┃╯┏━┣━━┓")
System.out.println("┣┣━━━┫┏━━━━┓╭━━┣━┛┗━┻━┻┛┃┃")
System.out.println("┏┣━━━┓┣━━━━┫ ┃┃┃┗╮╮┃┃┣━╯")
System.out.println(" ┛┗╯┗━━━━╯┗╯╰╰━━┛┛┗━╯╰━┛")
System.out.println()
System.out.println(" 作者:天狐空幻")
System.out.println()
System.out.println("说明:勇者的 *** 作方式为以下所示:")
System.out.println(" 使用攻击需消耗1MP 伤害1HP")
System.out.println(" 使用蓄力可增加1MP 伤害0HP")
System.out.println(" 使用躲闪需消耗0MP 伤害0HP 躲避攻击")
System.out.println(" 使用重击需消耗3MP 伤害2HP 防御无效")
System.out.println(" 恶龙攻击力高, 注意防御是取胜的关键")
System.out.println(" 恶龙MP达到4时可能会放出火焰无法躲避")
System.out.println(" 准备说明完毕,那么让我们来挑战恶龙吧!")
System.out.println("==================================")
//难度选择
System.out.println("请选择难度")
System.out.println("1.娱乐 2.挑战 3.噩梦")
int ND = Nandu.nextInt()
System.out.println("==================================")
while(true)
{
//HP,MP的显示
System.out.print("勇者: ")
System.out.print(" HP ")
for(int x=YingxHPx>0x--) System.out.print("*")
System.out.print(" "+YingxHP)
System.out.println()
System.out.print(" ")
System.out.print(" MP ")
for(int x=YingxMPx>0x--) System.out.print("*")
System.out.print(" "+YingxMP)
System.out.println()
System.out.print("恶龙: ")
System.out.print(" HP ")
for(int y=MogHPy>0y--) System.out.print("*")
System.out.print(" "+MogHP)
System.out.println()
System.out.print(" ")
System.out.print(" MP ")
for(int y=MogMPy>0y--) System.out.print("*")
System.out.print(" "+MogMP)
System.out.println()
System.out.println("==================================")
//胜利判定
if(YingxHP<1) {System.out.println()System.out.println("勇者HP为0! 不..不可能..我怎么会..勇者倒下了。再接再厉吧!~")System.out.println()break}
if(MogHP<1) {System.out.println()System.out.println("恶龙HP为0! 恶龙绝望的哀鸣中倒了下去。勇者胜利了。恭喜你挑战成功!!")System.out.println()break}
//角色输入判定
System.out.println("你要做什么:")
System.out.println("1.攻击 2.蓄力")
System.out.println("3.躲闪 4.重击")
System.out.println("____________________")
int Do = Shuru.nextInt()
//敌人输入判定
//娱乐难度
if(ND==1){
for(int i=1i<3i++) MogDo = Shiji.nextInt(4)}
//挑战难度
if(ND==2){
if(YingxMP==0&&MogMP==0) {MogDo = 0}
else if(MogMP==0){for(int i=1i<3i++) MogDo = Shiji.nextInt(2)}
else if(YingxMP>2&&MogMP>2) MogDo = 2
else if(MogMP<4) {for(int i=1i<4i++) MogDo = Shiji.nextInt(3)}
else MogDo = 3}
//噩梦难度
if(ND==3){
if(Do==1) MogDo=1
if(Do==2&&MogMP>0) MogDo=2
if(Do==2&&MogMP==0) MogDo=0
if(Do==3&&MogMP<4) MogDo=0
if(Do==3&&MogMP>=4) MogDo=3}//变态判定。。
//战斗分析
//防御
if(Do==3) {fangyu=1System.out.println("你灵巧的躲避攻击!")}
if(MogDo==1) {fangyu=1System.out.println("恶龙进行防御!")}
//角色判定
if(Do==1&&YingxMP==0) {System.out.println("MP不足!")}
if(Do==1&&YingxMP>0) {
if(fangyu==0) {MogHP=MogHP-1YingxMP=YingxMP-1System.out.println("你发动攻击!")}
if(fangyu==1) {YingxMP=YingxMP-1System.out.println("你的攻击被格挡!")}}
if(Do==2) {YingxMP=YingxMP+1System.out.println("你进行蓄力!")}
if(Do==4&&YingxMP<3) {System.out.println("MP不足!")}
if(Do==4&&YingxMP>2) {MogHP=MogHP-2YingxMP=YingxMP-3System.out.println("你发动重击!")}
if(Do>4) System.out.println("你不知所措...")
//敌人判定
if(MogDo==2&&MogMP==0) {System.out.println("恶龙在发呆!")}
if(MogDo==2&&MogMP>0) {
if(fangyu==0) {YingxHP=YingxHP-2MogMP=MogMP-1System.out.println("恶龙发动攻击!")}
if(fangyu==1) {MogMP=MogMP-1System.out.println("恶龙的攻击被躲开了!")}}
if(MogDo==0) {MogMP=MogMP+1System.out.println("恶龙进行蓄力!")}
if(MogDo==3&&MogMP<4) {System.out.println("恶龙在发呆!")}
if(MogDo==3&&MogMP>3) {YingxHP=YingxHP-4MogMP=MogMP-4System.out.println("恶龙发动火焰吐吸!躲避不能!")}
//结束
fangyu = 0
MogDo = 0
System.out.println("____________________")
System.out.println()
System.out.println("==================================") }
}
}
import java.applet.Applet
import java.awt.Button
import java.awt.Color
import java.awt.Graphics
import java.awt.TextField
import java.awt.event.ActionEvent
public class Nicki extends Applet{
private static final long serialVersionUID = 1L
private Button ok
private int num=32
private int resu=0
private boolean isRig=false
private TextField iPut
public Nicki(){
this.setLayout(null)
ok=new Button("OK")
ok.setActionCommand(getName())
ok.setBounds(150, 150, 40, 20)
iPut=new TextField()
this.add(iPut)
iPut.setBounds(100, 150, 40, 20)
this.add(ok)
ok.addActionListener(new ButtonAction(this))
}
public void paint(Graphics g){
g.setColor(Color.white)
g.fillRect(0, 0, this.getWidth(), this.getHeight())
g.setColor(Color.BLACK)
g.drawString("Please guess a number ", 10, 20)
g.drawString("between 1 and 100", 10, 40)
if(isRig==false&&resu!=0){
if(resu>num){
g.drawString(""+resu+" is too big !", 10, 100)
}else if(resu<num){
g.drawString(resu+"is too small !", 10, 100)
}
}else if(isRig==true){
g.setColor(Color.GREEN)
g.drawString("Yes,"+resu+" is the right number", 10, 80)
g.drawString("Your are great! ", 10, 100)
g.setColor(Color.red)
g.drawString(resu+"!", 70, 120)
}
iPut.setText("")
g.drawString("Input the number:", 0, 150)
}
public void ButtonActionPerformed(ActionEvent e){
if(e.getActionCommand().equals("panel0")){
resu=Integer.parseInt(iPut.getText())
if(num==resu){
isRig=true
}else{
isRig=false
}
repaint()
}
}
}
class ButtonAction implements java.awt.event.ActionListener{
Nicki su
public ButtonAction(Nicki bun){
this.su=bun
}
public void actionPerformed(ActionEvent e) {
su.ButtonActionPerformed(e)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)