代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
生命繁衍游戏
作者:
Tobe1
/ 发布于
2014/12/13
/
481
package cell; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Image; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Random; import cn.justcoding.ui.BaseFrame; /** * 细胞繁殖游戏 1.如果一个细胞只有0或1个邻居,他将因孤独而死 2.如果一个细胞有4个8个邻居,他将因拥挤而死 3.如果一个细胞有2个或3个邻居,它将继续生存下去 4.如果一个空格子恰有三个邻居,将“生”出一个新细胞 5.其他空格子将继续维持形状 提示: 细胞可用对象来存储,属性是:编号随机且不重复,死,活,邻居数量。 开始输入随机个细胞和邻居随机组合,然后1s为周期,演示发展结果 @author zcloud * @date 2014/12/10 */ public class MainFrame extends BaseFrame{ private static final long serialVersionUID = 9189385289024337979L; private TextField textField; private List<Cell> list = new ArrayList<MainFrame.Cell>(); private boolean stop = false; private boolean pause = false; private Image offScreenImage = null;//用来实现双缓冲 public MainFrame() { this.setBackground(Color.gray); textField = new TextField(10); Button btn = new Button("start"); btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String str = textField.getText(); if(str == null || str.trim().isEmpty()) return; stop = false; pause = false; int seed = Integer.parseInt(str); initCell(seed); new Thread(new LifeCycle()).start();//开启生命周期 } }); Button stopBtn = new Button("stop"); stopBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { stop = true; } }); Button pauseBtn = new Button("pause"); pauseBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pause = true; } }); this.setLayout(new FlowLayout(FlowLayout.CENTER)); this.add(textField); this.add(btn); this.add(pauseBtn); this.add(stopBtn); this.setTitle("细胞繁衍游戏"); this.setSize(800, 600); } /** * 检查当前周期细胞状态并重绘 */ public void check(){ for(int i = 0; i < 20; i++){ for(int j = 0; j < 20; j++){ int rounds = cellRoundNumber(i, j); int index = isCell(i, j); if(index >= 0){//有细胞 switch(rounds){ //孤独而死 case 0: case 1: //拥挤而死 case 4: case 8: list.remove(index); break; } }else{ if(rounds == 3){//生出细胞 Cell cell = new Cell(); cell.r = i; cell.c = j; list.add(cell); } } } } repaint(); } /** * 判断当前格子是否存在细胞 * @param r * @param c * @return int(-1表示不存在细胞) */ public int isCell(int r, int c){ for(int i = 0, n = list.size(); i < n; i++){ Cell cell = list.get(i); if(cell.r == r && cell.c == c){ return i; } } return -1; } /** * 获得邻居个数 * @param r * @param c * @return int */ public int cellRoundNumber(int r, int c){ int count = 0;//邻居计数器 //检测上下面 for(int i = 0; i < 3; i++){ if(isCell(r+1, c-1+i) >= 0){ count++; } if(isCell(r-1, c-1+i) >= 0){ count++; } } //检测左右两格 if(isCell(r, c-1) >= 0 || isCell(r, c+1) >= 0) count++; return count; } /** * 初始化细胞个数 * @param seed */ public void initCell(int seed){ Random rd = new Random(); for(int i = 0; i < seed; i++){ int r = rd.nextInt(20); int c = rd.nextInt(20); Cell cell = new Cell(); cell.r = r; cell.c = c; list.add(cell); } repaint(); } @Override public void update(Graphics g){ if(offScreenImage == null) { offScreenImage = this.createImage(800, 600); } Graphics goffScreen = offScreenImage.getGraphics(); Color c = g.getColor(); goffScreen.setColor(Color.gray); goffScreen.fillRect(0, 0, 800, 600); goffScreen.setColor(c); paint(goffScreen); g.drawImage(offScreenImage, 0, 0, null); } @Override public void paint(Graphics g){ super.paint(g); if (!stop) { for (int i = 0; i < 21; i++) { g.drawLine(200, 100 + i * 20, 600, 100 + i * 20); } for (int i = 0; i < 21; i++) { g.drawLine(200 + i * 20, 100, 200 + i * 20, 500); } for (int i = 0, n = list.size(); i < n; i++) { Cell c = list.get(i); c.draw(g); } } } public static void main(String[] args) { new MainFrame(); } class Cell{ public int r; public int c; public boolean live = true; public void draw(Graphics g){ if(live){ Color color = g.getColor(); g.setColor(Color.green); g.fillOval(200+r*20+5, 100+c*20+5, 10, 10); g.setColor(color); } } } class LifeCycle implements Runnable{ @Override public void run() { while(!stop){ if (!pause) { try { Thread.sleep(1000);//演变周期为1s check(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } package cn.justcoding.ui; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class BaseFrame extends Frame { private static final long serialVersionUID = -63872511099335590L; public BaseFrame(){ this.setVisible(true); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(-1); } }); } }
试试其它关键字
生命繁衍
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
Tobe1
贡献的其它代码
(
7
)
.
php缩略图函数
.
水波扩散效果
.
数组对象增加一个返回随机元素的方法
.
iOS 放射状圆环
.
蛇形填数
.
生命繁衍游戏
.
最长回文字串的实现
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3