Java游戏开发案例-方块游戏
2008-02-23 09:11:29来源:互联网 阅读 ()
“方块”游戏使用一个3x3的网格,其中每一个单元格要么显示一种颜色,要么什么都没有(表示为黑色)。游戏开始时一些单元格随机填充颜色,其他的都用默认黑色。只要你在30秒内清除所有单元格的颜色(全部变为黑色,没有其他颜色存在),你就获胜了。
你要么移动鼠标点击一个单元格,要么直接按小键盘的相应数字键,都可以清除那个单元格里的颜色。类似的,如果你所点击的单元格本身是黑色,那么那个单元格就会被填充一种其他颜色。也就是说会有这样的循环:黑色变彩色,彩色变黑色。如果仅仅这样游戏就太容易了,因此我设计的方块游戏是,你对单元格的点击/按键会影响他自己和他的周围单元格,如图1所示。
图1. (A) 游戏板布局;(B) 当单元格1改变而受到影响的单元格;(C) 当单元格2改变而受到影响的单元格;(D) 当单元格5改变而受到影响的单元格
图1根据数字小键盘的布局显示了相应的游戏板。例如,数字键7对应左上角的单元格。图1中还展示了当一个单元格改变而受到影响的相应单元格(B、C、D中)。如果改变的是角上的,周围三个单元格也会受到影响(B);如果你改变的是边上的,同一边的其他两个单元格也会受到影响(C);如果改变的是中心的,它东南西北的单元格也都会受影响(D)。
用Java重写
我最早是用C写的“方块”游戏。因为C和Java的语法很相似,所以用Java重写并不困难。在我展示我的第一个“方块”Applet的代码之前,你大概想知道界面是怎样的。图2显示了你运行那个applet时的界面。
图2. 包含一个游戏板、两个按钮的“方块”游戏界面
游戏板控件是一个类似于“石头剪子”游戏的网格的区域,并且在它下边有一个白色的消息区域。这个控件还有一个边框,这个边框在空间失去焦点的时候是黑色的,在获得焦点时变成蓝色。“Change Square Color”按钮初始时无效,只有游戏开始以后才可用(如果游戏没有进行,也就没理由改变颜色了)。点击“Start”按钮可以开始游戏,如图3所示。
图3. “方块”游戏开始以后,在游戏板的消息区域会显示当前剩余的秒数
图3显示了游戏进行时的界面。消息区显示了把所有单元格变为黑色还剩余的秒数。如果这个数字到达0,你就输了。如果你能在此之前把所有单元格变为黑色,那你就赢了。在游戏进行时,你可以点击“Change Square Color”按钮以随机改变各单元的颜色。不过如果你输了或者赢了,那“Change Square Color”按钮会变成无效,而“Start”按钮会恢复有效,这样你就可以开始另一个游戏了。
下边是源代码:
Squares.java
// Squares.java
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.Swing.*;
public class Squares extends JApplet
{
private void createGUI ()
{
// 设定界面
getContentPane ().setLayout (new FlowLayout ());
// 创建游戏板控件:每个单元格有40像素宽,默认绿色,并且在获得焦点时边框是蓝色,
// 而失去焦点时变为黑色。把控件加到content pane里。
final GameBoard gb;
gb = new GameBoard (40, Color.green, Color.blue, Color.black);
getContentPane ().add (gb);
// 界面其他部分包括两个按钮,他们会被放到一个panel里以作为整体处理。例如,
// 如果Applet的宽度变大了,两个按钮(而不是一个按钮)都会向游戏板的右侧对齐。
JPanel p = new JPanel ();
// 创建“Change Square Color”按钮并设置为无效。只有游戏进行中可以改变颜色。
final JButton btnChangeSquareColor = new JButton ("Change Square Color");
btnChangeSquareColor.setEnabled (false);
// 建立“Change Square Color”按钮的action事件监听器,点击此按钮,会随机改变
// 单元格的颜色
ActionListener al;
al = new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
Random rnd = new Random ();
while (true)
{
int r = rnd.nextInt (256);
int g = rnd.nextInt (256);
int b = rnd.nextInt (256);
// 不使用所有组成原色(红、绿、蓝)都小于192的颜色,因为那不
// 容易和背景的黑色区分出来。
if (r < 192 && g < 192 && b < 192)
continue;
gb.changeSquareColor (new Color (r, g, b));标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash