定义:重复的执行某些代码
循环的分类
- while
- do -while
- for
- jdk1.5之后出现一个增强for 循环:for-each,后期数组详解
while
语法:
while(循环条件){
//循环的主体代码
}
//循环条件:必须是一个boolean值的表达式
小练习:打印10次Helloworld
public class Test{
public static void main (){
final int MAX=10;
//定义计数器
int count=0;
while(count<MAX){
System.out.println("HelloWORLD");
count++;
}
}
}
//1-100的累加和
public class Test{
//1-100的累加和
public static void main(String[] args){
int sum=0;
int count=1;
while (count<=100){
sum=sum+count;
count++;//迭代的位置要注意把握边界值
}
System.out.println(sum);
}
//1--100偶数相加
public static void main (String[] args){
int sum=0;
counter=1;
while(counter<=100){
//按位与运算:同1则1,否则为0;按位非运算:同0为0,否则为1;
if(counter&1==0){//也可用%取余
sum+=counter;
}
counter++;
}
System.out.println(sum);
}
}
do -while
语法:
do{
//循环体
}while(循环条件);
小练习
public static void main(String[] args){
int sum=0;
int count=1;
do{
sum+=counter++
}while (count<=100);
System.out.println(sum);
}
public class Test{
public static void main(String[] args){
final int MIN=10;
final int MAX=901;
int num=0;
do{
num=(int)(Math.random()*(MAX-MIN)+MIN);
}while(!(num%7==0 && num%5==0));
System.out.println(num);
}
}
和电脑猜拳的游戏石头剪刀布,五局三胜
玩家先Scanner 输入选择 一个手势,电脑随机选择一个
打印选择的手势
比较结果,打印本局谁胜利了!
打印最终比分。
需要定义的常量
常量:石头,剪刀,布 最大胜利的场数 3
变量:电脑随机的选择,玩家输入的值,玩家胜利的次数,电脑胜利的次数
import java.util.Scanner;
public class Test{
public static void main (String[] args){
//定义常量
final int STONE=1;
final int SCISSORS=2;
final int PAPER=3;
final int MAX_WIN_COUNT=3;
//定义变量
int computer=0;
int player=0;
int computerWinNum=0;
int playerWinNum=0;
//局数
int count=1;
Scanner scanner =new Scanner(System.in);
//循环的主体//电脑和玩家胜利的局数都小于最大胜利的局数
while(playerWinNum<MAX_WIN_COUNT&&computerWinNum<MAX_WIN_COUNT){
//打印本居开始
System.out.println("*******第"+count+"场开始******");
System.out.println("请输入您的手势;【1--石头】,【2--剪刀】,【3--布】");
//玩家随机输入
player=(int)scanner.nextInt();
//判断输入错误
while(player<STONE || player>PAPER){
System.out.println("输入错误,请输入您的手势;【1--石头】,【2--剪刀】,【3--布】");
player=(int)scanner.nextInt();
}
//电脑随机选择输入
computer=(int)(Math.random()*(PAPER+1-STONE)+STONE);
//打印玩家输入信息
if(player==STONE){
System.out.println("玩家选择了【石头】");
}else if(player==SCISSORS){
System.out.println("玩家选择了【剪刀】");
}else if(player==PAPER){
System.out.println("玩家选择了【布】");
}
//打印电脑选择结果
switch(computer){
case STONE:
System.out.println("电脑选择了【石头】");
break;
case SCISSORS:
System.out.println("电脑选择了【剪刀】");
break;
case PAPER:
System.out.println("电脑选择了【布】");
break;
}
//比较输出比较结果
if(player==STONE){
switch(computer){
case STONE:
System.out.println("【石头】对【石头】平局");
break;
case SCISSORS:
System.out.println("【石头】对【剪刀】玩家胜利");
playerWinNum++;;
break;
case PAPER:
System.out.println("【石头】对【布】电脑胜利");
computerWinNum++;
break;
}
}else if(player==SCISSORS){
switch(computer){
case STONE:
System.out.println("【剪刀】对【石头】电脑胜利");
computerWinNum++;
break;
case SCISSORS:
System.out.println("【剪刀】对【剪刀】平局");
break;
case PAPER:
System.out.println("【剪刀】对【布】玩家胜利");
playerWinNum++;
break;
}
}else if(player==PAPER){
switch(computer){
case STONE:
System.out.println("【布】对【石头】玩家胜利");
playerWinNum++;
break;
case SCISSORS:
System.out.println("【布】对【剪刀】电脑胜利");
computerWinNum++;
break;
case PAPER:
System.out.println("【布】对【布】平局");
break;
}
}
//打印当前比分
System.out.println("当前比分:【玩家】vs【电脑】:"+playerWinNum+"vs"+computerWinNum);
System.out.println("*******第"+count +"场结束******");
count++;
}
if(playerWinNum==MAX_WIN_COUNT){
System.out.println("玩家胜利,当前总比分:【玩家】vs【电脑】:"+playerWinNum+"vs"+computerWinNum);
}else{
System.out.println("电脑胜利,当前比分:【电脑】vs【玩家】:"+computerWinNum+"vs"+playerWinNum);
}
}
}
//开开心心和电脑大战三百回合
for 循环
语法:
for(循环条件初始化:循环条件:迭代){
//循环体
}
练习
0-100的相加
public class Test{
public static void main (String[] args){
int sum=0;
for(int i=1;i<=100;i++){
sum+=i;
}
System.out.println(sum);
//或者
sum=0;
int i=1;
for(:i<=100:){
sum+=i;
i++;
}
}
}
//水仙花数,在100-999之间有几个这样的数,这三位数的每一位的三次幂之和等于该数本身,求这几个数
public class Test{
public static void main (String[] args){
for (int i=100;i<1000;i++){
int unit=i % 10;
int shiwei=i % 100 / 10;
int baiwei=i / 100;
int sum=unit*unit*unit+shiwei*shiwei*shiwei+baiwei*baiwei*baiwei;
if(i==sum){
System.out.println(sum);
}
}
}
}
循环选择
- while :循环次数不确定,使用while(线程,io流)
- for:循环的次数是固定(容器,数组)
break; continue;
break 的作用
- 在switch 语句中使用,用来结束switch 语句的。
- 还可以在循环体中结束当前循环的。(只能结束一层循环) continue的作用
- 只能在循环体中使用
- 跳过本次循环执行后续内容执行下次循环
while:执行到了continue 循环体中后续代码直接跳过,直接进入下次 循环条件的判断
do- while:同上
for :执行到continue 循环体中后续代码直接 跳过,直接跳到迭代去执行,然后条件判断
public class Test{
public static void main(String[] args){
final int MIN=10;
final int MAX=901;
int num=0;
while(true){
num=(int)(Math.random()*(MAX-MIN)+MIN);
if(num%7==0&&num%5==0)break;
}
System.out.println(num);
}
}
用循环实现打印一个用*组成的正方体边长自定义
public class Test{
public static void main(String[] args){
java.util.Scanner scan =new java.util.Scanner(System.in);
}
class myMath extends Math{
}
}
嵌套循环
外层循环迭代一次,内层循环执行一遍
import java.util.Scanner;
public class Test1 {
public static void main (String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输入矩形的边长!!!");
int width=scan.nextInt();
for(int i=0;i<width;i++){
for(int j=0;j<=width;j++){
System.out.print(" *");
}
System.out.println();
}
}
}
import java.util.Scanner;
public class Test1 {
public static void main (String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输入平行四边形的边长!!!");
int width=scan.nextInt();
for(int i=0;i<width;i++){
for(int k=0;k<i;k++){
System.out.print(" ");
}
for(int j=0;j<=width;j++){
System.out.print(" *");
}
System.out.println();
}
}
//带空格输出形式
import java.util.Scanner;
public class Test1 {
public static void main (String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输入等腰三角形的底边长!!!");
int width=scan.nextInt();
for(int i=0;i<width;i++){
for(int k=i;k<width-1;k++){
System.out.print(" ");
}
for(int j=0;j<=i;j++){
System.out.print(" *");
}
System.out.println();
}
}
}
//不带空格输出形式
import java.util.Scanner;
public class Test1 {
public static void main (String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输入等腰三角形的底边长!!!");
int width=scan.nextInt();
for(int i=0;i<width;i++){
for(int k=i;k<width-1;k++){
System.out.print(" ");
}
for(int j=0;j<(i<<1)+1;j++){
System.out.print("*");
}
System.out.println();
}
}
}
战斗练习
实现一场战斗
亚瑟 VS 后裔
每个英雄 赋值 初始血量 1000,
每个英雄 伤害随机
亚瑟 damage[30,50)暴击率30% 暴击 伤害1.8
后裔 damage[20,40) 暴击率50% 暴击伤害2
然后普通攻击和暴击要求不同的输出内容,输出本次伤害,和对方剩余的血量
一人一刀互相伤害
使用循环模拟两人的一场战斗
最终输出结果,谁胜利,剩余血量
public class Test1 {
public static void main(String[] args){
final double HP=1000;
final double YASE_DAM_MIN=30;
final double YASE_DAM_MAX=50;
final double YASE_CRITICAL_PERCENT=0.3;
final double YASE_CRITICAL_DAM=1.8;
final double HOUYI_DAM_MIN=30;
final double HOUYI_DAM_MAX=50;
final double HOUYI_CRITICAL_PERCENT=0.5;
final double HOUYI_CRITICAL_DAM=2;
//初始化两个任务的血量
double yaseHP=HP,houyiHp=HP;
System.out.println("=====两人相遇战斗开始=====");
while(yaseHP > 0 && houyiHp > 0){
int saizi=(int)(Math.random()*(3-1));
if(saizi==1){
System.out.println("亚瑟先手");
//亚瑟造成随机伤害
double yase =(Math.random()*(YASE_DAM_MAX-YASE_DAM_MIN)+YASE_DAM_MIN);
//是否产生暴击
boolean isCritical=false;
if(Math.random()<=YASE_CRITICAL_PERCENT){
isCritical=true;
}
if(isCritical){
yase*=YASE_CRITICAL_DAM;
System.out.println("亚瑟挥舞一刀造成暴击伤害"+yase);
}else{
System.out.println("亚瑟挥舞一刀造成伤害"+yase);
}
houyiHp=houyiHp-yase<0?0:houyiHp-yase;
System.out.println("后裔剩余血量"+houyiHp);
}else{
System.out.println("后裔先手");
//后裔造成随机伤害
double houyi =(Math.random()*(HOUYI_DAM_MAX-HOUYI_DAM_MIN)+HOUYI_DAM_MIN);
//是否产生暴击
boolean isCritical=false;
if(Math.random()<=HOUYI_CRITICAL_PERCENT){
isCritical=true;
}
if(isCritical){
houyi*=HOUYI_CRITICAL_DAM;
System.out.println("后裔射出一箭造成暴击伤害"+houyi);
}else{
System.out.println("后裔射出一箭造成造成伤害"+houyi);
}
yaseHP=yaseHP-houyi<0?0:yaseHP-houyi;
System.out.println("亚瑟剩余血量"+yaseHP);
}
}
if(houyiHp==0){
System.out.println("后裔战死");
}else if(yaseHP==0){
System.out.println("亚瑟战死");
}
}
}