Java switch 循环输入

用Java的switch解决输入一个数相应出现星期几输入o结束 而且要能循环输入

5个回答

我有个疑问,什么叫“输入一个数相应出现星期几”,比如我输入2016,这个是星期几呢?

要能循环输入,外面加个while循环就是了。

 public static void main(String[] args) {
        System.out.println("请输入一个数字:");
        Scanner input = new Scanner(System.in);
        while(input.hasNext()) {
            switch (input.nextLine()) {
                case "1":
                    System.out.println("星期一");
                    break;
                case "2":
                    System.out.println("星期二");
                    break;
                case "3":
                    System.out.println("星期三");
                    break;
                case "4":
                    System.out.println("星期四");
                    break;
                case "5":
                    System.out.println("星期五");
                    break;
                case "6":
                    System.out.println("星期六");
                    break;
                case "7":
                    System.out.println("星期日");
                    break;
                case "o":
                    System.exit(0);
                    break;
                default:
                    System.out.println("请输入其它有效数字");
                    break;
            }
        }
    }
 Scanner in =  new Scanner(System.in);
while(in.hasNext()){
String str = in.nextLine();
if (str.equals("o")) break;
int n = Integer.parse(str);
switch (n)
{
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
...
}
}

用c++给你写了一个
char i;
cin>>i;
while(1)
{
if(i=='o')
{
cout<<"退出!\n";
break;
}

    switch(i)
    {
        case '1': cout<<"星期一"; break;
        case '2': cout<<"星期二"; break;
        case '3': cout<<"星期三"; break;
        case '4': cout<<"星期四"; break;
        case '5': cout<<"星期五"; break;
        case '6': cout<<"星期六"; break;
        case '7': cout<<"星期天"; break;
         default: cout<<"输入有误!"; break;
    }
    cin>>i;
}
    这个不难,其实你自己好好想想应该就能写出来的

直接字符串拼接,都不用switch,大于7的就提示重新输入

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java switch语句break不能退出循环
外层加了一个循环为了能循环选择,但是加了之后case9 和default的break不能推出循环了,求解!!! do { int i=0; double area,s,a,b,c=0; System.out.println("输入要使用的图形 :1.圆形 2.矩形 3.三角形 9.退出"); Scanner sc =new Scanner(System.in); int x =sc.nextInt(); switch(x) { case 1: System.out.println("圆形"); System.out.println("请输入圆形的半径"); Scanner sr = new Scanner(System.in); Circle.r=sr.nextFloat(); Circle Circle=new Circle(); System.out.println("周长是 "+Circle.CircleSize()); System.out.println("面积是 "+Circle.CircleLenth()); break; case 2:System.out.println("矩形"); System.out.println("请输入长和宽"); Scanner st = new Scanner(System.in); Juxing.a=st.nextFloat(); Juxing.b=st.nextFloat(); Juxing Juxing=new Juxing(); System.out.println("周长是 "+Juxing.JuxingLenth()); System.out.println("面积是 "+Juxing.JuxingSize()); break; case 3:System.out.println("三角形"); System.out.println("请输入边长"); Scanner sc1 =new Scanner(System.in); System.out.println("输入三角形的三边"); a = sc1.nextInt(); b = sc1.nextInt(); c = sc1.nextInt(); s =(a+b+c)/2f; double S = (double) Math.sqrt(s*(s-a)*(s-b)*(s-c));// 海伦公式 if (a+b>c && b+c>a && a+c>b) { System.out.println(S); } else { System.out.println("不成立三角形"); } break; case 9 :System.out.println("程序退出"); break; default:System.out.println("输入错误"); break; } }while(true); 外层加了一个循环为了能循环选择,但是加了之后case9 和default的break不能推出循环了,求解!!!
初学者搞不定Java输入流的关闭
不懂应该在哪设置输入流的关闭,试了几个地方,但接着循环,本来要输入的就直接程序关闭报错。(也就几个地方可以放close(),可总是搞不定) package Week2; import java.util.Scanner; public class homework4_16 { public static void main(String[] args) { String s1 = "Welcome to Java"; String s2 = "Programming is fun"; String s3 = "Welcome to Java"; int i = 1; do { System.out.print("输入字母编号a-v:"); Scanner input = new Scanner(System.in); String ch = input.nextLine(); switch (ch) { case "a": System.out.println(s1 == s2); break; case "b": System.out.println(s2 == s3); break; case "c": System.out.println(s1.equals(s2)); break; case "d": System.out.println(s1.equals(s3)); break; case "e": System.out.println(s1.compareTo(s2)); break; default: continue; } System.out.print("继续请输入1,退出输入0 :"); i=input.nextInt(); while(i!=1&&i!=0) { System.out.print("请输入1或0 :"); i=input.nextInt(); } } while (i == 1); } }
java贪吃蛇怎样设置向左时不能向右
package moonsake; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class MPanel extends JPanel implements KeyListener/*实现接口KeyListener开始监听键盘输入*/ ,ActionListener{ private ImageIcon title = new ImageIcon("title.jpg"); private ImageIcon right = new ImageIcon("right.png"); private ImageIcon body = new ImageIcon("body.png"); private ImageIcon down = new ImageIcon("down.png"); private ImageIcon left = new ImageIcon("left.png"); private ImageIcon up = new ImageIcon("up.png"); private ImageIcon food = new ImageIcon("food.png"); int len = 3;//长度 int score = 0;//分数 private static int speed =150; int[] snakex = new int[750]; int[] snakey = new int[750]; String fx = "R"; //反向R, L, U, D boolean isStared = false;//暂停字体 boolean isEnd = false;//结束 boolean flag = false; Timer timer = new Timer( speed,this); int foodx; int foody; Random rand = new Random(); public MPanel(){ initsnake(); //设置焦点为自己 this.setFocusable(true); //设置自己为键盘监听对象 this.addKeyListener(this); timer.start(); foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } public void initsnake() { len = 3; snakex[0] = 100; snakey[0] = 100; snakex[1] = 75; snakey[1] = 100; snakex[2] = 50; snakey[2] = 100; fx = "R"; score = 0; } public void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.WHITE); title.paintIcon(this, g, 25, 11); g.fillRect(25,75 , 850, 600); g.drawString("长度:"+len, 750, 35); g.drawString("分数:"+score, 750, 50); //暂停语句 if(isStared == false) { g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("Press Space to Start!!!", 225, 300); } //结束语句 if(!isEnd == false) { g.setColor(Color.RED); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("END: Press Space to Restart!!!", 175, 300); } //画蛇头 switch (fx) { case "R": right.paintIcon(this, g, snakex[0], snakey[0]); break; case "L": left.paintIcon(this, g, snakex[0], snakey[0]); break; case "U": up.paintIcon(this, g, snakex[0], snakey[0]); break; case "D": down.paintIcon(this, g, snakex[0], snakey[0]); break; } //食物 food.paintIcon(this, g, foodx, foody); //循环画出蛇身体 for(int i=1; i<len; i++) { body.paintIcon(this, g, snakex[i], snakey[i]); } } @Override public void keyTyped(KeyEvent e) { } //监听按下空格键 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if(keyCode == KeyEvent.VK_SPACE) { if(isEnd) {//重新开始 isEnd = !isEnd; initsnake(); }else { isStared = !isStared; } repaint(); }else if(keyCode == KeyEvent.VK_RIGHT) { fx = "R"; }else if(keyCode == KeyEvent.VK_LEFT) { fx = "L"; }else if(keyCode == KeyEvent.VK_UP) { fx = "U"; }else if(keyCode == KeyEvent.VK_DOWN) { fx = "D"; } } @Override public void keyReleased(KeyEvent e) { } //移动蛇 @Override public void actionPerformed(ActionEvent e) { //实现空格暂停 if(isStared && !isEnd) { //画蛇身体 for(int i=len-1; i>0; i--) { snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //画蛇头 //实现头的移动 switch (fx) { case "R": snakex[0] = snakex[0] + 25; if(snakex[0] >850) isEnd = !isEnd;//当蛇到边界时,重新开始 break; case "L": snakex[0] = snakex[0] - 25; if(snakex[0] <25) isEnd = !isEnd; break; case "U": snakey[0] = snakey[0] - 25; if(snakey[0] <75) isEnd = !isEnd; break; case "D": snakey[0] = snakey[0] + 25; if(snakey[0] >650) isEnd = !isEnd; break; } //蛇吃食物长大 if(snakex[0] == foodx && snakey[0] == foody) { len++; score +=10; speed -=30; foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } //检测蛇是否重叠 for(int i=1; i<len; i++) { if(snakex[i] == snakex[0] && snakey[i] == snakey[0]) { isEnd = !isEnd; } } repaint(); } timer.start(); } }
java循环里面的scanner.sc\出现的warm警告
public class Example10 { public static void main(String[] args) { int week; //这个循环的warm怎么解决 或者 给出新的方法 //程序的运行,我用sc.close();解决不了。 do { System.out.print("请输入表示星期的数字:"); Scanner sc = new Scanner(System.in); week = sc.nextInt(); if(week<1||week>7) { System.out.println("输入的数字不符合条件,请重新输入!"); } }while(week<1||week>7); switch(week) { case 1 :{ System.out.println("星期一"); break; } case 2 :{ System.out.println("星期二"); break; } case 3 :{ System.out.println("星期三"); break; } case 4 :{ System.out.println("星期四"); break; } case 5 :{ System.out.println("星期五"); break; } case 6 :{ System.out.println("星期六"); break; } case 7 :{ System.out.println("星期七"); break; } } } }
Java 电本系统,按照电话号码查询 查不到人求解决!!!
```package test01; import java.util.Scanner; class TelBook { static boolean i = true; // 主要用于执行整个系统的循环以及可用循环时 String[] name = new String[100]; String[] bumen = new String[100]; long[] tel = new long[100]; } /** *电话本的操作类,添加,删除,修改,查询所有,名字查询,退出,操作类继承了数据类以便获取数据; */ class TellAllHandle extends TelBook { //---------------------添加操作方法----------------------------- public void add() { int numAdd=0; for (int y=0 ; y < name.length;y++) { if (name[y]!=null) { //判断是否有数据,如果有,就将本次添加的数据添加到下一个角标,添加到不同位置避免覆盖 numAdd++; } } addOrAlter(numAdd); // 调用添加操作方法 printAll(numAdd); // 调用打印信息方法 System.out.println("添加成功"); } //---------------------删除操作方法----------------------------- public void delete() { // 删除操作 int numDelete = nameRead(0,0); // 调用名字查询方法,并且将返回的角标值赋,加以判断 if (name[numDelete] != null) { System.out.println("确定要删除吗?【1(是),0(否)】"+"输入选项:"); Scanner input = new Scanner(System.in); int ifDelete = input.nextInt(); switch (ifDelete) { case 1: //如果输入为1,则将查询到的对应数据全部设置为空或0,表示为删除 System.out.println("正在删除:"+"["+name[numDelete]+"]"+"的所有信息"); name[numDelete] = null; bumen[numDelete] = null; tel[numDelete] = 0L; System.out.println("删除成功"); break; case 0: System.out.println("您未作任何删除"); break; default: System.out.println("您的输入有误,请重新选择业务"); break; } } } //---------------------修改操作方法----------------------------- public void update() { // 修改操作 int numUpdate = nameRead(0,0); if (name[numUpdate] != null) { System.out.println("请重新输入信息:"); addOrAlter(numUpdate); printAll(numUpdate); System.out.println("修改成功"); } } //---------------------查询所有操作方法----------------------------- public void read() { // 查询所有 int numR1 = 0; int numR2 = 0; while (numR1 < name.length-1) { if (name[numR1] != null) { printAll(numR1); numR2 = 0; } else { numR2 = 1; } numR1++; } if (numR2 != 0) { System.out.println("以上为所有联系人,按 1 添加更多联系人"); } } //---------------------姓名查找操作方法----------------------------- public int nameRead(int numIf1,int numIf2) { System.out.print("请输入需要查找联系人姓名:"); Scanner input = new Scanner(System.in); String inputName = input.next(); while(numIf1 < name.length-1) { //防止未找到角标越界,-1 if(inputName.equals(name[numIf1])) { //遍历数组,查找是否有和输入字符相同的元素,如果有,则打印这个对应角标的所有信息。以表示查找到了要删除的信息 printAll(numIf1); numIf2 = 0; break; //如过找到了则直接结束本次循环 } else { //如果都没有找到和输入相匹配的字符,则将值numIf2赋值为1 numIf2 = 1; } numIf1++; } if (numIf2 != 0) { //为了不重复打印此语句,在循环外判断最后numIf2的值来达到提示未查找到 System.out.println("抱歉,查询错误,无该人信息"); } return numIf1; } //---------------------部门查找操作方法----------------------------- public int bumen(int numIf3,int numIf4) { System.out.print("请输入需要查找联系人的部门:"); Scanner input = new Scanner(System.in); String inputbumen = input.next(); while(numIf3 < bumen.length-1) { if(inputbumen.equals(bumen[numIf3])) { printAll(numIf3); numIf4 = 0; break; } else {numIf4 = 1;} numIf3++; } if (numIf4 != 0) { System.out.println("抱歉,查询错误,无该人信息"); }return numIf3; } //---------------------按电话号码查找操作方法----------------------------- @SuppressWarnings({ "unlikely-arg-type", "resource" }) public int telRead(int numIf5,int numIf6) { System.out.print("请输入需要查找联系人的电话号码:"); Scanner input = new Scanner(System.in); String inputTel = input.next(); while(numIf5 < tel.length-1) { if(inputTel.equals(tel[numIf5])) { printAll(numIf5); numIf6 = 0; break; } else {numIf6 = 1;} numIf5++; } if (numIf6 != 0) { System.out.println("抱歉,查询错误,无该人信息"); }return numIf5; } //---------------------退出操作方法----------------------------- public void exit() { i = false; // 将MainInterface类mainSelect方法循环的条件i赋值为false,致循环结束,退出系统 } //----------------------添加或修改联系人输入方法-------------------- public void addOrAlter(int in) { Scanner input = new Scanner(System.in); System.out.print("姓名:"); name[in] = input.next(); System.out.print("部门:"); bumen[in] = input.next(); System.out.print("电话:"); tel[in] = input.nextLong(); } //----------------------打印联系人详情方法-------------------------- public void printAll(int p) { System.out.println("\n"+"姓名:"+name[p]+","+"部门:"+bumen[p]+","+"电话:"+tel[p]+""); } } /** *主界面所属类,完成主界面的初始化,选择业务,以及各个操作的方法调用 */ class MainInterface { //---------------------主界面加载与选择操作方法----------------------------- public void mainSelect() { TellAllHandle T = new TellAllHandle(); //加载各项操作 while(T.i){ //进行输入循环操作,利用i = true 完成,利用在解决完成一项任务后跳出,可保持系统持续运行, T.i = true; System.out.println("-----------------------------电话本管理系统-----------------------------"); System.out.println("\t"+"1.添加"+"\t"+"2.删除"+"\t"+"3.修改"+"\t"+"4.查询所有"+"\t"+"5.根据姓名查询"+"\t"+"6.根据部门查询"+"\t"+"7.根据电话号码查询"+"\t"+"8.退出"); System.out.println("-----------------------------电话本管理系统-----------------------------"); System.out.print("\n"+"【请键入1-8选择业务】:"); Scanner input = new Scanner(System.in); int mainSelect = input.nextInt(); // 加载用户选择业务输入操作 switch (mainSelect) { // 用switch语句来选择执行指定操作 case 1: System.out.println("---------------"+"添加电话本"+"---------------"); T.add(); break; case 2: System.out.println("---------------"+"删除电话本"+"---------------"); T.delete(); break; case 3: System.out.println("---------------"+"修改电话本"+"---------------"); T.update(); break; case 4: System.out.println("-------------"+"所有电话本"+"-------------"); T.read(); break; case 5: System.out.println("---------------"+"按姓名查询"+"---------------"); T.nameRead(0,0); break; case 6: System.out.println("---------------"+"按部门查询"+"---------------"); T.bumen(0,0); break; case 7: System.out.println("---------------"+"按电话号码查询"+"---------------"); T.telRead(0,0); break; case 8: System.out.println("----------------"+"退出系统"+"----------------"); T.exit(); System.out.println("\n"+"谢谢使用,已退出系统"); break; default: System.out.println("--------------"+"您的输入有误"+"--------------"); break; } } } } public class TelBookMgnage { public static void main(String[] args) { MainInterface M = new MainInterface(); //加载主界面 M.mainSelect(); //主界面选择输入操作 } } ```
while循环里使用resultset第二次循环的时候取不到结果
while循环里重复调用resultset的问题 ``` while(true) { try { //建立连接 Connection new_conn =JdbcUtil.myconn(); PreparedStatement new_ps = null; ResultSet new_rs = null; String find_stu="select * from student where id=?"; new_ps=new_conn.prepareStatement(find_stu); System.out.println(id); new_ps.setObject(1, id);//id为字段名为id的字段 new_rs=ps.executeQuery(); //while(true)的循环循环到第二次这里就进不去了,result取出的结果集为空??? while(new_rs.next()) { System.out.println("1.学生学号:"+new_rs.getInt(2)); System.out.println("2.学生姓名:"+new_rs.getString(4)); System.out.println("3.学生性别:"+new_rs.getString(5)); System.out.println("4.学生年龄:"+new_rs.getInt(6)); System.out.println("5.学生电话:"+new_rs.getLong(7)); /** * 展示该学生已选课程 */ } System.out.println("0.返回"); System.out.print("返回请输入0,修改某一项请输入修改项的序号"); int opr_num; opr_num = in.nextInt(); in.nextLine(); switch (opr_num) { case 1: Change.change_stunum(sec_num); break; case 2: Change.change_stuname(sec_num); break; case 3: Change.change_stusex(sec_num); break; case 4: Change.change_stuage(sec_num); break; case 5: Change.change_stuphone(sec_num); break; case 0: flag=false; break; default: break; } if(flag==false) break; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { } } ```
Java新手一个练习图书馆系统添加一个功能搞不出来,请大家帮帮忙
如何实现不能重复添加重复的名称 ![图片说明](https://img-ask.csdn.net/upload/201705/11/1494466508_789995.png) 试过在for循环里添加一个if判断 if(this.name[i].equals(name)){} 结果输入重复的![图片说明](https://img-ask.csdn.net/upload/201705/11/1494466592_176832.png) ![图片说明](https://img-ask.csdn.net/upload/201705/11/1494466601_570602.png) 很迷茫... 完整代码: 一 ``` package library; import java.awt.Container; import java.util.Scanner; public class Book { private String name[]; private int state[]; private int count[]; Scanner sc =new Scanner(System.in); public Book(){ name = new String[10]; state = new int[10]; count = new int[10]; name[0] = "云计算"; name[1] = "Linux"; name[2] = "Java"; state[0] = 1; state[1] = 0; state[2] = 0; count[0] = 20; count[1] = 20; count[2] = 20; } //查看 public void List(){ System.out.println("------------------------------\n图书编号 图书名称 借出次数 当前状态\n------------------------------"); for(int i=0;i<name.length;i++){ if(name[i]==null){ continue; }else{ if(this.state[i]==0){ System.out.println(" "+(i+1)+" "+name[i]+" "+""+count[i]+" "+"未借出"); }else{ System.out.println(" "+(i+1)+" "+name[i]+" "+count[i]+" "+"已借出"); } } } } //增加 public void Add(String name){ int n=0; for(int i=0;i < count.length;i++){ if(this.name[i]!=null){ n=n+1; }else if(this.name.equals(name)){ System.out.println("error"); } } this.name[n]=name; this.state[n]=0; this.count[n]=0; System.err.println("书籍《"+name+"》,增加成功"); } //删除 public int Del(int d){ if(this.name[d-1]==null){ System.err.println("数字有误,请重新输入"); return 1; }else{ System.err.println("《"+this.name[d-1]+"》,删除成功"); for (int i = d;i<name.length;i++){ name[i-1]=name[i]; state[i-1]=state[i]; count[i-1]=count[i]; } name[name.length-1]=null; return 2; } } //修改 public void Update(int u,String name){ if(this.name[u-1]!=null){ this.name[u-1]=name; System.err.println("本书已修改为《"+this.name[u-1]+"》"); }else{ System.err.println("找不到该书,已自动添加到书架"); } } //借书 public void Loan(int s){ if(this.name[s-1]==null){ System.err.println("输入有误"); }else if(this.state[s-1]==1){ System.err.println(this.name[s-1]+"已借出"); }else{ this.state[s-1]=1; this.count[s-1]=count[s-1]+1; System.err.println("请输入借书时间"); int day = sc.nextInt(); //System.err.println("借出("+day+")天,花费("+(day*2)+")元"); System.err.println(this.name[s-1]+"借出成功!\n"+"借出("+day+")天,花费("+(day*2)+")元。"); } } //还书 public void Return(int r){ if(this.name[r-1]==null){ System.err.println("数字有误,请重新输入"); }else if(this.state[r-1]==0){ System.err.println(this.name[r-1]+"未借出"); }else{ this.state[r-1]=0; System.err.println(this.name[r-1]+"归还成功"); } } } ``` 二 ``` package library; import java.util.Scanner; import org.w3c.dom.css.Counter; public class project1 { public static void main(String[] args){ Scanner sc =new Scanner(System.in); Book b = new Book(); String r=""; try { do{ System.out.println("欢迎进入图书馆系统"); System.out.println("请选择操作:"); System.out.println("--------------"); System.out.println("1.查询图书"); System.out.println("2.增加图书"); System.out.println("3.删除图书"); System.out.println("4.借出图书"); System.out.println("5.修改图书"); System.out.println("6.归还图书"); System.out.println("7.退出系统"); System.out.println("--------------"); System.out.println("请输入操作编号:"); String key=""; key = sc.next(); switch(key){ case "1": // System.err.println("------------------------------\n图书编号 图书名称 借出次数 当前状态\n------------------------------"); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "2": System.out.println("请输入书本名称:"); b.Add(sc.next()); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "3": System.out.println("请输入要删除的图书序号:"); b.List(); b.Del(sc.nextInt()); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "4": System.out.println("请输入要借出的图书序号:"); b.List(); b.Loan(sc.nextInt()); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "5": System.out.println("请输入要修改的图书序号:"); b.List(); int id = sc.nextInt(); System.out.println("请输入要修改的名称"); String name =sc.next(); b.Update(id,name); b.Add(name); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "6": System.out.println("请输入要归还的图书序号:"); b.List(); b.Return(sc.nextInt()); b.List(); System.out.println("输入7退出系统,其他任意键返回"); r=sc.next(); break; case "7": System.out.println("程序运行结束"); return; } }while (!r.equals("7")); System.out.println("程序运行结束"); } catch (Exception e) { // TODO: handle exception System.out.println("输入错误 , 请重新运行程序!"); } } } ```
java Socket 在客户端断开之后才可以接收到客户端发送的消息!
``` //客户端 public class Test { private static boolean is = true; public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("127.0.0.1", 6677); System.out.println("链接成功"); Scanner scanner = new Scanner(System.in); while (is) { System.out.println("请输入!!!"); int n = scanner.nextInt(); switch (n) { case 1: OutputStream os = socket.getOutputStream(); os.write("hello world".getBytes()); os.flush(); // os.close(); // socket.close(); // IoUtil.IoClose(os); System.out.println("发送成功"); break; case 2: System.out.println("循环关闭"); is = false; break; default: is = false; System.out.println("输入错误---循环关闭"); break; } } } } ``` ``` //服务器端 太多了 就贴一部分 @Override public void run() { MessageThread messageThread = null; InputStream iss = null; InputStreamReader isr = null; BufferedReader br = null; while (is) { try { // 监听 Socket socket = serverSocket.accept(); System.out.println("链接成功"); iss = socket.getInputStream(); isr = new InputStreamReader(iss); br = new BufferedReader(isr); String len; StringBuffer sb = new StringBuffer(); while ((len = br.readLine()) != null) { sb.append(len); } System.out.println(sb.toString()); // iss.close(); // IoUtil.IoClose(br, isr, iss); SocketMap.put(sb.toString(), socket); /** * 开启接受消息的线程 */ messageThread = new MessageThread(socket); messageThread.start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); messageThread.setFlag(false); } } ``` 大致代码就这些 问题出在 socket 可以链接成功 但是 客户端发送的消息要等 客户端断开链接之后才能接收到 或者 关闭客户端的输出流也可以! C#为客户端的时候也一样!
在学习java中遇到的一些问题不是很理解,希望有人能帮给我解答一下
for循环我知道怎么从1加到9,但是不知道怎么从9减到1,就是说我不会用i--;。还有boolean类型我不是很理解他有什么用,该什么时候用。 还有就是带参方法了,怎么理解 例如: 类: package daican.net; public class aaa { public int name=9; public int pwd=0; int money=10000; public int showqu(int qu) { if(money<qu) { System.out.println("余额不足"); } else { money=money-qu; System.out.print("本次取款为:"+qu+"\t您的余额为:"+money); } return money; } public String showcun(int cun) { money=money+cun; return "存储成功"; } } 测试类: package pin.com; import java.util.*; import daican.net.aaa; public class daican { public static void main(String[] args) { Scanner input=new Scanner(System.in); aaa icbc=new aaa(); System.out.println("********************************"); System.out.println("*********建设银行欢迎您**********"); System.out.println("********************************"); System.out.println("**请选择操作1.存钱 2.取钱 3.退出**"); int yi=input.nextInt(); switch (yi) { case 1: System.out.println("请放入纸币"); int er=input.nextInt(); System.out.println(icbc.showcun(er)); break; case 2: for (int i = 0; i <5; i++) { System.out.println("请输入您的卡号"); int ha=input.nextInt(); System.out.println("请输入密码"); int haa=input.nextInt(); if(icbc.name==ha&&icbc.pwd==haa) { System.out.println("请输入金额"); int quqian=input.nextInt(); icbc.showqu(quqian); break; } else if(icbc.name!=ha&&icbc.pwd!=haa) { System.out.println("输入错误,请重新输入"); System.out.println("---------------------------"); i++; } if(i==5) { System.out.println("三次输错误,您的卡已被锁定"); } } break; case 3: System.out.println("请取卡……"); break; default: break; } } } 不理解类中方法中的 public String showcun(int cun)跟测试类中的int er有没有关系 System.out.println("请放入纸币"); int er=input.nextInt(); System.out.println(icbc.showcun(er)); 方法中的参数是不是只是一个类型,表示在main方法中要用到这个参数还是它有什么含义,好像很简单的样子,我凌乱了……,求解
java实现串口通信报错,求大神帮忙
我准备实现从串口接收数据(要求接收的数据长时间持续传输,且传输较快),将得到的数据实时的显示在多个已经定义好的JFreechart中,现已定义一个JFreechart的数组,目前设计的是接收一组5个字节的数据,每接收五个字节,就把这五个数字显示在一个chart中,从chart1到chart7,一直循环,代码如下 ``` package com.control; import gnu.io.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.Enumeration; import java.util.TooManyListenersException; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import com.view.dataplay; import com.view.JFSwingDynamicChart; import javax.swing.*; public class ContinueRead extends Thread implements SerialPortEventListener { // SerialPortEventListener // 监听器,我的理解是独立开辟一个线程监听串口数据 static CommPortIdentifier portId; // 串口通信管理类 static Enumeration<?> portList; // 有效连接上的端口的枚举 InputStream inputStream; // 从串口来的输入流 static OutputStream outputStream;// 向串口输出的流 JFSwingDynamicChart Jchart[]; byte[] readBuffer; JFrame frame; int numBytes = -1; double b[]; // static SerialPort serialPort; // 串口的引用 // 堵塞队列用来存放读到的数据 private BlockingQueue<String> msgQueue = new LinkedBlockingQueue<String>(); int time = 0; //做测试 设置time为0-7 之中 随机输出数字 @Override /** * SerialPort EventListene 的方法,持续监听端口上是否有数据流 */ public void serialEvent(SerialPortEvent event) {// switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:// 当有可用数据时读取数据 readBuffer = new byte[20]; try { numBytes = -1; b =new double[20]; while (inputStream.available() > 0) { numBytes = inputStream.read(readBuffer); if(numBytes>0) { //输出得到的数据 //System.out.println(numBytes); for(int i=0;i<numBytes;i++) { b[i] = (double)(readBuffer[i] -= 48); System.out.println((double) (readBuffer[i])); //转换成double } /* * ceshi * */ //传到JSchart中 (new Thread(this)).start(); /* frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent windowevent) { System.exit(0); } });*/ time++; time=time%8; /* * * */ readBuffer = new byte[20]; } /* if (numBytes > 0) { msgQueue.add(new Date() + "真实收到的数据为:-----" + new String(readBuffer)); readBuffer = new byte[20];// 重新构造缓冲对象,否则有可能会影响接下来接收的数据 } else { msgQueue.add("额------没有读到数据"); }*/ } } catch (IOException e) { } break; } } /** * * 通过程序打开COM4串口,设置监听器以及相关的参数 * * @return 返回1 表示端口打开成功,返回 0表示端口打开失败 */ public int startComPort() { // 通过串口通信管理类获得当前连接上的串口列表 portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { // 获取相应串口对象 portId = (CommPortIdentifier) portList.nextElement(); System.out.println("设备类型:--->" + portId.getPortType()); System.out.println("设备名称:---->" + portId.getName()); // System.out.println("12"); // 判断端口类型是否为串口 if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 判断如果COM4串口存在,就打开该串口 if (portId.getName().equals("COM4")) { try { // 打开串口名字为COM_4(名字任意),延迟为2毫秒 serialPort = (SerialPort) portId.open("COM_4", 2000); } catch (PortInUseException e) { e.printStackTrace(); return 0; } // 设置当前串口的输入输出流 try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); return 0; } // 给当前串口添加一个监听器 try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { e.printStackTrace(); return 0; } // 设置监听器生效,即:当有数据时通知 serialPort.notifyOnDataAvailable(true); // 设置串口的一些读写参数 try { // 比特率、数据位、停止位、奇偶校验位 serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); return 0; } return 1; } } } return 0; } @Override public void run() { // TODO Auto-generated method stub /*try { System.out.println("--------------任务处理线程运行了--------------"); while (true) { // 如果堵塞队列中存在数据就将其输出 if (msgQueue.size() > 0) { System.out.println(msgQueue.take()); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ for(int i=0;i<numBytes;i++) try { Jchart[time].setNumber(b[i]); Thread.sleep(1); } catch (InterruptedException e) { } } /* * 串口配置初始化 * */ public void init(){ startComPort(); } /* public static void main(String[] args) { ContinueRead cRead = new ContinueRead(); int i = cRead.startComPort(); if (i == 1) { // 启动线程来处理收到的数据 cRead.start(); try { String st = "哈哈----你好"; System.out.println("发出字节数:" + st.getBytes("gbk").length); outputStream.write(st.getBytes("gbk"), 0, st.getBytes("gbk").length); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { return; } }*/ public void setJchart(JFSwingDynamicChart[] j){ Jchart = j; } public void setFrame(JFrame f){ frame = f; } } ``` 运行的时候出现报错 Exception in thread "Thread-22" java.lang.NullPointerException at java.util.Collections.indexedBinarySearch(Collections.java:226) at java.util.Collections.binarySearch(Collections.java:213) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:916) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:887) at org.jfree.data.time.TimeSeries.addOrUpdate(TimeSeries.java:871) at com.view.JFSwingDynamicChart.setNumber(JFSwingDynamicChart.java:135) at com.control.ContinueRead.run(ContinueRead.java:184) at java.lang.Thread.run(Thread.java:745) 求大神解答!
JAVA小白求救:坦克大战-多关卡咋做?没思路。。。
坦克大战-多关卡咋做: 自己代码如下: //坦克大战:-换关卡,-IO声音流,把爆炸换成外面的图片,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } } //坦克大战: 不会做多关卡??!! //IO声音流没做,IO流存储也有点问题,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克, import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.util.*; import java.io.*; public class Tank1 extends JFrame implements ActionListener{ MyPanel mp=null; StartPanel gkmp=null; //Record record=null; JMenuBar cd=null;//??不熟 JMenu cd1=null;//??不熟 JMenu cd2=null; JMenuItem cd1xl1=null;//菜单栏1系列的1 JMenuItem cd1xl2=null;//菜单栏1系列的2 JMenuItem cd1xl3=null;//菜单栏1系列的1 JMenuItem cd1xl4=null;//菜单栏1系列的2 JMenuItem cd2xl1=null;//菜单栏2系列的1 JLabel imageJLabel=null; String newGame="newGame";//? //Image tp1=null; public static void main(String[] args) { Tank1 t1=new Tank1(); } public Tank1(){ gkmp=new StartPanel(); mp=new MyPanel(newGame);//?? Record record=new Record();//创建一个记录对象 Thread t=new Thread(gkmp); t.start(); cd=new JMenuBar();//菜单栏 不熟 cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 cd1.setMnemonic('G');//快界键 cd2=new JMenu("设置(Z)"); cd2.setMnemonic('Z'); cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl cd1xl1.setMnemonic('N'); cd1xl1.addActionListener(this);//加组件监听 cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没? cd1.add(cd1xl1); cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl cd1xl2.setMnemonic('H'); cd1xl2.addActionListener(this);//加组件监听 cd1xl2.setActionCommand("goonGame");//设置键值 cd1.add(cd1xl2); cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl cd1xl3.setMnemonic('S'); cd1xl3.addActionListener(this);//加组件监听 cd1xl3.setActionCommand("saveOut");//设置键值 cd1.add(cd1xl3); cd1xl4=new JMenuItem("退出(Q)"); cd1xl4.setMnemonic('Q'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("exit");//设置键值 cd1.add(cd1xl4); cd.add(cd1);//给菜单栏 cd 添加菜单 cd1 cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果? cd1xl4.setMnemonic('F'); cd1xl4.addActionListener(this);//加组件监听 cd1xl4.setActionCommand("FSpeed");//设置键值 cd2.add(cd2xl1); cd.add(cd2); ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG"); JLabel imageJLabel = new JLabel(img); gkmp.add(imageJLabel); this.add(gkmp); this.setJMenuBar(cd); this.setTitle("坦克大战"); ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径 this.setIconImage(tp1.getImage()); this.setSize(700,620); this.setLocation(300,80); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//可见 this.setResizable(false);//可调 // this.setResizable(true); } public void actionPerformed(ActionEvent e){ //boolean flag=true; if(e.getActionCommand().equals("newGame")) { this.remove(gkmp);//取消界面 gkmp if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("newGame"); } this.add(mp); this.addKeyListener(mp); Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程 t.start();//叫醒线程 this.setVisible(true);//因为默认的是不可见,必须写这个!! Record.bcjl();//???? }else if(e.getActionCommand().equals("saveOut")) { Record record0=new Record(); // record0.setDtk(mp.dtk); record0.cunpan();///?????? System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("exit")) { Record.bcjl(); System.exit(0);//游戏退出 }else if(e.getActionCommand().equals("goonGame")){ this.remove(gkmp); if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量 { this.remove(mp); mp=new MyPanel("goonGame"); } Thread t=new Thread(mp); t.start(); this.add(mp); this.addKeyListener(mp); this.setVisible(true); } } class StartPanel extends JPanel implements Runnable //开始界面类 { int time=0; public void paint(Graphics g){ super.paint(g); // g.fillRect(0, 0, 600, 500);//设置画布 g.setColor(Color.black);//设置颜色 Color mycolor1=new Color(250,50,0);//自定义红色 g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//? g.drawString("坦克大战",190 , 460);//绘字符串 g.setColor(Color.black);//设置颜色 g.setFont(new Font("黑体",1,14));//设置字体 g.drawString("李晋祥",648 , 552);//绘字符串 if(time%2==0) { g.setColor(Color.white);//设置颜色 g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("准备战斗",270 , 345);//绘字符串 } } StartPanel(){ } public void run(){ while(true){ try{ Thread.sleep(400); }catch(Exception e){} time++; this.repaint(); } } } class MyPanel extends JPanel implements KeyListener,Runnable { //Vector<MyTank> mts=new Vector<MyTank>();//建立一个我的坦克集合类可以出无限个坦克 MyTank mt=null; MyTank mt0=null; MyTank mt01=null; MyTank mt02=null; Vector<DiTank> dtk=new Vector<DiTank>();//建立一个敌坦克集合类 Props props=null; Vector<Baozha> bzjh=new Vector<Baozha>();//创建一个爆炸类的集合 Vector<Weizhi> wzjh=new Vector<Weizhi>();//建立一个位置集合类,为啥建立这集合类 int tksl=3;//坦克数量 int a=122; int b=455; int n=10; int myzdNum=4;//? int propsSort=5; int time=0; boolean flag=true;//标记是不是已经创建过MyPanel类 boolean b1=false; int x=1;//总关卡数? int rocket=1;//没用? int huopao=0;//? Color mycolor1=new Color(250,50,0);//自定义红色 Color mycolor2=new Color(0,250,50);//自定义绿色 Color mycolor3=new Color(0,50,250);//自定义兰色 Color mycolor11=new Color(130,200,0);//自定义土黄 Color mycolor31=new Color(0,100,200);//自定义兰色 Color mycolor21=new Color(0,250,0);//自定义绿色 JLabel imageJLabel0=null; JLabel imageJLabel1=null; ImageIcon img0=null;//? ImageIcon img1=null;//? public MyPanel(String ss) { ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg"); JLabel imageJLabel0 = new JLabel(img0); this.add(imageJLabel0); Record.dqjl();//? mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组 mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组 mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组 mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组 props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数? if(ss.equals("newGame")){ // record=new Record(); for(int i=0;i<tksl;i++){ DiTank dt=new DiTank((i)*a,b);//添加出场敌坦 // dt.dtkxl(dtk);///???是不是敌人坦克血量 dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } }else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题 wzjh=Record.dupan(); for(int i=0;i<wzjh.size();i++){ Weizhi wz=wzjh.get(i); DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦 dt.setFangxiang(wz.fangxiang); // dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着 // dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用 Thread t2=new Thread(dt); t2.start(); Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗? Thread t3=new Thread(zd);//? t3.start(); dtk.add(dt); } } flag=false;//MyPanel类的mp创建过一次就标记为假 // this.repaint(); // Record.next(); // if(Record.next()%2!=0){ // Record.reMtNum();//需要吗? // Record.reDtNum();//需要吗? // Record.reAddMtNum(); // } } public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数 { g.setColor(Color.cyan); this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this this.drawTank(570,150,g,0,1); this.drawTank(500,70,g,0,1); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20));//??换换字体效果 g.drawString(Record.getDtNum()+"",600,170); if((Record.getMtNum()+Record.getAddMtNum())>=0){ g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);// }else{ g.drawString((Record.getAddMtNum())+"",530,170); } g.setColor(Color.blue); g.setFont(new Font("方正小标宋",1,17)); g.drawString("干掉的坦克总数:",510,40); g.setColor(Color.black); g.setFont(new Font("仿宋",2,20)); g.drawString(Record.getSumDtNum()+"",530,90); g.setColor(Color.MAGENTA);//设置颜色 g.setFont(new Font("隶书",0,20));//设置字体 g.drawString("第"+x+"关",500 , 200);//绘字符串 } public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示 super.paint(g); // g.fillRect(0,0,400,300);//做个背景画布,默认黑色 this.outNum(g);//调用显示数量的函数 g.setColor(Color.red);//设置颜色 g.fillRect(530, 210, 30, 20); g.setColor(Color.black);//设置颜色 g.drawLine(530, 210, 530, 320); g.setColor(mycolor11);//设置颜色 if(mt.live==true){ this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0); } if(mt0.live==true){ this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2); } if(mt01.live==true){ this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2); } if(mt02.live==true){ this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2); } if(mt.getLive()==false){ g.setColor(mycolor11);//设置颜色 g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended g.drawString("game over...",200 , 220);//绘字符串 this.repaint(); } if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){ // if(time%2==0) // { g.setColor(Color.blue);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("你行不行?",310 , 265);//绘字符串 // } } if(Record.getDtNum()==0){ g.setColor(Color.red);//设置颜色 g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended g.drawString("过关!",300 , 265);//绘字符串 } for(int i=0;i<dtk.size();i++)//画敌人坦克asd { DiTank dt=dtk.get(i); if(dt.live==true){ this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用 } } for(int i=0;i<mt.aa.size();i++)//画我的子弹 { Zidan zd=mt.aa.get(i); if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件 { //g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈 g.setColor(Color.black);//子弹颜色设置为白色 g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false) { mt.aa.remove(zd); } } //this.repaint();//? for(int i=0;i<dtk.size();i++)//画敌人的子弹 { DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++) { Zidan zd=dt.dzd.get(j); if(zd!=null&&dtk.get(i).live==true) { g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好? g.fillOval(zd.x+1,zd.y+1, 4,4); } if(zd.live==false)//删除生命为假的敌人子弹???? { dt.dzd.remove(zd); } } } for(int i=0;i<bzjh.size();i++) //画爆炸 { Baozha bz=bzjh.get(i); if(bzjh.get(i).livetime>140){ g.setColor(Color.red); g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子 //g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点 }else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){ g.setColor(Color.orange); g.fillOval(bz.x+4, bz.y+9, 12,12 ); }else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){ g.setColor(Color.yellow); g.fillOval(bz.x+7, bz.y+11,5,5 ); }else{ g.setColor(Color.pink); g.fillOval(bz.x+10, bz.y+13,2,2 ); } bz.ltjs(); //生存时间减少函数 if(bz.livetime==0){ bzjh.remove(bz); } } // if(props.live==true){//画道具 this.drawProps(props.getX(),props.getY(),g,props.getleixing()); } //} this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动 } public void keyPressed(KeyEvent e)//键盘输入事件 { if(mt.getLive()==true){ if(e.getKeyCode()==KeyEvent.VK_W){ this.mt.setFangxiang(0); this.mt.xiangshang(); }else if(e.getKeyCode()==KeyEvent.VK_S){ this.mt.setFangxiang(1); this.mt.xiangxia(); }else if(e.getKeyCode()==KeyEvent.VK_A){ this.mt.setFangxiang(2); this.mt.xiangzuo(); }else if(e.getKeyCode()==KeyEvent.VK_D){ this.mt.setFangxiang(3); this.mt.xiangyou(); } if(e.getKeyCode()==KeyEvent.VK_J) { if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发 { this.mt.fszd();//调用发射子弹函数 } } } } public void crash(){ } public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形) { boolean b2=false; switch(props.leixing){ case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.sudu=20; b2=true; } break; case 1://效果回到出生地 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; mt.setX(630); mt.setY(280); b2=true; } break; case 2://提高我可以发射的子弹数目 //mt.fangxiang 0\1\2\3 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; this.myzdNum=30; this.huopao=1; this.n=4; b2=true; } break; case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!! if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; for(int i=0;i<dtk.size();i++){ if(dtk.get(i).live==true){ dtk.get(i).live=false; Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum } } b1=true; b2=true; } break; case 4://吃道具加命 if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){ props.live=false; Record.setAddMtNum(); b2=true; // System.out.println("吃道具加命程序,正常运行"); } break; } return b2; } // addMyTank++; //MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象 // public void setAddMytank(){ // addMyTank++; // }; // public static int getAddMytank(){ // return addMyTank; // }; public void run() //我的画板的 线程函数 { while(true){ try{ Thread.sleep(50);// }catch(Exception e){} for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程 { Zidan myzd=mt.aa.get(i); if(myzd.live){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j); // Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建// ||(b1==true&&Record.getDtNum()>0) if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中 { if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生 DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450)); Thread t2=new Thread(dt0); t2.start(); Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang); Thread t3=new Thread(zd0); t3.start(); dt0.dzd.add(zd0); dtk.add(dt0); } } } } } if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生, for(int i=0;i<tksl;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-1))&&(b1==true)){ for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); } b1=false; } if((Record.getDtNum()==(tksl-2))&&(b1==true)){ // for(int i=0;i<tksl-1;i++){ DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450)); Thread t6=new Thread(dt1); t6.start(); Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang); Thread t7=new Thread(zd1); t7.start(); dt1.dzd.add(zd1); dtk.add(dt1); b1=false; } for(int j=0;j<dtk.size();j++)//敌人的子弹击中我的坦克的线程 { DiTank dt=dtk.get(j);//取出所有敌方坦克 for(int i=0;i<dt.dzd.size();i++) { Zidan zd=dt.dzd.get(i);//? if(zd.live) { if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数 } } } } if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props props.live=true; // props.leixing=2; props.leixing=(int)(Math.random()*propsSort); props.x=(int)(Math.random()*370); props.y=(int)(Math.random()*270); props.livetime=100;//道具生存期 } if(props.livetime>0){//道具生存期变化 props.livetime--; }else{ props.live=false; } if(mt.live==true&&props.live==true){//调用 吃道具 方法 this.addprops(props,mt); } time++; // if(SaveData.getSumDtNum()%20==0){ // Record.next(); // } this.repaint();//线程运行中重绘?? } } public void jzwf()//敌人子弹集中我方坦克的方法 { for(int i=0;i<this.dtk.size();i++){ DiTank dt=dtk.get(i); for(int j=0;j<dt.dzd.size();j++){ Zidan zd=dt.dzd.get(j); this.jzsf(zd, mt); } } } public void jzdf() //我的子弹击中坦克的方法 { for(int i=0;i<mt.aa.size();i++){ Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹 if(zd.live==true){ for(int j=0;j<dtk.size();j++){ DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克 if(dt.live){ this.jzsf(zd,dt); // levelDtNum--; } } } this.repaint(); } } public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法 { boolean b2=false; switch(tk.fangxiang) { case 0: case 1: if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断? { if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum(); Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(140); mt.setY(232); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; case 2: case 3: if(zd.x>tk.x&&zd.x<tk.x+30&&zd.y>tk.y&&zd.y<tk.y+20){ if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例 Record.setDtNum();//每次敌人坦克数量-1 Record.setSumDtNum(); // Record.setAddMtNum(); tk.live=false; b2=true; }else{ // System.out.println("Record.getMtNum()="+Record.getMtNum()); Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug if(Record.getMtNum()+1<=0){ Record.lowAddMtNum(); } // System.out.println("Record.getMtNum()="+Record.getMtNum()); // System.out.println("Record.AddMtNum()="+Record.getAddMtNum()); if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决 mt.setX(550); mt.setY(270); } if(Record.getMtNum()+Record.getAddMtNum()<=0){ tk.live=false; } } zd.live=false; Baozha bz=new Baozha(tk.x,tk.y); bzjh.add(bz); } break; } return b2; } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数 { int m=10; //double n=1; switch(leixing)//不同阵营坦克 { case 0://我的坦克 g.setColor(Color.yellow);// 我的坦克颜色 黄色 // g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao); m=11; break; case 1://敌人的坦克 g.setColor(mycolor3);//敌人坦克颜色 蓝色 // m=15; break; case 2://玩家2的坦克 g.setColor(mycolor1);//敌人坦克颜色 绿色 break; } switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换 { case 0://上 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y-5,x+10,(y+10)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 1://下 g.fill3DRect(x,y,5,30,true); g.fill3DRect(x+15,y,5,30,true); g.fill3DRect(x+5,y+5,10,20,true); g.drawLine(x+10,y+10,x+10,(y+35)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 2://左 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x-10)+n-m,y+15,(x+10),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; case 3://右 g.fill3DRect(x-5,y+5,30,5,true); g.fill3DRect(x-5,y+20,30,5,true); g.fill3DRect(x,y+10,20,10,true); g.drawLine((x+10)-n+m,y+15,(x+30),(y+15)); g.setColor(Color.black); g.fillOval(x+5,y+10,10,10); break; } } public void drawProps(int x,int y,Graphics g,int leixing)//画道具 { if(time%8==0){ switch(leixing) { case 0://画车轮对应坦克加速 g.setColor(Color.white); g.fillOval(x, y, 21, 21); g.setColor(Color.black); g.fillOval(x+2,y+2,16,16); g.setColor(Color.white); g.drawOval(x+2,y+2,16,16); g.drawLine(x+2,y+10,x+18,y+10); g.drawLine(x+10,y+2,x+10,y+18); g.drawLine(x+16,y+4,x+4,y+16); g.drawLine(x+4,y+4,x+16,y+16); break; case 1://画回出生地道具图标 g.setColor(Color.white); g.drawRoundRect(x, y, 20, 20, 5, 5); g.setColor(mycolor3); g.fillRoundRect(x+5, y+5, 10, 10, 5, 5); break; case 2://画增加子弹数目道具//? g.setColor(mycolor2); g.fill3DRect(x-15,y+8,30,5,false); g.fill3DRect(x-15,y+6,10,10,true); g.fillOval(x+15,y+7,7,7); break; case 3://画炸弹 g.setColor(mycolor2); g.fillRect(x, y, 21, 21); g.setColor(Color.black); g.fillRect(x+8,y+6,6,2); g.fillOval(x+3,y+7,14,14); g.drawLine(x+11, y+3, x+11, y+6); g.setColor(Color.white); g.drawLine(x+11, y+15, x+8, y+14); break; case 4://画小坦克道具 g.setColor(Color.yellow); g.fill3DRect(x,y,20,3,true); g.fill3DRect(x,y+10,20,3,true); g.fill3DRect(x+3,y+3,14,7,false); g.fillOval(x+6,y+3,7,7); g.drawLine(x-7,y+6,x+7,y+6); break; } } } } }
我这个只能捕获InputMismatchException异常,要想抛出该异常怎么写。
package lwz; import java.util.*; public class Employment { public static void main(String[] args) throws java.util.InputMismatchException{ // 创建EmpManage对象 EmpManage em = new EmpManage(); Scanner sr = new Scanner(System.in); // 作出一个菜单 while (true) { System.out.println("公司职员薪水管理系统"); System.out.println("1、录入新员工"); System.out.println("2、根据工号查询信息"); System.out.println("3、查询所有员工信息"); System.out.println("4、通过工号修改员工薪水"); System.out.println("5、删除员工信息"); System.out.println("6、按薪水高低排序"); System.out.println("7、计算平均工资及最高(低)工资"); System.out.println("0、退出系统"); System.out.print("请输入对应的数字进行操作:"); int sel = sr.nextInt(); switch (sel) { case 1: System.out.println("请录入新员工的信息"); try { System.out.print("工号(输入-1返回到上一级菜单中):"); String empNo = sr.next(); if (empNo.equals("-1")) { break; } System.out.print("姓名:"); String name = sr.next(); System.out.print("工资:"); float sal = sr.nextFloat(); // 构建emp对象 Emp emp = new Emp(empNo, name, sal); // 将empNo,name,sal的值传给构造函数Emp em.addEmp(emp); System.out.println("创建新员工" + name + "成功!"); } catch (InputMismatchException e) { System.out.println("请输入正确格式的工号、姓名和工资" + "\n工号必须为字符串形式" + "\n姓名必须为字符串形式" + "\n工资必须为数字类型"); } break; case 2: System.out.println("请录入员工工号:"); String empNo1 = sr.next(); em.showInfo(empNo1); break; case 3: System.out.println("公司所有员工信息如下:"); em.AllInfo(); break; case 4: System.out.println("请输入工号:"); String empNo2 = sr.next(); System.out.println("将工资修改为:"); float newSal = sr.nextFloat(); em.updateSal(empNo2, newSal); break; case 5: System.out.println("请输入要删除人员的工号:"); String empNo3 = sr.next(); em.delEmp(empNo3); break; case 6: System.out.println("已按薪资高低进行排序如下:"); em.SortSal(); break; case 7: System.out.println("显示平均工资及最高、最低工资人员信息如下:"); em.Average(); break; case 0: System.out.println("已正常退出!"); System.exit(0); break; default: System.out.println("输入错误,请重新输入!"); } } } } // 创建员工管理类 class EmpManage { private ArrayList<Emp> al = new ArrayList<Emp>(); // 加入员工 public void addEmp(Emp emp) {// 传入员工信息 al.add(emp); } // 根据员工工号显示员工的相关信息 public void showInfo(String empNo) {// 将工号传入showInfo方法中 // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = al.get(i); // 比较编号 if (emp.getEmpNo().equals(empNo)) {// 由于empNo类型为String,所以要使用equals进行内容比较,不可以使用==地址比较 System.out.println("找到该员工,他的信息是:"); System.out.println("工号:" + empNo + "\t姓号:" + emp.getName() + "\t薪水:" + emp.getSal()); } } System.out.println("工号不存在或者无此人,无法进行相关操作!"); } // 显示所有员工信息 public void AllInfo() { for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); // 使用compareTo方法进行Sting类型值比较 if (emp1.getEmpNo().compareTo(emp2.getEmpNo()) > 0) { al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (Emp emp : al) { System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName() + "\t工资:" + emp.getSal()); } } // 修改员工的薪水 public void updateSal(String empNo, float newSal) { // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = (Emp) al.get(i); if (emp.getEmpNo().equals(empNo)) { // 修改新水 emp.setSal(newSal);// setSal会将修改的薪水传和ArrayList中 System.out.println("已将" + emp.getName() + "调整为:" + newSal); } } System.out.println("工号不存在或无此人,无法进行相应操作!"); } // 员工离职删除指定员工 public void delEmp(String empNo) { // 遍历整个ArrayList for (int i = 0; i < al.size(); i++) { // 取出Emp对象 Emp emp = (Emp) al.get(i); if (emp.getEmpNo().equals(empNo)) { // 按工号删除 al.remove(i);// 也可以使用al.remove(emp); System.out.println("已将" + emp.getName() + "信息清除!"); } } } // 按薪水高低排序 public void SortSal() { for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); if (emp1.getSal() < emp2.getSal()) {// 比较sal的值大小 al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (Emp emp : al) { System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName() + "\t工资:" + emp.getSal()); } } // 计算平均工资并找出最高工资和最低工资的员工 public void Average() { float sum = 0f, ave = 0f; // 遍历整个ArrayList for (int k = 0; k < al.size(); k++) { // 取出Emp对象 Emp emp = (Emp) al.get(k); sum = emp.getSal() + sum; } ave = sum / al.size(); System.out.println("共有员工" + al.size() + "人\t总工资为:" + sum + "\t平均工资为:" + ave); // 找出最高工资与最低式资 for (int i = 0; i < al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环 for (int j = 1; j < al.size() - i; j++) {// 将al中的值进行循环比较 Emp emp1 = (Emp) al.get(j - 1); Emp emp2 = (Emp) al.get(j); if (emp1.getSal() < emp2.getSal()) {// 比较sal的值大小 al.set(j, emp1);// 交换值并重写入al中 al.set(j - 1, emp2);// 交换值并重写入al中 } } } for (int i = 0; i < al.size(); i++) { if (i == 0) { Emp emp = (Emp) al.get(i); System.out.println("工资最高的人员是:" + emp.getName() + "\t薪水是:" + emp.getSal()); } else if (i == al.size() - 1) { Emp emp = (Emp) al.get(i); System.out.println("工资最低的人员是:" + emp.getName() + "\t薪水是:" + emp.getSal()); } } } } // 创建员工类 class Emp { // 定义成员变量工号、姓名、薪水 public String empNo; public String name; public float sal; // 创建构造函数,初始化成员变量 public Emp(String empNo, String name, float sal) { this.empNo = empNo; this.name = name; this.sal = sal; } // 使用set、get方法进行数据传递 public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } }
菜鸟请教各路大神这个后续的怎么写,能否给个思路?
import java.util.Scanner; public class 升级购物结算_待处理 { public static void main(String[] args) { System.out.println("***********************************************"); System.out.println("请选择购买的商品编号:"); String ts = "T恤"; String wqx = "网球鞋"; String wqp = "网球拍"; System.out.println("1." + ts + "2." + wqx + "3." + wqp); System.out.println("***********************************************"); Scanner input = new Scanner(System.in); int tsprice = 245; int wqxprice = 320; int wqpprice = 280; int tssum; int wqxsum; int wqpsum; String answer = "y"; while ("y".equals(answer)) { System.out.println("请输入商品编号:"); int number = input.nextInt(); System.out.println("请输入购买数量"); int sum = input.nextInt(); tssum = sum * tsprice; wqxsum = sum * wqxprice; wqpsum = sum * wqpprice; switch (number) { case 1: System.out.print(ts + "$" + tsprice + "\t"); System.out.print("数量" + sum + "\t"); System.out.println("合计$" + tssum); break; case 2: System.out.print(wqx + "$" + wqxprice + "\t"); System.out.print("数量" + sum + "\t"); System.out.println("合计$" + wqxsum); break; case 3: System.out.print(wqp + "$" + wqpprice + "\t"); System.out.print("数量" + sum + "\t"); System.out.println("合计$" + wqpsum); break; } System.out.println("是否继续(y/n)?"); answer = input.next(); } double zk = 0.8; System.out.println("折扣:" + zk); System.out.println("应付金额:"); System.out.println("实付金额:"); int money = input.nextInt(); System.out.println("找钱:"); } } 就是怎么根据while循环里输入的内容进行结算? 比如,在循环里面已经计算好了,不继续的时候这时跳出循环,从而进行结算.
ListView列表文字无故变灰
我参考了官方的代码listview Adapter用法,但是移植过来listview文字就变成灰了,并且能选中 下面贴出代码。已经DEBUG 子线程返回data没问题。 这是运行图片。 ![图片说明](https://img-ask.csdn.net/upload/201503/20/1426828176_449082.png) ``` package com.wastrel.activity; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import com.wastrel.provider.Tabletbl; import com.wastrel.provider.TabletblDAO; import com.wastrel.util.HttpUtil; import android.app.ListActivity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ChaZhuoActivity extends ListActivity { private Handler myhander = null; // private ListView tablelist = null; // private TextView tableid = null; private List<Tabletbl> data = new ArrayList<Tabletbl>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO 自动生成的方法存根 super.onCreate(savedInstanceState); // setContentView(R.layout.activity_chazhuo); // tablelist = (ListView) findViewById(R.id.tablelist); // tableid = (TextView) findViewById(R.id.tablenum); myhander = new Handler() { @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { // TODO 自动生成的方法存根 switch (msg.what) { case 1: data = (List<Tabletbl>) msg.obj; TableListAdapter tblAdapter = new TableListAdapter(data, getApplicationContext()); setListAdapter(tblAdapter); break; default: break; } } }; new Thread(updatetable).start(); } Runnable updatetable = new Runnable() { @Override public void run() { // TODO 自动生成的方法存根 String urlStr = HttpUtil.Base_URL + "servlet/UpdateTableServlet"; try { // 实例化URL对象 URL url = new URL(urlStr); // 打开连接 URLConnection conn = url.openConnection(); // 获得输入流 InputStream in = conn.getInputStream(); // 实例化DocumentBuilderFactory DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); // 实例化DocumentBuilder DocumentBuilder builder = factory.newDocumentBuilder(); // 获得Document Document doc = builder.parse(in); // 获得节点列表 NodeList nl = doc.getElementsByTagName("table"); TabletblDAO tabletblDAO = new TabletblDAO( getApplicationContext()); if (nl.getLength() > 0) { tabletblDAO.DeleteData(); } // 循环将数据保存到菜谱表 List<Tabletbl> list = new ArrayList<Tabletbl>(); for (int i = 0; i < nl.getLength(); i++) { // 实例化ContentValues // 解析XML文件获得桌号id int id = Integer.parseInt(doc.getElementsByTagName("id") .item(i).getFirstChild().getNodeValue()); int num = Integer.parseInt(doc.getElementsByTagName("num") .item(i).getFirstChild().getNodeValue()); // 名称 String name = doc.getElementsByTagName("name").item(i) .getFirstChild().getNodeValue(); int flag = Integer.parseInt(doc .getElementsByTagName("flag").item(i) .getFirstChild().getNodeValue()); String description = doc .getElementsByTagName("description").item(i) .getFirstChild().getNodeValue(); /* * values.put("id", id); values.put("num", num); * values.put("name", name); values.put("flag", flag); * values.put("description", description); */ list.add(new Tabletbl(id, num, name, flag, description)); // 添加到ContenValues对象 // 插入到数据库 // tabletblDAO.AddTabletblDAO(values); } Message msg = myhander.obtainMessage(); msg.what = 1; msg.obj = list; myhander.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } } }; private static class TableListAdapter extends BaseAdapter { public List<Tabletbl> mlist = null; private Context context; public TableListAdapter(List<Tabletbl> list, Context c) { mlist = list; context = c; } @Override public int getCount() { // TODO 自动生成的方法存根 return mlist.size(); } @Override public Object getItem(int position) { // TODO 自动生成的方法存根 return position; } @Override public long getItemId(int position) { // TODO 自动生成的方法存根 return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO 自动生成的方法存根 ViewHolder holder; // When convertView is not null, we can reuse it directly, there is // no // need // to reinflate it. We only inflate a new View when the convertView // supplied // by ListView is null. if (convertView == null) { LayoutInflater mInflater = LayoutInflater.from(context); convertView = mInflater.inflate(R.layout.chazhuo_list, null); // Creates a ViewHolder and store references to the two children // views // we want to bind data to. holder = new ViewHolder(); holder.idtext = (TextView) convertView .findViewById(R.id.chazhuo_id); holder.nametext = (TextView) convertView .findViewById(R.id.chazhuo_name); holder.flagtext = (TextView) convertView .findViewById(R.id.chazhuo_flag); holder.remarktext = (TextView) convertView .findViewById(R.id.chazhuo_remark); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.idtext.setText(String.valueOf(mlist.get(position).getId())); holder.nametext.setText(mlist.get(position).getName()); if (mlist.get(position).getFlag() == 0) holder.flagtext.setText(context .getString(R.string.chazhuo_kongxian)); else if (mlist.get(position).getFlag() == 1) { holder.flagtext.setText(context .getString(R.string.chazhuo_youren)); } else { holder.flagtext.setText(context .getString(R.string.chazhuo_unkown)); } holder.remarktext.setText(mlist.get(position).getDescription()); return convertView; } static class ViewHolder { TextView idtext; TextView nametext; TextView flagtext; TextView remarktext; } } } ``` 这段XML 我在官方的demo上试了 没问题。 ``` <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="5dp" > <TextView android:id="@+id/textView1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/textView2" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView4" android:layout_width="0dp" android:layout_weight="2" android:layout_height="wrap_content" /> </LinearLayout> ``` 这个问题我搞了一两天了 找不到哪里的问题。求大神解决。
多人聊天器,求大神发源代码!初来乍到,小弟实在不是很懂,望大神指教!在线等大神!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
多人聊天器求大神代码!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
计算器问题 很烦人!!以后有钱给您补上
package com.A; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class CalculatorDemo extends WindowAdapter implements ActionListener { int j,p,k,l,m ,i; JButton b[]=new JButton[10]; //按钮数组 JFrame frame; JButton Ab,dian,dao,jia,jian,cheng,chu,equ,CE,C,Ba,BF,sq,zf; JTextField show; JDialog about; double getValue,sum; int length=30; public CalculatorDemo() { frame=new JFrame("计算器"); frame.setSize(270, 210); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con=frame.getContentPane(); JTextField show=new JTextField(30); show.setEditable(false); show.setHorizontalAlignment(JTextField.RIGHT); con.add(show,BorderLayout.NORTH); con.add(getmainPanel(),BorderLayout.CENTER); frame.setResizable(false); frame.setLocation(300,280); frame.setVisible(true); } public JPanel getmainPanel() { JPanel mainPanel=new JPanel(); JPanel upPanel =new JPanel(new GridLayout(1,4,2,2)); Ba=new JButton("Back"); upPanel.add(Ba); Ba.addActionListener(this); CE=new JButton("CE"); upPanel.add(CE); CE.addActionListener(this); C=new JButton("C"); upPanel.add(C); C.addActionListener(this); Ab=new JButton("About"); upPanel.add(Ab); Ab.addActionListener(this); about=new JDialog(frame,"关于计算器",true); about.setLocation(300,300); JLabel lable=new JLabel("作者:章黎"); about.add(lable,"Center"); about.setSize(250, 100); about.addWindowListener(this); upPanel.setVisible(true); mainPanel.add(upPanel); JPanel dPanel =new JPanel(new BorderLayout(2,2)); JPanel leftPanel =new JPanel(new GridLayout(4,3,2,3)); for(i=9;i>=0;i--) { b[i]=new JButton(String.valueOf(i)); leftPanel.add(b[i]); b[i].addActionListener(this); } JButton zf=new JButton("+/-"); leftPanel.add(zf); zf.addActionListener(this); JButton dian=new JButton("."); dian.addActionListener(this); leftPanel.add(dian); leftPanel.setVisible(true); dPanel.add(leftPanel,BorderLayout.WEST); JPanel rightPanel =new JPanel(new GridLayout(4,2,2,3)); JButton chu=new JButton("/"); rightPanel.add(chu); chu.addActionListener(this); JButton sq=new JButton("sqrt"); rightPanel.add(sq); sq.addActionListener(this); JButton cheng=new JButton("*"); rightPanel.add(cheng); cheng.addActionListener(this); JButton BF=new JButton("%"); rightPanel.add(BF); BF.addActionListener(this); JButton jian=new JButton("-"); rightPanel.add(jian); jian.addActionListener(this); JButton dao=new JButton("1/x"); rightPanel.add(dao); dao.addActionListener(this); JButton jia=new JButton("+"); rightPanel.add(jia); jia.addActionListener(this); JButton equ=new JButton("="); rightPanel.add(equ); equ.addActionListener(this); rightPanel.setVisible(true); dPanel.add(rightPanel,BorderLayout.CENTER); dPanel.setVisible(true); mainPanel.add(dPanel); mainPanel.setVisible(true); return mainPanel; } public void actionPerformed(ActionEvent e) { // getValue=Double.parseDouble(show.getText());//记住输入的数 if(e.getSource()==jia) { if(k==0)//表示加号没有被触发过 sum=getValue; if(l==1)//连续触发加号键直接得结果 { sum+=getValue; } setSum(); k++;l=1;p=0; } if(e.getSource()==jian) { if(k==0) sum=getValue; if(l==2) { sum-=getValue; } setSum(); k++;l=2;p=0; } if(e.getSource()==cheng) { if(k==0) sum=getValue; if(l==3) { sum*=getValue; } setSum(); k++;l=3;p=0; } if(e.getSource()==chu) { if(k==0) sum=getValue; if(l==4) { sum/=getValue; } setSum(); k++;l=4;p=0; } if(e.getSource()==equ) { switch(l)//判断触发了那个运算符后再触发等于号 { case 1:show.setText(String.valueOf(sum+getValue));break; case 2:show.setText(String.valueOf(sum-getValue));break; case 3:show.setText(String.valueOf(sum*getValue));break; case 4:show.setText(String.valueOf(sum/getValue));break; } setSum(); k=0;p=0;l=0; } if(e.getSource()==dian)//如果触发按钮".",是第一次的话允许添加"."并接受后来输入的数 { if(p==0) { show.setText(show.getText()+"."+e.getActionCommand()); } p=1; } if(e.getSource()==C||e.getSource()==CE)//触发按钮还原则显示0 { k=0;p=0;l=0;sum=0; show.setText("0"); } if(e.getSource()==Ab) { about.setVisible(true); } for(i=9;i>=0;i--) { if(e.getSource()==b[i]) { if(j==0)//触发了等于号后j=0;再输入数时就得清空以前的数 show.setText(""); String s=show.getText(); if(s.length()<length) { show.setText(s+e.getActionCommand()); } if(e.getSource()==b[0]&&getValue==0&&p==0) { show.setText("0"); } if(e.getSource()!=b[0]&&getValue==0&&p==0)//如果第一个数输入的是0第二个数不是则显示第二个数 { show.setText(e.getActionCommand()); } j++; } } if(e.getSource()==dao) { sum=1/getValue; setSum(); } if(e.getSource()==BF) { sum=getValue/100; setSum(); } if(e.getSource()==sq) { sum=getValue*getValue; setSum(); } if(e.getSource()==Ba) { String s=show.getText(); if(s.length()>1) { show.setText("");//清空显示的数用来接收退格以后的数 for(m=0;m<s.length()-1;m++)//用一个循环来显示从0到length-1的位置的字符 { show.setText(show.getText()+s.charAt(m)); } } else show.setText("0"); } if(e.getSource()==zf) { String s=show.getText(); char a=s.charAt(0); if(a=='-') { show.setText(""); for(m=1;m<s.length();m++) { show.setText(show.getText()+s.charAt(m)); } } else show.setText("-"+s); } } public void setSum() { show.setText(String.valueOf(sum)); String s=show.getText(); char a=s.charAt(s.length()-1); char b=s.charAt(s.length()-2); if(a=='0'&&b=='.') { // show.setText(String.valueOf(Math.round(sum))); show.setText(s.substring(0, s.length()-2)); } } public void windowClosing(WindowEvent e){ if(e.getSource()==about) about.setVisible(false); else if(e.getSource()==frame) System.exit(0); } public static void main(String []args) { new CalculatorDemo(); } }为什么触发数字键就有错误啊 !!怎么想也不明白! [b]问题补充:[/b] 我的show 不new 了吗?也添加到frame 上啦
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
实战:如何通过python requests库写一个抓取小网站图片的小爬虫
有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来! 首先,准备一个珍藏的小网站,然后就可以开始啦! 第一步 我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片区 图片区内有标题页,一个标题里有10张照片大概 所以步骤是: 第一步:进入图片区的标题页 def getH...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问