用java编写赛马_java多线程例子-赛马

java多线程例子-赛马

2014-07-22·Mr.Xia

4036 次浏览

## 效果图

![TIM截图20180508205159.bmp](https://image.xsoftlab.net/baike/articleImages/4e9dd8a362282aa84d9f99db3be9197b.jpg)

## 介绍

例子很简洁,只有两个类,一个是马类(Horse),一个是窗体类(GameFrame),程序入口写在了GameFrame中,每匹马都有一个独立的线程控制移动,东西不多,很容易理解。

## 准备工作

只需要一张动态图horse2.gif,就是奔跑的马。

![horse](http://www.zhenzhigu.com/attachment/1405/thread/6_2_e62bfa4c042c69c.gif)

## 代码

### Horse 类

```java

package com.zhenzhigu.race;

import java.awt.Point;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JLabel;

/**

* 马

*

* @author loopcc create 20140514

*

*/

public class Horse extends JLabel implements Runnable {

public int speed = 1;// 移动速度

public Icon icon = new ImageIcon("d:/horse2.gif");

/**

* 构造方法,指定坐标与速度

*

* @param x

* @param y

* @param speed

*/

public Horse(int x, int y, int speed) {

this.setBounds(x, y, 222, 222);

this.speed = speed;

this.setIcon(icon);

// 新开一个线程并启动

new Thread(this).start();

}

@Override

public void run() {

Point p = null;

while (true) {

try {

p = this.getLocation();

this.setLocation(p.x - speed, p.y);

// 每隔33毫秒移动一次

Thread.sleep(33);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

```

### GameFrame 类

```java

package com.zhenzhigu.race;

import javax.swing.JFrame;

/**

* 程序主窗体

*

* @author loopcc

*

*/

public class GameFrame extends JFrame {

public GameFrame() {

this.setLayout(null);// 设置布局为null

this.setSize(999, 650);// 设置窗体大小

this.setVisible(true);// 设置窗体显示

this.setDefaultCloseOperation(EXIT_ON_CLOSE);// 设置关闭规则

this.setTitle("多线程Demo - 赛马 - 【真知谷科技:www.zhenzhigu.com】");

}

/**

* 程序入口

*

* @param a

*/

public static void main(String a[]) {

GameFrame game = new GameFrame();

game.add(new Horse(900, 50, 1));// 新建一匹马并添加到game窗体中

game.add(new Horse(900, 200, 3));

game.add(new Horse(900, 350, 2));

}

}

```

田忌赛马是一个经典的中国策略游戏,故事中田忌通过调整马的出场顺序,利用每个马的速度优势战胜了齐威王。在贪心算法中,我们可以借鉴这个思想来解决问题。贪心法是一种每一步都采取当前状态下最好或最优的选择,希望这样的局部最优解最终会导向全局最优解。 在Java中实现田忌赛马贪心算法,通常会定义三个等级的马(例如A、B、C),每次比赛选择最有可能赢得对手最低等级的马出战。以下是简单的步骤: 1. 定义三个马的胜率数组或列表,表示各自对阵其他等级马的胜率。 2. 对于每场比赛,从田忌的马中选出胜率最高的马对齐威王最差的马。 3. 遍历所有比赛,记录田忌的总胜场数。 这里是一个简化版的Java代码示例: ```java class Horse { public int speed; // 马的速度 } public class TianJi { private static final int NUM_OF_RACES = 3; public static void main(String[] args) { Horse[] tianJiHorses = {new Horse(), new Horse(), new Horse()}; // 田忌的马 Horse[] weiWangHorses = {new Horse(), new Horse(), new Horse()}; // 齐威王的马 // 假设胜率已知并填充到speed属性中 // ... int wins = solveTianji(tianJiHorses, weiWangHorses); System.out.println("田忌赢得了 " + wins + " 场比赛"); } private static int solveTianji(Horse[] tianJiHorses, Horse[] weiWangHorses) { int tianjiWins = 0; for (int i = 0; i < NUM_OF_RACES; i++) { if (tianJiHorses[i].speed > weiWangHorses[i].speed) { tianjiWins++; } } return tianjiWins; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值