黑马程序员技术交流社区
标题:
基础班结束,分享一个自己写的买彩票Demo,写的不好,请多多指教
[打印本页]
作者:
tang475
时间:
2019-8-20 18:28
标题:
基础班结束,分享一个自己写的买彩票Demo,写的不好,请多多指教
贴一个自己写的小Demo,是写了学生管理系统后受到启发自己独立编写的。叫做“欢乐彩票”;
实现的功能:
(需要管理员验证:输入正确的账号和密码,错误的话无法进入“欢乐彩票系统”)
1.买彩票(1.自选 2.机选 3.修改一注彩票(带撤销功能) 4.删除一注彩票(带撤销功能) 5.返回)
2.摇出开奖号码(程序运行一次,只能生成一次开奖号码)
3.兑奖(显示所得奖金并结账)
4.退出
感兴趣的同学可以copy回去试着运行一下,代码的逻辑很初级,可能存在未知BUG,仅供各位学习交流,轻喷~
我的代码:
(1)主界面类 Main.java
/*
彩票开奖系统的主界面
实现功能:
1.管理员登录验证
2.调用方法生成当前开奖的随机彩票数值(前区5个数:1-35互不重复,后区2个数:1-12互不重复)
3.调用方法输入自己的彩票数值(无上限,循环打印购买彩票)
4.调用方法兑奖
奖项设置:
一等奖:5+2 500万元
二等奖:5+1 300万元
三等奖:5+0 100万元
四等奖:4+2 3000元
五等奖:4+1 600元
六等奖:4+0/3+2 100元
七等奖:3+1/2+2 10元
八等奖:3+0/2+1/1+2/0+2 5元
主界面内容:
1.我要买彩票(1.自选 2.机选 3.修改1注彩票 4.删除1注彩票 5.返回主界面)
2.开始摇奖(每运行一次程序,只能摇奖一次)
3.兑奖(如果中奖,显示中奖的号码及中奖金额)
4.退出本程序
*/
/*
目前程序的不足:可能生成相同的数组,未优化
*/
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author TJH
* 2019-08-14 17:24
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//创建数字接收对象
Scanner sc2 = new Scanner(System.in);//创建字符串接收对象(防止BUG)
Manager a = new Manager();//创建管理员对象
LotteryNumber b = new LotteryNumber();//创建彩票生成方法调用对象
ArrayList<ArrayList<int[]>> arr = new ArrayList<>();//创建一个储存数组的集合的集合
ArrayList<int[]> ar;//创建一个临时储存数组的集合
ArrayList<int[]> ar2 = new ArrayList<>();//创建一个储存中奖号码的集合
if (a.logOn()) {//进入彩票系统(添加了管理员验证功能,需要登录)
int count = 0;//定义一个计数器
int index;//定义一个参数
boolean boo = false;//定义一个判断参数
while (true) {
mainPrint();
int select = sc.nextInt();//选择
switch (select) {
case 1://1.自选 2.机选 3.修改 4.删除 5.返回
while (true) {
System.out.println("----------------------------------------------------");
System.out.println("1.自选 2.机选 3.修改1注彩票 4.删除1注彩票 5.返回主界面");
int select2 = sc.nextInt();
if (select2 == 1) {//自选内部逻辑
while (true) {
arr.add(b.bonusNumeber(b.genericScanArr(5, 35), b.genericScanArr(2, 12)));
b.print(arr);//每完成一次投注操作,打印已完成数组
System.out.println("-------------------------------");
System.out.println("是否继续自选(1.是 2.否)");
select2 = sc.nextInt();
if (select2 == 1) {
} else if (select2 == 2) {
break;
} else {
System.out.println("参数错误!返回主界面");
break;
}
}
} else if (select2 == 2) {//机选内部逻辑
System.out.println("请输入要机选的数量:");
int key = sc.nextInt();
for (int i = 0; i < key; i++) {
arr.add(b.bonusNumeber(b.genericRanArr(5, 35), b.genericRanArr(2, 12)));
}
b.print(arr);
} else if (select2 == 3) {//修改1注彩票内部逻辑
if (arr.size() > 0) {
while (true) {
System.out.println("1.更换1注彩票 2.修改彩票中的值 3.返回上一层");
select2 = sc.nextInt();
if (select2 == 1) {
while (true) {
System.out.println("更换哪注彩票?");
index = sc.nextInt();
if (index > arr.size() || index < 1) {
System.out.println("参数异常,重新输入");
break;
}
ar = arr.set(index - 1, b.bonusNumeber(b.genericScanArr(5, 35), b.genericScanArr(2, 12)));
b.print(arr);
System.out.println("更换成功!撤销操作请输入 re,不撤销请回车");
if (sc2.nextLine().equals("re")) {
arr.set(index - 1, ar);
System.out.println("撤销操作成功!");
b.print(arr);
}
System.out.println("是否继续更换? 1.是 2.否");
index = sc.nextInt();
if (index == 1) {
} else if (index == 2) {
System.out.println("返回上一层");
break;
} else {
System.out.println("参数异常");
break;
}
}
} else if (select2 == 2) {
while (true) {
System.out.println("修改哪注彩票?");
int index1 = sc.nextInt();
if (index1 > arr.size() || index1 < 1) {
System.out.println("参数异常,重新输入");
break;
}
System.out.println("修改修改数字的索引(前区:1-5 后区:6-7):");
int index2 = sc.nextInt();
if (index2 >= 1 && index2 <= 7) {
b.modyNum(arr.get(index1 - 1), index2);
b.print(arr);
System.out.println("修改成功!");
} else {
System.out.println("参数异常,修改失败");
}
System.out.println("1.继续修改 2.返回上一层");
select2 = sc.nextInt();
if (select2 == 1) {
} else if (select2 == 2) {
break;
} else {
System.out.println("参数错误,返回上一层");
}
}
} else if (select2 == 3) {
break;
} else {
System.out.println("参数错误,返回上一层");
}
}
} else {
System.out.println("不存在任何彩票,返回上一层");
}
} else if (select2 == 4) {//删除1注彩票内部逻辑
if (arr.size() > 0) {
while (true) {
System.out.println("删除哪注彩票?");
index = sc.nextInt();
if (index >= 0 && index <= arr.size()) {
ar = arr.remove(index - 1);
} else {
System.out.println("不存在任何彩票,返回上一层");
break;
}
b.print(arr);
System.out.println("删除成功!撤销操作请输入 re,不撤销请回车");
if (sc2.nextLine().equals("re")) {
arr.add(index - 1, ar);
System.out.println("撤销操作成功!");
b.print(arr);
}
System.out.println("是否继续删除? 1.是 2.否");
index = sc.nextInt();
if (index == 1) {
} else if (index == 2) {
System.out.println("返回上一层");
break;
} else {
System.out.println("参数异常");
break;
}
}
} else {
System.out.println("不存在任何彩票,返回上一层");
}
} else if (select2 == 5) {//返回主界面
break;
} else {//参数异常
System.out.println("参数错误,返回主界面");
break;
}
}
break;
case 2://随机生成中奖号码,并且在程序结束前不能更改
count++;
if (count == 1) {
ar2 = b.bonusNumeber(b.genericRanArr(5, 35), b.genericRanArr(2, 12));
System.out.println("开奖号码已生成!");
boo = true;
/*b.print2(ar2);*/
} else {
System.out.println("开奖号码无法重复生成!");
}
break;
case 3://兑奖
if (boo) {
if (arr.size() == 0) {
System.out.println("未购买彩票,不能兑奖!");
break;
} else {
System.out.println("开奖了!");
b.print2(ar2);
int bonus = 0;
int sum = 0;
int[] n = new int[arr.size()];
for (int i = 0; i < arr.size(); i++) {
n[i] = b.compare(ar2, arr.get(i));
if (n[i] == 1) {
bonus = 5000000;
sum += bonus;
} else if (n[i] == 2) {
bonus = 3000000;
sum += bonus;
} else if (n[i] == 3) {
bonus = 1000000;
sum += bonus;
} else if (n[i] == 4) {
bonus = 3000;
sum += bonus;
} else if (n[i] == 5) {
bonus = 600;
sum += bonus;
} else if (n[i] == 6) {
bonus = 100;
sum += bonus;
} else if (n[i] == 7) {
bonus = 10;
sum += bonus;
} else if (n[i] == 8) {
bonus = 5;
sum += bonus;
}
if (n[i] >= 1 && n[i] <= 8) {
System.out.println();
System.out.print("第" + (i + 1) + "注彩票:");
b.print3(arr.get(i));
System.out.println(n[i] + "等奖:" + bonus + "元");
System.out.println();
}
}
int max = n[1];
int num = 0;
for (int i = 1; i < n.length; i++) {
if (max > n[i]) {
max = n[i];
num = i;
}
}
if (sum == 0) {
System.out.println();
System.out.println("未中奖!");
b.consumer(arr);
} else {
b.print2(ar2);
System.out.println();
System.out.println("恭喜您中奖了!");
System.out.println("第" + (num + 1) + "注中了最大奖项" + max + "等奖:");
b.print3(arr.get(num));
System.out.println("中奖金额总计:" + sum + "元");
b.consumer(arr);
}
}
} else {
System.out.println("未开奖,请稍等!");
break;
}
case 4://退出程序
System.out.println();
System.out.println("退出成功!谢谢光临");
System.exit(0);
}
}
}
}
public static void mainPrint() {
System.out.println("----------欢迎来到欢乐彩票----------\n" +
"1.我要买彩票\n" +
"2.开始摇奖\n" +
"3.兑奖\n" +
"4.退出\n" +
"请输入你的选择:");
}
}(2)管理员验证类 Manager.java
import java.util.Scanner;
public class Manager {
private String user = "tang475";
private String keyWord = "88888888";
public boolean logOn() {
System.out.println("请输入管理员用户名:");
String user02 = new Scanner(System.in).nextLine();
System.out.println("请输入密码:");
String keyWord02 = new Scanner(System.in).nextLine();
while (!(user02.equals(user))) {
System.out.println("管理员不存在!");
System.out.println("请输入管理员用户名:");
user02 = new Scanner(System.in).nextLine();
System.out.println("请输入密码:");
keyWord02 = new Scanner(System.in).nextLine();
}
for (int count = 2; !(keyWord02.equals(keyWord)); count--) {
if (count == 0) {
System.out.println("密码错误次数过多,账户锁定!");
return false;
}
System.out.println("密码错误!请再次输入密码(你还可以输入" + count + "次:)");
keyWord02 = new Scanner(System.in).nextLine();
}
System.out.println("登录成功!");
return true;
}
}
(3) 生成彩票号码及打印类 LotteryNumber.java
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
* @author TJH
* @date 2019-08-14 21:05
*/
public class LotteryNumber extends WinOrNot {
/*public static void main(String[] args) {
LotteryNumber a = new LotteryNumber();
ArrayList<int[]> ar = a.bonusNumeber(a.genericRanArr(5, 35), a.genericRanArr(2, 12));
print(ar.get(0),ar.get(1));
ArrayList<int[]> ar2 = a.bonusNumeber(a.genericScanArr(5, 35), a.genericScanArr(2, 12));
print(ar2.get(0),ar2.get(1));
}*/
//生成彩票方法1:手动输入1注彩票
public int[] genericScanArr(int a/*数组长度*/, int b/*取值范围*/) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[a];
for (int i = 0; i < arr.length; i++) {
if (a > 2) {
System.out.println("请输入前区第" + (i + 1) + "个号码(1-35):");
} else {
System.out.println("请输入后区第" + (i + 1) + "个号码(1-12):");
}
int key = sc.nextInt();
boolean flag = true;
for (int j = 0; j < i; j++) {
if (arr[j] == key) {
System.out.println("号码不能重复!");
flag = false;
}
}
if(a>2) {
if (key < 1 || key > 35) {
System.out.println("号码不符合规则!");
flag = false;
}
if (flag) {
arr[i] = key;
} else {
i--;
}
}else{
if (key < 1 || key > 12) {
System.out.println("号码不符合规则!");
flag = false;
}
if (flag) {
arr[i] = key;
} else {
i--;
}
}
}
arrSort(arr);//数组选择排序
return arr;
}
//生成彩票方法2:随机生成1注彩票
public int[] genericRanArr(int a/*数组长度*/, int b/*随机种子*/) {
int[] arr = new int[a];//定义数组
Random rd = new Random();
//数组随机赋值并且不重复
for (int i = 0; i < arr.length; i++) {
boolean flag = true;
int key = rd.nextInt(b) + 1;
for (int j = 0; j < i; j++) {
if (arr[j] == key) {
flag = false;
}
}
if (flag) {
arr[i] = key;
} else {
i--;
}
}
arrSort(arr);//数组选择排序
return arr;
}
//生成彩票方法3:集合储存1注彩票的两个数组
public ArrayList bonusNumeber(int[] arr1/*前区*/, int[] arr2/*后区*/) {
ArrayList<int[]> bon = new ArrayList<>();//创建集合用于存储两个数组
bon.add(arr1);
bon.add(arr2);
return bon;
}
//打印方法部分1:1注彩票两个数组的StringBuilder拼接
public StringBuilder getStringBuilder(int[] a, int[] b) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < a.length; i++) {
if (i == a.length - 1) {
if (a[i] < 10) {
sb.append("0" + a[i] + " + ");
} else {
sb.append(a[i] + " + ");
}
} else {
if (a[i] < 10) {
sb.append("0" + a[i] + " ");
} else {
sb.append(a[i] + " ");
}
}
}
for (int i = 0; i < b.length; i++) {
if (i == b.length - 1) {
if (b[i] < 10) {
sb.append("0" + b[i]);
} else {
sb.append(b[i]);
}
} else {
if (b[i] < 10) {
sb.append("0" + b[i] + " ");
} else {
sb.append(b[i] + " ");
}
}
}
sb.append("]");
return sb;
}
//打印方法部分2:打印顾客购买的彩票数组方法
public void print(ArrayList<ArrayList<int[]>> arr) {//泛型???
System.out.println("-------------------------------");
for (int j = 0; j < arr.size(); j++) {
ArrayList<int[]> ar = arr.get(j);
;
int[] a = ar.get(0);
int[] b = ar.get(1);
StringBuilder sb = getStringBuilder(a, b);
System.out.println("第" + (j + 1) + "注: " + sb.toString());
if ((j + 1) % 5 == 0) {
System.out.println("-------------------------------");
}
}
}
//打印方法部分3:打印开奖号码数组
public void print2(ArrayList<int[]> ar) {
int[] a = ar.get(0);
int[] b = ar.get(1);
StringBuilder sb = getStringBuilder(a, b);
System.out.println("***********************************");
System.out.println("中奖号码为:" + sb.toString());
System.out.println("***********************************");
}
//打印方法部分4:打印中奖号码数组
public void print3(ArrayList<int[]> ar) {
int[] a = ar.get(0);
int[] b = ar.get(1);
StringBuilder sb = getStringBuilder(a, b);
System.out.println(sb.toString());
}
//数组选择排序方法
public int[] arrSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
//修改彩票数组某个值的方法
public void modyNum(ArrayList<int[]> ar, int a) {
Scanner sc = new Scanner(System.in);
if (a > 0 && a < 6) {
boolean boo = true;
while (boo) {
System.out.println("录入修改数字:");
int a1 = sc.nextInt();
for (int i = 0; i < ar.get(0).length; i++) {
if (a1 == ar.get(0)[i]) {
boo = true;
System.out.println("数字重复,请重新输入!");
} else {
boo = false;
}
}
if (!boo) {
ar.get(0)[a - 1] = a1;
}
}
System.out.println("修改成功");
arrSort(ar.get(0));
} else if (a == 6 || a == 7) {
boolean boo = true;
while (boo) {
System.out.println("输入修改的数字:");
int a1 = sc.nextInt();
for (int i = 0; i < ar.get(1).length; i++) {
if (a1 == ar.get(1)[i]) {
boo = true;
System.out.println("数字重复,请重新输入!");
} else {
boo = false;
}
}
if (!boo) {
ar.get(1)[a - 6] = a1;
}
}
System.out.println("修改成功");
arrSort(ar.get(1));
} else {
System.out.println("参数错误!");
}
}
//结账方法
public void consumer(ArrayList<ArrayList<int[]>> arr){
int con = arr.size()*2;
System.out.println("打印了"+arr.size()+"注彩票,共消费"+arr.size()*2+"元");
}
}
(4)兑奖类WinOrNot.java
/*
判断是否中奖
*/
import java.util.ArrayList;
/**
* @author TJH
* @date 2019-08-15 9:40
*/
public class WinOrNot {
public int compare(ArrayList<int[]> a/*中奖号码*/,ArrayList<int[]> b/*购买号码*/){
/* a.get(0);//中奖号码前区数组
a.get(1);//中奖号码后区数组
b.get(0);//顾客号码前区数组
b.get(1);//顾客号码后区数组*/
int count1 = 0; //前区中奖个数计数
for(int i =0;i<b.get(0).length;i++){
for(int j =0;j<a.get(0).length;j++){
if(b.get(0)[i]==a.get(0)[j]){
count1++;
break;
}
}
}
int count2 = 0; //后区中奖个数计数
for(int i =0;i<b.get(1).length;i++){
for(int j =0;j<a.get(1).length;j++){
if(b.get(1)[i]==a.get(1)[j]){
count2++;
break;
}
}
}
/*
设置:
一等奖:5+2 500万元
二等奖:5+1 300万元
三等奖:5+0 100万元
四等奖:4+2 3000元元
五等奖:4+1 600元
六等奖:4+0/3+2 100元
七等奖:3+1/2+2 10元
八等奖:3+0/2+1/1+2/0+2 5元
*/
int sum = 0;
if(count1 ==5&&count2==2){
sum = 1;
}else if(count1 ==5&&count2==1){
sum = 2;
}else if(count1 ==5&&count2==0){
sum = 3;
}else if(count1 ==4&&count2==2){
sum = 4;
}else if(count1 ==4&&count2==1){
sum = 5;
}else if((count1 ==4&&count2==0)||(count1 ==3&&count2==2)){
sum = 6;
}else if((count1 ==3&&count2==1)||(count1 ==2&&count2==2)){
sum = 7;
}else if((count1 ==3&&count2==0)||(count1 ==2&&count2==1)||(count1 ==1&&count2==2)||(count1 ==0&&count2==2)){
sum = 8;
}
return sum;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2