图形化显示数组
func displayArrayGraph() {
let myView1 = self.view.viewWithTag(2001) as! UIImageView
let myView2 = self.view.viewWithTag(2002) as! UIImageView
myView1.backgroundColor = .darkGray
myView2.backgroundColor = .darkGray
let h = myView1.frame.size.height
let w = myView1.frame.size.width
let padding : CGFloat = 5
let margin : CGFloat = 10
let grid_w = (w - margin * 2 - padding * CGFloat(cols-1)) / CGFloat(cols)
let grid_h = (h - margin * 2 - padding * CGFloat(rows-1)) / CGFloat(rows)
for i in 0..<rows {
for j in 0..<cols {
let x = margin + CGFloat(j) * (grid_w + padding)
let y = margin + CGFloat(i) * (grid_h + padding)
let rect = CGFloat(x: x, y:y, width: grid_w, height: grid_h)
let fileName1 = iv1[i*cols+j]
let img1 = UIImage(named: fileName1)
let imgView1 = UIImageView(frame: rect)
imgView1.image = img1
imgView1.backgroundColor = .yellow
myView1.addSubview(imgView1)
let fileName2 = iv2[i*cols+j]
let img2 = UIImage(named: fileName2)
let imgView2 = UIImageView(frame: rect)
imgView2.image = img2
imgView2.backgroundColor = .yellow
myView2.addSubview(imgView2)
}
}
}
淘宝满减
package com.lyd.wx.uitls;
import java.math.BigDecimal;
import java.util.Scanner;
public class Price {
private static final int DEF_DIV_SCALE = 2;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double superValue = 300;
int fijo = 30;
double progress = 299;
System.out.println("请输入成本价格:");
double cost = sc.nextInt();
System.out.println("请输入你想售卖的价格:");
double sellingPrice = sc.nextInt();
double coupon = 0.0;
double intervalMax = sellingPrice + superValue;
double na = Math.floor(intervalMax / superValue);
int ya = new Double(na).intValue();
double nb = Math.ceil(intervalMax / superValue);
int yb = new Double(nb).intValue();
for (int i = 1; i < 20; i++) {
double full = fijo * (i - 1);
double priceMin = full * 10;
System.out.println("当前产品定价: "+ sellingPrice);
if (full != 0){
double fullMax = div(sellingPrice,priceMin,2) * full;
System.out.println("当前满减区间["+priceMin+","+add(priceMin,progress)+"]"+"当前满减优惠最大金额: "+ fullMax);
coupon = sub(sub(sellingPrice,fullMax),cost);
System.out.println("当前优惠券最大设置值: "+ coupon);
System.out.println();
}else {
System.out.println("当前满减区间["+priceMin+","+add(priceMin,progress)+"]"+"当前满减优惠最大金额: "+ full);
coupon = sub(sub(sellingPrice,full),cost);
System.out.println("当前优惠券最大设置值: "+ coupon);
System.out.println();
}
}
}
public static Double mul(Double d1,Double d2){
BigDecimal b1 = new BigDecimal(d1.toString());
BigDecimal b2 = new BigDecimal(d2.toString());
return b1.multiply(b2).doubleValue();
}
public static Double div(Double d1,Double d2){
BigDecimal b1 = new BigDecimal(d1.toString());
BigDecimal b2 = new BigDecimal(d2.toString());
return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static Double div(Double d1,Double d2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(d1.toString());
BigDecimal b2 = new BigDecimal(d2.toString());
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
}
//函数 3:图形化显示程序,支持 Button
func displayArrayGraphButton () {
let myViewlgelf.vlew.yiewwithTag(2001) as! UIImagevien
1et ByVie2=Be1f.view.viewithTag(2002) as! UIImageViem
myViewl.backgroundColor = .darkGray
myView2.backgroundColor = .darkGray
myView1.isUserInteractionEnabled = true
myView2.isUserInteractionEnabled = true
let h = myViewl.frame.size.height
let w=myViewl.frame.size.width
let padding : CGFloat = 5
let margin : CGFloat = 10
let grid_w = (w- margin *2 - paodding*OGEloat (co1s-1))/ CGFloat (cols)
let grid_h = (h - margin*2 - padding*CGFloat (rows-1))/ CGFLoat (rows)
for i in 0..<rows {
for j in 0..<cols {
let x = margin + CGFloat(j) * (grid_w + padding)
let y = margin + CGFloat(i) * (grid h + padding)
let rect = CGRect(x: x, y:y, width: grid_w, height: grid_h)
let fileNamel = iv1 [i*cols+j]
let imgl = UIImage(named: fileName1)
let btnl = UIButton(frame: rect)
btnl.setImage(imgl, for: .normal)
tnl.backgroundColor= .yellow
btnl.tag= i*cols+j + 4000
btnl.addTarget(self,action: #selector(buttonCheck(_:))for:,.touchUpInside)
myViewl.addSubview(btnl)
let fileName2 = iv2[1*cols+j]
let img2 UIImage (named:fileName2)
let btn2= UIButton(frame: rect)
btn2.setImage(img2, for:.normal)
btn2.backgroundColor =·yellow
btn2.tag = i*cols+j + 5000
btn2.addTarget(self, action: #selector(buttonCheck(_:)),for: ,touchipinside)
myView2.addSubview(btn2)
}
}
}
3.Button事件的响应函数
当不同点的Button被单击后,首先根据其tag的数值,来分析是上面还是下面aton.其具体位置,包括行号和列号。
这个函数比较特殊,其前面有@objc标志,含是按照Objective C的调用规范。
函数4的功能是显示当前被单击的那个Button的行号列号。
objc func buttonCheck(_ sender : UIButton)(
let tipsLabel = self.view.viewWithTag(1001) as! UILabel
let tag = sender.tag
if tag >= 5000
let row = Int ((tag - 5000)/ cols)
let col = tag - 5000 - cols * row
print("Bottom(\(row),\(col))")
tipsLabel.text= "Bottom(\(row),\(col)) "
}
else if tag >= 4000(
let row = Int ((tag - 4000)/ cols)
let col = tag - 4000 - cols * row
print("Top(\(row),\(col))")
tipsLabel.text="Top(\(row),\(col))"
}
else {
print("Button.tag=\(sender.tag)")
tipsLabel.text ="Button.tag=\(sender.tag)"
}
}
4.相同于扰项函数
这个就是函数4,用于随机的生成干扰项。同时把这些位置记录在conds数组中,另
个保存有小图片的数组images。
func distractorCreate(mount:Int){
for _ in 0..<mount {
let col = Int (arc4random()) % cols
let row = Int (arc4random()) % rows
cords.append((row,col))
/从 images 提供的字符中选择一个
let index = Int(arc4random()) images.count
1v1[cols*row + col = images[index]
1v2[cols*row + col] = images[index]
}
}
5. 新增数据定义
干找项函数需要新增两个数组,因此需要修改数据定义部分内容,增加两个数组cords 和images。
let rows = 8
let cols = 8
var ivl : Array<String>= []
var iv2 :Array<String>=
var cords : Array<(Int,Int)> []
let images:Array<String>=["bird","bee", "flower", "mogu"]
/ / 数据定义结束 --
func differenceCreate(mount:Int){
for _ in 0..<mount {
let col = Int(arc4random()) % cols
let row = Int(arc4random()) % rows
errorCords.append((row,col))
let indx = Int(arc4random()) % images.count
let which = Int(arc4tandom()) % 2
if which == 0 {
iv1[cols*row + col] = images[index]
}
else {
iv2[cols*row + col] = images[index]
}
}
}
@objc func buttonCheckMusic(_ sender : UIButton) {
let tispsLabel = self.view.viewWithTag(1001) as! UILabel
var tag = sender.tar
if tag >= 5000 {
tag -= 5000
}
else if tag >= 4000 {
tag -= 4000
}
let row = Int (tag / cols)
let col = tag - cols * row
let result = errorCords.filter {
$0 == (row,col)
}
if result.count >=1 {
let path = Bundle.main.path(forResource:"birdsound",ofType:"m4a")
let ur1 = URL(fileURLWithPath: path!)
soundPlayer=try? AVAudioPlayer(contentsOf: ur1)
soundPlayer.play()
tipsLabel.text = "不同找到: (\(row),\(col))"
}
else {
let path = Bundle.main.path(forResource: "error", ofType:"m4a")
let ur1 = URL(fileURLWithPath: path!)
soundPlayer=try? AVAudioPlayer(contentsOf: UR1)
soundPlayer.play()
tipsLabel.text = "找错啦: (\(row),\(col))"
}
}
4.实现音效功能
btnl.addTarget(self, action: #selector(buttonCheckMusic(_:)),for: .touchUpInside)
btn2.addTarget(self, action: #selector(buttonCheckMusic(_:)),for: .touchUpInside)
4.2.4计时功能
var GameOver = flase
var beginTimestamp : Int = 0
let GamePeriod = 20
var TimeCost = 0
func getCurrentTimeStamp() -> Int {
let now = Date()
let timeInterval : timeInterval = now.timeIntervalSince1970
return Int(timeInterval)
}
func timeElapse() {
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) {
(timer) in
let timestamp = self.getCurrentTimeStamp()
let pastPeriod = timestamp - self.neginTimestamp
let countDown = self.GamePeriod - pastPeriod
self.TimeCost = pastPeriod
if countDown <= 0 || self.GameOver {
self.GameOver = true
let tipsLabel = self.view.viewWithTag(1001) as! UILabel
tipsLabel.text = "游戏结束,共消耗时间\(self.TimeCost)秒"
timer.invalidate()
}
let tipsLabel = self.view.viewWithTag(1002) as! UILabel
DispatchQueue.main.async {
tipsLabel.text = "您消耗\(pastPeriod)秒,倒计时\(countDown)秒"
}
}
}
3.修改Button函数支持计时
@objc func buttonCheckMusicTimer(_sender : UIButton){
if GameOver {return}
let tipsLabel=self.view.viewWithTag(1001) as! UILabel
var tag=sender.tag
if tag >= 5000 {
tag -=5000
}
else if tsg >= 4000 {
tag -=4000
}
let row = Int (tag / cols)
let col - tag - cols * row
let result = errorCords.filter {
$0 == (row,col)
}
let reserved = errorCords.filter {
$0 != (row,col)
}
errorCords = reserved
if result.count >= 1 {
sender.backgroundColor = .reservedlet path = Bundle.main.path(forResource: "birdsound", ofType: "m4a")
let ur1 = URL(fileURLWithPath:path!)
soundPlayer=try? AVAudioPlayer(contentsOf: ur1)
soundPlayer.play()
tipsLabel.text = "不同找到:(\(row),\(col)),还剩\(errorCords.count)个"
if errorCords.count <= 0 {
GameOver = true
tipsLabel.text = "任务完成,共花费时间\(self.TimeCost) 秒"
}
}
else {
sender.backgroundColor = .brown
let path = Bunble.main.path(forResource: "error", ofType:"m4a")
let ur1 = URL(fileURLWithPath: path!)
soundPlayer=try? AVAudioPlayer(contentsOF: ur1)
soundPlayer.play()
tispLabel.text = "找错了: (\(row),\(col))"
}
}
4.功能实现
btnl.addTarget(self, action: #selector(buttonCheckMusic(_:)),for: .touchUpInside)
btn2.addTarget(self, action: #selector(buttonCheckMusic(_:)),for: .touchUpInside)
GameOver = flase
beginTimestamp=getCurrentTimeStamp
timeInterval()
initGame()
distractorCreate(mount: 5)
differenceCreate(mount: 3)
displayArrayGraphButton()
4.2.5游戏提示
func displayArrayGraphBottonTops() {
let myView1 = self.view.viewWithTag(2001) as! UIImageView
let myView2 = self.view.viewWithTag(2002) as! UIImageView
myView1.backgroundColor = .darkGray
myView2.backgroundColor = .darkGray
myView1.isUserInteractionEnabled = true
myView2.isUserInteractionEnabled = true
let h = myView1.frame.size.height
let w = myView2.framesize.width
let padding : CGFloat = 5
let margin : CGFloat = 10
let grid_w = (w-margin * 2 - padding * CGFloat(cols-1)) / CGFloat(cols)
let grid_h = (h-margin * 2 - padding * CGFloat(cols-1)) / CGFloat(cols)
for i in 0..<rows {
for j in 0..<cols {
let x = margin + CGFloat(j) * (grid_w + padding)
let y = margin + CGFloat(i) * (grid_h + padding)
let rect = CGFloat(x: x,y:y ,width:grid_w,height:grid_h)
let fileName1 = iv1[i*cols+j]
let tag1 =i*cols+j + 5000
addButton(view.myView1,rect: ret, fileName: fileName1,tag: tag1)
let fileName2 = iv1[i*cols+j]
let tag2 =i*cols+j + 5000
addButton(view.myView2,rect: ret, fileName: fileName2,tag: tag2)
}
}
func addButton(view:UIView,rect:CGRect,fileName:String,tag:Int) {
let img = UIImage(named: fileName)
let bth = UIButton(frame: rect)
bth.setImage(img, for: .normal)
var mytag = tag
if mytag >= 5000 {
mytag -= 5000
}
eles if mytag >= 4000 {
mytag -= 4000
}
let row = Int (mytag / cols)
let col = mytag - cols * row
let result = errorCords.filter {
$0 == (row,col)
}
if result.count >= 1 && TipsFlag {
btn.backgroundColor = .blue
}
eles {
btn.backgroundColor = .yellow
}
btn.tag = tag
btn.addTarget(self, action:: #selector(buttonCheckMusicTimer(_:)),for: .touchUpInside)
view.addSubview(btn)
}
@IBAction func onBegin(_ sender : UIButton){
GameOver = false
beginTimestamp = getCurrenTimeStamp()
timeElapse()
initGame()
distractorCreate(mount: 5)
differenceCreate(mount: 3)
displarArrayGraphButtonTips()
}
新增函数13,修改函数12和函数11
removeAllreAllSubViews(view:myView1)
removeAllreAllSubViews(view:myView2)
func addButton(view:UIView,rect:CGRect,fileName:String,tag:Int) {
let img = UIImage(named: fileName)
let bth = UIButton(frame: rect)
bth.setImage(img, for: .normal)
var mytag = tag
if mytag >= 5000 {
mytag -= 5000
}
else if mytag >= 4000 {
mytag -= 4000
}
let row = Int (mytag / cols)
let col = mytag - cols * row
let result = errorCords.filter {
$0 == (row,col)
}
if result.count >= 1 && TipsFlag {
btn.backgroundColor = .blue
btn.tag = tag1btn.addTarget(self,action: #selector(buttonCheckMusicTimer(_:)),for: touchUpInside)
view.addSubview(btn)
}
let result1 = cords.filter {
$0 == (row,col)
}
if resultl.count >= 1 {
btn.tag = tag
btn.addTarget(self, action: #selector(buttonCheckMusicTimer(_:)),for: .touchUpInside)
view.addSubview(btn)
}
}
func removeAllSubviews(view:UIView) {
if view.subviews.count>0 {
view.subviews.forEach({$0.removeFromSuperview()})
}
}
@IBAction func onTips(_ sender : UIButton) {
TipsFlag = !TipsFlag
displayArrayGraphButtonTisp()
}
@IBAction Func onBegin(_ sends : UIButton) {
GameOver = false
beginTimestamp = getCurrenTimeStamp()
timeElapse()
initGame()
distractorCreate(mount: 10)
differenceCreate(mount: 8)
displarArrayGraphButtonTips()
}
@IBAction Func onNext(_ sends : UIButton) {
GameOver = true
TipsFlag = falas
let myView1 = self.view.viewWithTag(2001) as! UIImageView
let myView2 = self.view.viewWithTag(2002) as! UIImageView
CurrentBackground += 1
if CurrentBackground > 4 {
CurrentBackground = 1
}
let image = UIImage(named: "back0\(CurrentBackground)")!
myView1.image = image
myView2.image = image
removeAllSubViews(view: myView1)
removeAllSubViews(view: myView2)
}
4.3.2登录界面的实现
import SwiftUI
struct ContentView : View {
@State var userName : String = ""
@State var passWord : String = ""
var body: some View {
VStack {
Text("欢迎使用找不同")
.font(.title)
.padding()
Divider()
.background(Color(.brown))
Image(systemName:"person")
.resizable()
.frame(width: 150, height: 150)
.cornerRadius(50)
VStack {
TextField("请输入用户名", text: $userName)
.padding()
.padding(.leading,10)
.background(Color(.lightGray))
.cornerRadius(15)
TextField("请输入密码", text: $passWord)
.padding()
.padding(.leading,10)
.background(Color(.lightGray))
.cornerRadius(15)
}
.padding()
Button(action: {
print("被点击了...")
}, label: {Text("登录")})
.padding()
Spacer()
}
}
}
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI
let lightGrayColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)
struct ContentView : View {
@State var userName : String = ""
@State var passWord : String = ""
@State private var alertFlag : Bool = false
@State private var alertMsg : String = ""
var body: some View {
VStack {
Text("欢迎使用找不同")
.font(.title)
.padding()
Divider()
.background(Color(.brown))
Image("back02")
.resizable()
.frame(width: 150, height: 150)
.cornerRadius(150)
VStack {
TextField("请输入用户名", text: $userName)
.padding()
.padding(.leading,10)
.background(lightGrayColor)
.cornerRadius(15)
TextField("请输入密码", text: $passWord)
.padding()
.padding(.leading,10)
.background(lightGrayColor)
.cornerRadius(15)
}
.padding()
Button(action: {
if self.userName == "Zfchen" && self.passWord == "123" {
self.alertFlag = true
self.alertMsg = "登录成功"
}
else {
self.alertFlag = true
self.alertMsg = "登录失败"
}
}, label: {
Text("登录")
.font(.headline)
.foregroundColor(.white)
.frame(width: 220, height: 60)
.background(Color.green)
.cornerRadius(15.0)
})
.padding()
Spacer()
}
.alert(isPresented: $alertFlag) { () -> Alert in
Alert(title: Text("登录提示"), message: Text(self.alertMsg), dismissButton: .default(Text("确定")))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}