java游戏编程100例?几个java编程的典型例子
其实java游戏编程100例的问题并不复杂,但是又很多的朋友都不太了解几个java编程的典型例子,因此呢,今天小编就来为大家分享java游戏编程100例的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
java编程 设计如下图所示的窗口,完成猜数小游戏的设计。
界面不是完全一致,但是可行。
package ex1;
import java.util.Scanner;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class WindowButton extends JFrame implements ActionListener
{
private static final long serialVersionUID= 1L;
int number;
JTextField inputNumber;
JLabel feedBack;
JButton buttonGetNumber,buttonEnter;
WindowButton(String s)
{
super(s);
buttonGetNumber= new JButton("得到一个新的随机数");
feedBack= new JLabel("无反馈信息",JLabel.CENTER);
feedBack.setBackground(Color.red);
inputNumber= new JTextField("0",5);
buttonEnter= new JButton("确定");
buttonEnter.addActionListener(WindowButton.this);
//code 1:按钮buttonEnter增加ActionEvent事件监视器,监视器为当前窗口
buttonGetNumber.addActionListener(WindowButton.this);
//code 2:按钮buttonGetNumber增加ActionEvent事件监视器,监视器为当前窗口
Box boxH1= Box.createHorizontalBox();
boxH1.add(new JLabel("获取1-100之间的随机数:"));
boxH1.add(buttonGetNumber);
Box boxH2= Box.createHorizontalBox();
boxH2.add(new JLabel("输入您的猜测:"));
boxH2.add(inputNumber);
Box boxH3= Box.createHorizontalBox();
boxH3.add(new JLabel("单击确定按钮:"));
boxH3.add(buttonEnter);
Box boxH4= Box.createHorizontalBox();
boxH4.add(new JLabel("反馈信息:"));
boxH4.add(feedBack);
Box baseBox= Box.createVerticalBox();
baseBox.add(boxH1);
baseBox.add(boxH2);
baseBox.add(boxH3);
baseBox.add(boxH4);
Container con= getContentPane();
con.setLayout(new FlowLayout());
con.add(baseBox);
con.validate();
setBounds(230,225,400,200);
setVisible(true);
validate();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()== buttonGetNumber)//code 3:判断事件是否是buttonGetNumber
number=(int)(Math.random()*100)+1;
else if(e.getSource()== buttonEnter)//code 4:判断事件是否是buttonEnter
{
int guess= 0;
try{
guess= Integer.parseInt(inputNumber.getText());
//code 5:返回inputNumber中的文本
if(guess== number)
{
feedBack.setText("猜对了~");
//code 6:feedBack设置提示文本:"猜对了"
}
else if(guess> number)
{
feedBack.setText("猜大了~");
inputNumber.setText(null);
}
else if(guess< number)
{
feedBack.setText("猜小了~");
inputNumber.setText(null);
}
}
catch(NumberFormatException event)
{
feedBack.setText("请输入数字字符");
//code 7:feedBack设置提示文本:"请输入数字字符"
}
}
}
}
public class GuessNumberGame{
public static void main(String[] args){
new WindowButton("猜数子小游戏");
}
}
java,在制作超级玛丽游戏遇到个问题,求大牛!!
做这个需要很多的资源还耐心,我找了个做过的作者,把他的心得贴给你,希望有用!
大家好。今天有空写了点东西,主要是我做“超级玛丽”的经过和经验总结,也许对初学者有用。这是我整理过的,不是编程顺序。
先说明编程语言,我是用QB做“超级玛丽”游戏,VB做的地图编辑器。
确定游戏规模,我的设定是:没有怪和金币,没有可以出入的水管,通关时没有动画。这样,程序的主要操作是显示前景、背景和玛丽,进行玩家和前景的碰撞检测。
资源:图像资源:我参考了一个C语言的“超级玛丽”,借用并修改了其中部分图像(在此向原作者表示感谢)。声音:无。
图像处理:图像分前景和背景,前景和背景都为十六个16*16像素的图像块;前景分三组,用来显示不同关卡,每组的前两个图像块为过关标志(旗杆和横放的水管)。我为了使程序简单,程序中不考虑不同前景,检测过关的程序对旗杆和水管也就不分别判断了,所以只好横向判断,这样“站”在水管上面时不算过关,必须横向走进水管才算过关,旗杆也是一样。图像是BMP格式,不是标准十六色,必须把它转换成QB能识别的格式,并设置调色板。我做了两个辅助程序,一个是VB程序,功能是读取颜色值和像素,写入两个文本文件,一个是颜色值,QB通过它来设置调色板,另一个是图像中转文件;第二个辅助程序是QB程序,它读取刚才的图像中转文件,以GET格式用binary方式分图像块写入“tp.xp”文件。这样做的好处是游戏程序可以用数组存储GET格式图像文件,显示时不用“
select case图像索引
case 1 put(x,y),p1%
case 2 put(x,y),p2%
……
”,可以“PUT(x,y), bj(0,图像索引值), PSET”一条语句搞定。
地图:地图文件是文本文件,每行长度是200个字节,高21行。上5行没用,因为玛丽可以跳得高过屏幕,为了在碰撞检测时少点罗嗦,所以加上这五行。然后12行是地图内容,大写字母是背景,小写字母是前景,字母的ascii值与图像索引顺序相同。最后是前景号(前景共三组)和游戏开始时玛丽的位置。确定了这些做地图编辑器就好办了,地图编辑器没什么好讲的。注意做地图时要注意游戏的乐趣和平衡性。
游戏程序:
输入要求能检测多个键同时按下,这一部分是我从咱们火客下的,要是没有它真做不了。
运动。模拟玛丽跳起和自由下落时费了点周折,我甚至想过用平方函数曲线(它不是叫做抛物线吗?),后来发现了一个更好的办法:重力因素。试试下面这个小程序,是不是个抛物线?
SCREEN 12
dim x,y,ty,zl as integer
zl=1'重力因素
y= 100'高度
ty= 20'跳起时加这条
FOR x= 100 TO 200 STEP 2
ty= ty- zl
y= y+ ty'游戏程序中如果没有发生碰撞则执行这一条
PSET(x, 480- y), 15
NEXT
它的好处是简单和真实。特点是任何时候都会因重力而下落。当人跳起时升高的高度会越来越小,到达顶点后下落,下落时落差越来越大(也就是越来越快),非常真实。从悬崖上掉下(非跳起的情况)时会自由下落。而如果人在实地上行走,则在碰撞检测时会检测到,不让他下落,游戏中看不出来这一点。当然了,这只是模拟。
卷屏。地图用数组存储,每个数组元素代表一个地图块,显示时只显示一部分(宽十九个地图块,高十二个地图块)。我设了两个变量,一个是要显示的地图部分的首地址;另一个是地图显示的位置。要平滑卷动地图就得细致点,移动距离越小看起来越平滑。
看一下程序:
IF x- pyl* 16> 120 AND pyl< 181 THEN wyl= wyl+ 4
IF wyl>= 16 THEN wyl= 0: pyl= pyl+ 1
X是人在地图上的横坐标,pyl是显示的地图的首地址,x- pyl* 16是人在显示器上的横坐标,120大约在屏幕中线,wyl是显示的首块地图的显示位置,叫它位移量吧,取值为0、4、8、12。
第一条:当人向右行走超过中线且没到终点时,位移量加四,每块地图显示时向左移动四像素。
第二条:当移动十六像素时显示的地图范围向右移动一格,位移量置零。
这样循环就实现了地图平滑卷动。
碰撞检测。这一部分很简单,依次检查人所占的四格地图是否为空,如果人已进入前景,就把他拉回来。
人物图像的显示:
IF dz< 3 THEN dz= dz+ 1 ELSE dz= 0'正常行走时,三幅行走图交替显示。
IF GameKey(75)= 0 AND 0= GameKey(77) THEN dz= 0'没有行走时,站立资势。
IF d= 0 THEN dz= 5'跳跃时,显示跳的图片。
它们的顺序也是优先级。
再加上方向,就很自然了。方向是在检测输入时设置的。
刚才说了“tp.xp”文件和显示地图块,再用源码解释一下。我并不懂GET图像格式,不过我的辅助程序是这样写文件的:
OPEN"tp.xp" FOR BINARY AS#2
for………
f= 1
GET(,)-(,), a
FOR j= 0 TO 130
PUT#2, f, a(j)
f= f+ 2
NEXT
……NEXT
CLOSE
游戏初始化时读文件:
f= 1
OPEN"tp.xp" FOR BINARY AS#2
FOR i= 0 TO 15
FOR j= 0 TO 130
GET#2, f, bj(j, i)
f= f+ 2
NEXT
NEXT
CLOSE#2
显示时:
PUT(,), bj(0,图像索引值), PSET
一条就行了。
嗯,主要的就这些了。
这些只是我在编程时摸索得来的,可能与正规游戏开发有出入。如果有不当或错误的地方,欢迎批评指正.
谢谢。
高分悬赏Java程序,急!!!
import java.awt.*;
import java.awt.event.*;
//俄罗斯方块类
public class ERS_Block extends Frame{
public static boolean isPlay=false;
public static int level=1,score=0;
public static TextField scoreField,levelField;
public static MyTimer timer;
GameCanvas gameScr;
public static void main(String[] argus){
ERS_Block ers= new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent");
WindowListener win_listener= new WinListener();
ers.addWindowListener(win_listener);
}
//俄罗斯方块类的构造方法
ERS_Block(String title){
super(title);
setSize(600,480);
setLayout(new GridLayout(1,2));
gameScr= new GameCanvas();
gameScr.addKeyListener(gameScr);
timer= new MyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
Panel rightScr= new Panel();
rightScr.setLayout(new GridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
//右边信息窗体的布局
MyPanel infoScr= new MyPanel();
infoScr.setLayout(new GridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
//定义标签和初始值
Label scorep= new Label("分数:",Label.LEFT);
Label levelp= new Label("级数:",Label.LEFT);
Label namep= new Label("姓名:张三",Label.LEFT);
Label nump= new Label("学号:110821332",Label.LEFT);
scoreField= new TextField(8);
levelField= new TextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(namep);
infoScr.add(nump);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(new Dimension(20,60));
scoreField.setSize(new Dimension(20,60));
levelp.setSize(new Dimension(20,60));
levelField.setSize(new Dimension(20,60));
scoreField.setText("0");
levelField.setText("1");
//右边控制按钮窗体的布局
MyPanel controlScr= new MyPanel();
controlScr.setLayout(new GridLayout(5,1,0,5));
rightScr.add(controlScr);
//定义按钮play
Button play_b= new Button("开始游戏");
play_b.setSize(new Dimension(50,200));
play_b.addActionListener(new Command(Command.button_play,gameScr));
//定义按钮Level UP
Button level_up_b= new Button("提高级数");
level_up_b.setSize(new Dimension(50,200));
level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));
//定义按钮Level Down
Button level_down_b=new Button("降低级数");
level_down_b.setSize(new Dimension(50,200));
level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));
//定义按钮Level Pause
Button pause_b=new Button("游戏暂停");
pause_b.setSize(new Dimension(50,200));
pause_b.addActionListener(new Command(Command.button_pause,gameScr));
//定义按钮Quit
Button quit_b= new Button("退出游戏");
quit_b.setSize(new Dimension(50,200));
quit_b.addActionListener(new Command(Command.button_quit,gameScr));
controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
}
//重写MyPanel类,使Panel的四周留空间
class MyPanel extends Panel{
public Insets getInsets(){
return new Insets(30,50,30,50);
}
}
//游戏画布类
class GameCanvas extends Canvas implements KeyListener{
final int unitSize= 30;//小方块边长
int rowNum;//正方格的行数
int columnNum;//正方格的列数
int maxAllowRowNum;//允许有多少行未削
int blockInitRow;//新出现块的起始行坐标
int blockInitCol;//新出现块的起始列坐标
int [][] scrArr;//屏幕数组
Block b;//对方快的引用
//画布类的构造方法
GameCanvas(){
rowNum= 15;
columnNum= 10;
maxAllowRowNum= rowNum- 2;
b= new Block(this);
blockInitRow= rowNum- 1;
blockInitCol= columnNum/2- 2;
scrArr= new int [32][32];
}
//初始化屏幕,并将屏幕数组清零的方法
void initScr(){
for(int i=0;i<rowNum;i++)
for(int j=0; j<columnNum;j++)
scrArr[i][j]=0;
b.reset();
repaint();
}
//重新刷新画布方法
public void paint(Graphics g){
for(int i= 0; i< rowNum; i++)
for(int j= 0; j< columnNum; j++)
drawUnit(i,j,scrArr[i][j]);
}
//画方块的方法
public void drawUnit(int row,int col,int type){
scrArr[row][col]= type;
Graphics g= getGraphics();
switch(type){//表示画方快的方法
case 0: g.setColor(Color.black);break;//以背景为颜色画
case 1: g.setColor(Color.blue);break;//画正在下落的方块
case 2: g.setColor(Color.magenta);break;//画已经落下的方法
}
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);
g.dispose();
}
public Block getBlock(){
return b;//返回block实例的引用
}
//返回屏幕数组中(row,col)位置的属性值
public int getScrArrXY(int row,int col){
if(row< 0|| row>= rowNum|| col< 0|| col>= columnNum)
return(-1);
else
return(scrArr[row][col]);
}
//返回新块的初始行坐标方法
public int getInitRow(){
return(blockInitRow);//返回新块的初始行坐标
}
//返回新块的初始列坐标方法
public int getInitCol(){
return(blockInitCol);//返回新块的初始列坐标
}
//满行删除方法
void deleteFullLine(){
int full_line_num= 0;
int k= 0;
for(int i=0;i<rowNum;i++){
boolean isfull= true;
L1:for(int j=0;j<columnNum;j++)
if(scrArr[i][j]== 0){
k++;
isfull= false;
break L1;
}
if(isfull) full_line_num++;
if(k!=0&& k-1!=i&&!isfull)
for(int j= 0; j< columnNum; j++){
if(scrArr[i][j]== 0)
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j]= scrArr[i][j];
}
}
for(int i= k-1;i< rowNum; i++){
for(int j= 0; j< columnNum; j++){
drawUnit(i,j,0);
scrArr[i][j]=0;
}
}
ERS_Block.score+= full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
//判断游戏是否结束方法
boolean isGameEnd(){
for(int col= 0; col<columnNum; col++){
if(scrArr[maxAllowRowNum][col]!=0)
return true;
}
return false;
}
public void keyTyped(KeyEvent e){
}
public void keyReleased(KeyEvent e){
}
//处理键盘输入的方法
public void keyPressed(KeyEvent e){
if(!ERS_Block.isPlay)
return;
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:b.fallDown();break;
case KeyEvent.VK_LEFT:b.leftMove();break;
case KeyEvent.VK_RIGHT:b.rightMove();break;
case KeyEvent.VK_SPACE:b.leftTurn();break;
}
}
}
//处理控制类
class Command implements ActionListener{
static final int button_play= 1;//给按钮分配编号
static final int button_levelup= 2;
static final int button_leveldown= 3;
static final int button_quit= 4;
static final int button_pause= 5;
static boolean pause_resume= true;
int curButton;//当前按钮
GameCanvas scr;
//控制按钮类的构造方法
Command(int button,GameCanvas scr){
curButton= button;
this.scr=scr;
}
//按钮执行方法
public void actionPerformed(ActionEvent e){
switch(curButton){
case button_play:if(!ERS_Block.isPlay){
scr.initScr();
ERS_Block.isPlay= true;
ERS_Block.score= 0;
ERS_Block.scoreField.setText("0");
ERS_Block.timer.resume();
}
scr.requestFocus();
break;
case button_levelup:if(ERS_Block.level< 10){
ERS_Block.level++;
ERS_Block.levelField.setText(""+ERS_Block.level);
ERS_Block.score= 0;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
scr.requestFocus();
break;
case button_leveldown:if(ERS_Block.level> 1){
ERS_Block.level--;
ERS_Block.levelField.setText(""+ERS_Block.level);
ERS_Block.score= 0;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
scr.requestFocus();
break;
case button_pause:if(pause_resume){
ERS_Block.timer.suspend();
pause_resume= false;
}else{
ERS_Block.timer.resume();
pause_resume= true;
}
scr.requestFocus();
break;
case button_quit:System.exit(0);
}
}
}
//方块类
class Block{
static int[][] pattern={
{0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态
{0x04e0,0x0464,0x00e4,0x04c4},
{0x4620,0x6c00,0x4620,0x6c00},
{0x2640,0xc600,0x2640,0xc600},
{0x6220,0x1700,0x2230,0x0740},
{0x6440,0x0e20,0x44c0,0x8e00},
{0x0660,0x0660,0x0660,0x0660}
};
int blockType;//块的模式号(0-6)
int turnState;//块的翻转状态(0-3)
int blockState;//快的下落状态
int row,col;//块在画布上的坐标
GameCanvas scr;
//块类的构造方法
Block(GameCanvas scr){
this.scr= scr;
blockType=(int)(Math.random()* 1000)%7;
turnState=(int)(Math.random()* 1000)%4;
blockState= 1;
row= scr.getInitRow();
col= scr.getInitCol();
}
//重新初始化块,并显示新块
public void reset(){
blockType=(int)(Math.random()* 1000)%7;
turnState=(int)(Math.random()* 1000)%4;
blockState= 1;
row= scr.getInitRow();
col= scr.getInitCol();
dispBlock(1);
}
//实现“块”翻转的方法
public void leftTurn(){
if(assertValid(blockType,(turnState+ 1)%4,row,col)){
dispBlock(0);
turnState=(turnState+ 1)%4;
dispBlock(1);
}
}
//实现“块”的左移的方法
public void leftMove(){
if(assertValid(blockType,turnState,row,col-1)){
dispBlock(0);
col--;
dispBlock(1);
}
}
//实现块的右移
public void rightMove(){
if(assertValid(blockType,turnState,row,col+1)){
dispBlock(0);
col++;
dispBlock(1);
}
}
//实现块落下的操作的方法
public boolean fallDown(){
if(blockState== 2)
return(false);
if(assertValid(blockType,turnState,row-1,col)){
dispBlock(0);
row--;
dispBlock(1);
return(true);
}else{
blockState= 2;
dispBlock(2);
return(false);
}
}
//判断是否正确的方法
boolean assertValid(int t,int s,int row,int col){
int k= 0x8000;
for(int i= 0; i< 4; i++){
for(int j= 0; j< 4; j++){
if((int)(pattern[t][s]&k)!= 0){
int temp= scr.getScrArrXY(row-i,col+j);
if(temp<0||temp==2)
return false;
}
k= k>> 1;
}
}
return true;
}
//同步显示的方法
public synchronized void dispBlock(int s){
int k= 0x8000;
for(int i= 0; i< 4; i++){
for(int j= 0; j< 4; j++){
if(((int)pattern[blockType][turnState]&k)!= 0){
scr.drawUnit(row-i,col+j,s);
}
k=k>>1;
}
}
}
}
//定时线程
class MyTimer extends Thread{
GameCanvas scr;
public MyTimer(GameCanvas scr){
this.scr= scr;
}
public void run(){
while(true){
try{
sleep((10-ERS_Block.level+ 1)*100);
}
catch(InterruptedException e){}
if(!scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
ERS_Block.isPlay= false;
suspend();
}else
scr.getBlock().reset();
}
}
}
}
class WinListener extends WindowAdapter{
public void windowClosing(WindowEvent l){
System.exit(0);
}
}
关于java游戏编程100例和几个java编程的典型例子的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。