版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录一.需求分析 11.1概述21.2课题分析21.3实现功能步骤 21.4设计工作详解 21.5外部界面需求 21.6运行环境3二.概要设计 32.1系统流程图 32.2功能模块图 42.3赛马比赛模拟程序初始化块42.4赛马比赛区模块42.5投注区模块52.6线程启动及结束模块52.7比赛结果显示区模块5三.详细设计 73.1赛马比赛模拟程序初始化模块63.2赛马比赛区模块 73.3投注区模块 83.4线程启动及结束模块 93.5比赛结果显示区模块123.6程序流程123.7系统界面13四.调试分析 134.1调试过程中所遇到的问题及解决方法 134.2经验与体会 14五.用户使用说明 14六.测试结果 14七.参考文献 18八.附录 18一、需求分析1.1概述Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。本次使用的是eclipse开发软件。以下就给出这次课题设计的题目:模拟赛马比赛。1.2课题分析a.课设题目:模拟赛马比赛内容:设计一个模拟赛马比赛软件,比赛显示赛马过程,每匹马每个时刻的加速度都是随机的。能统计每匹马所跑完所需的总时间,最终的名次。支持用户对马进行投注,并记录输赢,保存到文件或数据库中。b.从这个题目来分析,要做的主要有四大点:1.第一点就是要设计用户登录赛马的页面,登陆后才能进行赛马和投注等功能。2.第二点就是要能在页面上进行投注和赛马。其中包括:(1)用户进行选马,和对选中的马进行有效的投注。(2)开始赛马,期间用户不得进行其他操作。(3)赛马结束,显示比赛输赢和投注金额的变化。3.第三点就是用户能进行重新比赛等操作。1.3实现功能步骤程序开始后,会进入用户登录界面,用户输入自己的姓名和密码后,选择登录会进入到赛马比赛的界面,这时可以看见赛马场和马匹的编号,用户可以选择任何一个编号的马进行投注,输入有效的投注金额(因为系统设置了初始金额,所以不得投注的超过初始金额)。投注完成后用户可以选择开始比赛,赛马期间用户不得进行任何操作,赛马结束后,用户可以重新进行新一轮的赛马比赛,方法上同。1.4设计工作详解通过这个分析,我认为主要是通过线程来实现马的运动,thread的子类创建线程,线程的开始使马进行运动,再通过线程的休眠,随机获得休眠时间使马获得随机的加速度,最后线程的终止使马停止运动。期间还包括用Draw类以及各种repaint()等方法来绘制马匹。1.5外部界面需求本程序JFrame类其子类创建的对象是窗体,通过按钮JButton及标签组件JLabel来实现用户的登录界面。赛马界面还运用到JPanel创建面板和FlowLayout布局变量,区分赛马、投注、显示区域,还使用Draw类画马匹,来丰富整个赛马的界面。1.6运行环境系统软件:Window7所需文件:JTextDemo.java,Run.java,DateUtil.java工具软件:Eclipse二.概要设计2.1系统流程图开始开始输入用户姓名及密码,进行登录输入用户姓名及密码,进行登录进入赛马比赛界面,在投注区使用鼠标操作,进行对马匹的投注进入赛马比赛界面,在投注区使用鼠标操作,进行对马匹的投注选择马匹编号,输入投注金额,按下开始比赛按钮。选择马匹编号,输入投注金额,按下开始比赛按钮。比赛线程开始,直到马匹跑完全程,线程结束比赛线程开始,直到马匹跑完全程,线程结束界面显示赛马结果及资金变动结果界面显示赛马结果及资金变动结果结束结束重新开始图2.1系统流程图2.2功能模块图赛马比赛初始化赛马比赛初始化比赛结果显示区投注区赛马比赛区比赛结果显示区投注区赛马比赛区赛马线程启动及结束画赛马线程启动及结束画出马匹及赛道投注金额投投注金额投注马匹赌获取比赛获取比赛结束系统时间金初始系统变时间化图2.2功能模块图2.3赛马比赛模拟程序初始化模块在这一模块中,要求对赛马场、投注区及显示区的布局进行设置,初始化程序窗口的大小,并创建程序窗口。2.4赛马比赛区模块其中此模块包括对画出马匹和赛道部分,通过使用Draw类来向Jpanel面板中添加马和赛道。部分代码:classDrawextendsJPanel{intx=0;Strings;intw,h;publicvoidpaint(Graphicsg){ super.paint(g); this.setBackground(Color.WHITE); w=this.getWidth(); h=this.getHeight(); g.setColor(Color.BLACK); g.drawLine(66,h/2-44,666,h/2-44); g.drawLine(66,h/2+40,666,h/2+40); g.setColor(Color.BLACK); g.drawLine(66,0,66,h); g.setColor(Color.red); g.drawLine(666,0,666,h); g.drawRect(36+x,h/2-10,30,20);//马的显示g.setColor(Color.BLACK);//文字显示 g.drawString(s,26,h/2-12);}}2.5投注区模块投注马匹模块主要是实现马匹的选择及投注的模拟,增加JRadioButton单选按钮选择马匹。b.投注金额模块TextField来输入投注金额,tfget接收后与总金额进行比较。c.赌金变化模块同时变量tz控制金额改变。2.6线程启动及结束模块a.线程启动及结束部分模块使用racing().start()启动线程,马匹开始运动。b.获取比赛初始系统时间模块线程run启动时,通过使用Calendar类来获取比赛开始时的系统时间,其中使用getNow_HMS()方法来获取比赛的初始时间。c.获取比赛结束系统时间模块当比赛结束,线程终止时,通过使用Calendar类来获取比赛结束时的系统时间,其中使用getNow_HMS()方法来获取比赛的结束时间。2.7比赛结果显示区模块在JTextArea()分布的空间内,通过方法append()显示马匹的名次,用时等信息。三.详细设计3.1赛马比赛模拟程序初始化模块在这一模块中,要求对赛马场、投注区及显示区的布局进行设置。模块代码:publicRun(){ frame=newJFrame("赛马"); p1=newJPanel(); p2=newJPanel(); p3=newJPanel(); ly=newFlowLayout(); jb=newJButton("开始"); h1=newDraw();h2=newDraw();h3=newDraw();h4=newDraw();no=0;tz=20000;cotrol=true;h1.s="1号马";h2.s="2号马";h3.s="3号马";h4.s="4号马";b1=newJRadioButton("1号马");b2=newJRadioButton("2号马");b3=newJRadioButton("3号马");b4=newJRadioButton("4号马");bg=newButtonGroup();money=newJLabel("总金额为"+String.valueOf(tz));tf=newTextField(10);ta=newJTextArea("",5,10);//放置单选按钮bg.add(b1);bg.add(b2);bg.add(b3);bg.add(b4);//设置投注区p3.add(newJLabel("投注区"));p3.add(b1);p3.add(b2);p3.add(b3);p3.add(b4);p3.add(money);p3.add(tf);//设置P2 p2.setBackground(Color.white); ly.setHgap(30);//设置布局的水平间隙 p2.setLayout(ly); p2.add(p3); p2.add(jb); p2.add(ta); //设置赛马区 p1.setBackground(Color.white); p1.add(newJLabel("赛马区")); p1.setLayout(newGridLayout(5,1));//设置成5行1列的网格 p1.add(h1); p1.add(h2); p1.add(h3); p1.add(h4); //界面设定 frame.setLayout(newBorderLayout());frame.add("Center",p1); frame.add("South",p2); frame.setBounds(100,100,800,620); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置结束窗口 tf.addActionListener(this); jb.addActionListener(this); b1.addActionListener(newRadioListener());//按钮监听器 b2.addActionListener(newRadioListener()); b3.addActionListener(newRadioListener()); b4.addActionListener(newRadioListener()); frame.setVisible(true);}3.2赛马比赛区模块使用Draw添加马和赛道。模块代码:publicclassRunextendsJFrameimplementsActionListener{ racinght;//赛马的进程 Drawh1,h2,h3,h4;//画出马的运动图形 JPanelp1;//赛马区……}classDrawextendsJPanel{intx=0;Strings;intw,h;publicvoidpaint(Graphicsg){ super.paint(g); this.setBackground(Color.WHITE); w=this.getWidth(); h=this.getHeight(); g.setColor(Color.BLACK); g.drawLine(66,h/2-44,666,h/2-44); g.drawLine(66,h/2+40,666,h/2+40); g.setColor(Color.BLACK); g.drawLine(66,0,66,h); g.setColor(Color.red); g.drawLine(666,0,666,h); g.drawRect(36+x,h/2-10,30,20);//马的显示g.setColor(Color.BLACK);//文字显示 g.drawString(s,26,h/2-12);}}3.3投注区模块这一模块包括投注马匹和投注金额模块。主要是实现马匹的选择及投注的模拟,增加JRadioButton单选按钮选择马匹,TextField来输入投注金额,同时变量tz控制金额改变。模块代码:publicclassRunextendsJFrameimplementsActionListener{ …… JPanelp3;//投注区 JButtonjb;//开始按钮 JFrameframe; DateUtild1=newDateUtil(); booleancotrol;//对投注额改变的变量 intno;//名次编号 Strings;//投注单选事件的变量符号 JRadioButtonb1,b2,b3,b4;//投注的单选按钮 ButtonGroupbg;//按钮注,使其为单选 JTextAreata;//赛马的文字显示 JLabelmoney;//投注总金额标签 TextFieldtf;//投注金额的输入窗口 inttz;//投注金额变化的变量 Stringtfget;//投注总金额的中转变量 FlowLayoutly;//布局变量}publicvoidactionPerformed(ActionEvente){ if(bg.getSelection()!=null){//投注单选按钮选择确认 if(e.getActionCommand()=="开始"){ tfget=tf.getText(); try{ if(Integer.parseInt(tfget)>0&&Integer.parseInt(tfget)<=tz)//string转换成int{//投注金额确认 ta.setText("比赛开始了"+'\n'); newracing(h1,this).start(); newracing(h2,this).start(); newracing(h3,this).start(); newracing(h4,this).start(); jb.setText("重新开始");//赛马按键标签改变 b1.setEnabled(false);//赛马开始后,禁止操作 b2.setEnabled(false); b3.setEnabled(false); b4.setEnabled(false); tf.setEditable(false); jb.setEnabled(false);} else{ JOptionPane.showMessageDialog(null,"投注金额错误,请重新投注");//信息对话框} } catch(Exceptionex) { JOptionPane.showMessageDialog(null,"投注格式错误,请重新投注"); }}}else{ JOptionPane.showMessageDialog(null,"请选号确认投注");}3.4线程启动及结束模块a.线程启动及结束部分模块模块代码:publicvoidactionPerformed(ActionEvente){…… ta.setText("比赛开始了"+'\n'); newracing(h1,this).start(); newracing(h2,this).start(); newracing(h3,this).start(); newracing(h4,this).start(); jb.setText("重新开始");//赛马按键标签改变 b1.setEnabled(false);//赛马开始后,禁止操作 b2.setEnabled(false); b3.setEnabled(false); b4.setEnabled(false); tf.setEditable(false); jb.setEnabled(false);}…… if(e.getActionCommand()=="重新开始") {//重新开始,相应的控制重置 restar(h1,this); restar(h2,this); restar(h3,this); restar(h4,this); cotrol=true; no=0; ta.setText(""); tf.setEditable(true); b1.setEnabled(true); b2.setEnabled(true); b3.setEnabled(true); b4.setEnabled(true); jb.setText("开始"); }}classracingextendsThread{//马运动的线程控制 Drawa; Runr; DateUtild=newDateUtil(); racing(Drawh,Runb) { this.a=h; this.r=b; } b.获取比赛初始系统时间模块线程run启动时,通过使用Calendar类来获取比赛开始时的系统时间,其中使用getNow_HMS()方法来获取比赛的初始时间。模块代码:importjava.util.*;publicclassDateUtil{publicstaticStringgetNow_M(){Calendarc=Calendar.getInstance();Stringminute=String.valueOf(c.get(Calendar.MINUTE));if(minute.length()==1){minute="0"+minute;}Stringms1=minute;returnms1;}publicstaticStringgetNow_S(){ Calendarc=Calendar.getInstance(); Stringsecond=String.valueOf(c.get(Calendar.SECOND)); if(second.length()==1){ second="0"+second; } Stringms2=second; returnms2; }publicintgetNow_HMS(){ Strings1,s2; s1=getNow_M(); s2=getNow_S(); inta=Integer.parseInt(s1)*60+Integer.parseInt(s2); returna;}publicstaticvoidmain(String[]args){ DateUtild; d=newDateUtil(); d.getNow_HMS();}}publicintTime(){ intoo=d1.getNow_HMS(); returnoo;}c.获取比赛结束系统时间模块当比赛结束,线程终止时,通过使用Calendar类来获取比赛结束时的系统时间,其中使用getNow_HMS()方法来获取比赛的结束时间。模块代码:publicvoidrun(){intt;into,y;o=r.Time();…… y=d.getNow_HMS();intz=y-o; ta.append("用时:"+z+"秒"+'\n');}3.5比赛结果显示区模块在JTextArea()分布的空间内,通过方法append()显示马匹的名次,用时等信息。3.6程序流程进入赛马比赛界面点击任意一匹马的编号向投注区内输入投注的金额点击开始比赛按钮比赛结束点击重新开始比赛进入上面循环直到用户金额为空或者自行退出比赛3.7系统界面四.调试分析4.1调试过程中所遇到的问题及解决方法 本次课设遇到几个问题,但是通过仔细查找资料也能很快的进行解决:本次要求中有需要马的加速度的随机的,这个问题后来使用线程的休眠来解决的。通过使用随机来获得休眠时间,最后每匹马的休眠时间的不同,从而达到每匹马的加速度的不同,马匹运动的快慢就不一样了。比赛还需要计数每匹马跑的最终时间,解决方法是比赛开始时获取一次系统时间,到后来每匹马的线程终止了就分别获取终止时的系统时间,这样相减就得到每匹马跑完的时间。通过使用日期类Calendar来解决。4.2经验与体会通过这次的课设,使我收获良多。首先对与java的知识我有了更加深刻的理解和掌握,仅仅靠书本上的知识,而不去亲手实践运用是没有用的,而这次的实验,我把课堂上的知识结合起来,自己理解的更加透彻,使课设做起来十分的应手。虽然遇到了一些问题,但是通过查找资料和提问同学,使得问题慢慢的解决,最后使得课设尽自己最大的努力做到了最好。对于界面的设计、线程的使用还有对JAVA也有了更加多的掌握,所以,还是要多进行实践来丰富自己的知识。五.用户使用说明(1)这次程序的编译环境是Eclipse工具,同时还有包含3个文件:JTextDemo.java,Run.java,DateUtil.java。(2)整个程序进入时需要在第一个对话框中输入姓名和密码,之后跳转到赛马界面。(3)在比赛的时候,需要实现选择任意一匹马来进行投注任意的金额,之后再开始进行比赛。(4)最后第一期比赛结束后,在资金足够的情况下,可以选择重新进行比赛,也可以选择退出比赛界面。六.测试结果登录界面2.赛马界面对1号马进行投注10000元比赛开始比赛结束重新开始比赛,此时用户赌金已经发生变化七.参考文献1.耿祥义.《Java大学实用教程》.电子工业出版社.第三版八.附录JTextDemo.java文件packagec;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassJTextDemoextendsJFrame{ privateJTextFielduid_text; privateJPasswordFieldpwd_text; publicJTextDemo(){ super("登陆窗口"); Containerc=getContentPane(); c.setLayout(newFlowLayout()); setBounds(100,100,500,500); JLabelu=newJLabel("用户:"); JLabelp=newJLabel("密码:"); uid_text=newJTextField(15); pwd_text=newJPasswordField(15); JButtonb1=newJButton("确定"); b1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ newRun(); } }); JButtonb2=newJButton("取消"); b2.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ System.exit(0); } }); c.add(u); c.add(uid_text); c.add(p); c.add(pwd_text); c.add(b1); c.add(b2); setVisible(true); } publicstaticvoidmain(Stringarg[]){ JTextDemotestJTextDemo=newJTextDemo(); }}2.Run.java文件packagec;importjava.awt.*;importjava.awt.event.*;importjava.util.*;importjavax.swing.*;publicclassRunextendsJFrameimplementsActionListener{ racinght;//赛马的进程 Drawh1,h2,h3,h4;//画出马的运动图形 JPanelp1;//赛马区 JPanelp2; JPanelp3;//投注区 JButtonjb;//开始按钮 JFrameframe; DateUtild1=newDateUtil(); booleancotrol;//对投注额改变的变量 intno;//名次编号 Strings;//投注单选事件的变量符号 JRadioButtonb1,b2,b3,b4;//投注的单选按钮 ButtonGroupbg;//按钮注,使其为单选 JTextAreata;//赛马的文字显示 JLabelmoney;//投注总金额标签 TextFieldtf;//投注金额的输入窗口 inttz;//投注金额变化的变量 Stringtfget;//投注总金额的中转变量 FlowLayoutly;//布局变量publicRun(){ frame=newJFrame("赛马"); p1=newJPanel(); p2=newJPanel(); p3=newJPanel(); ly=newFlowLayout(); jb=newJButton("开始"); h1=newDraw();h2=newDraw();h3=newDraw();h4=newDraw();no=0;tz=20000;cotrol=true;h1.s="1号马";h2.s="2号马";h3.s="3号马";h4.s="4号马";b1=newJRadioButton("1号马");b2=newJRadioButton("2号马");b3=newJRadioButton("3号马");b4=newJRadioButton("4号马");bg=newButtonGroup();money=newJLabel("总金额为"+String.valueOf(tz));tf=newTextField(10);ta=newJTextArea("",5,10);//放置单选按钮bg.add(b1);bg.add(b2);bg.add(b3);bg.add(b4);//设置投注区p3.add(newJLabel("投注区"));p3.add(b1);p3.add(b2);p3.add(b3);p3.add(b4);p3.add(money);p3.add(tf);//设置P2 p2.setBackground(Color.white); ly.setHgap(30);//设置布局的水平间隙 p2.setLayout(ly); p2.add(p3); p2.add(jb); p2.add(ta); //设置赛马区 p1.setBackground(Color.white); p1.add(newJLabel("赛马区")); p1.setLayout(newGridLayout(5,1));//设置成5行1列的网格 p1.add(h1); p1.add(h2); p1.add(h3); p1.add(h4); //界面设定 frame.setLayout(newBorderLayout());frame.add("Center",p1); frame.add("South",p2); frame.setBounds(100,100,800,620); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置结束窗口tf.addActionListener(this); jb.addActionListener(this); b1.addActionListener(newRadioListener());//按钮监听器 b2.addActionListener(newRadioListener()); b3.addActionListener(newRadioListener()); b4.addActionListener(newRadioListener()); frame.setVisible(true);}publicstaticvoidmain(Stringargs[]){ newRun();}publicvoidactionPerformed(ActionEvente){if(bg.getSelection()!=null){//投注单选按钮选择确认 if(e.getActionCommand()=="开始"){ tfget=tf.getText(); try{ if(Integer.parseInt(tfget)>0&&Integer.parseInt(tfget)<=tz)//string转换成int{//投注金额确认 ta.setText("比赛开始了"+'\n'); newracing(h1,this).start(); newracing(h2,this).start(); newracing(h3,this).start(); newracing(h4,this).start(); jb.setText("重新开始");//赛马按键标签改变 b1.setEnabled(false);//赛马开始后,禁止操作 b2.setEnabled(false); b3.setEnabled(false); b4.setEnabled(false); tf.setEditable(false); jb.setEnabled(false);} else{ JOptionPane.showMessageDialog(null,"投注金额错误,请重新投注");//信息对话框} } catch(Exceptionex) { JOptionPane.showMessageDialog(null,"投注格式错误,请重新投注"); }}}else{ JOptionPane.showMessageDialog(null,"请选号确认投注");} if(e.getActionCommand()=="重新开始") {//重新开始,相应的控制重置 restar(h1,this); restar(h2,this); restar(h3,this); restar(h4,this); cotrol=true; no=0; ta.setText(""); tf.setEditable(true); b1.setEnabled(true); b2.setEnabled(true); b3.setEnabled(true); b4.setEnabled(true); jb.setText("开始"); }}publicvoidrestar(Drawh,Runb){//重新开始,重画马匹 h.x=0; h.repaint();}publicintTime(){ intoo=d1.getNow_HMS(); returnoo;}classracingextendsThread{//马运动的线程控制 Drawa; Runr; DateUtild=newDateUtil(); racing(Drawh,Runb) { this.a=h; this.r=b; } publicvoidrun(){intt;into,y;o=r.Time();while(a.x<600) { t=(int)(Math.random()*1000); a.x=a.x+20; a.repaint();//赛马的重画,使马运动 try{ Thread.sleep(t); } catch(Exceptionee){} } no=no+1; ta.append(a.s+"是第"+String.valueOf(no)+"名"+'\t'); y=d.getNow_HMS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年汽车铝合金车身维修基础考试试卷及答案
- 2026年拼音怎教师资格考试试卷及答案
- 2026年公务员招考申论人才服务乡村建设模拟试卷及答案
- 国家开放大学高等数学基础核心内容精简版
- 2026年安全员之C证(专职安全员)考试题库及参考答案(突破训练)
- 2026秋小学赣美版美术二年级上册(新教材)教学计划附教学进度表
- 2026年全国保密教育线上培训考试题及完整附答案
- 2026年初级会计考试(经济法+会计实务)真题及答案解析
- 2026年企业法律顾问劳动合同法测验卷及答案
- 2026年人教部编版四年级语文上册第一单元检测题
- 2026半导体材料行业发展分析及前景趋势与投融资策略研究报告
- 中国烟草招聘行测+专业知识考试题库(附答案)
- GA/T 1043-2025智能交通管理系统前端设备运行维护规范
- JJG 596-2026 安装式交流电能表检定规程
- 大连理工大学《光学》2024 - 2025 学年第一学期期末试卷
- 2026年上海市春季高考英语试卷试题完整版(含答案+听力MP3)
- 媒体创意与策划
- 2025年-2020中国近代史获奖教案-新版
- 《机械制图》电子教材
- 游泳馆入股合同协议书
- OTDR使用课件教学课件
评论
0/150
提交评论