質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

909閲覧

XcodeのSwiftでおみくじアプリを作成する際に、一度出た結果を次に出ないようにする

ufolooop

総合スコア1

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

1クリップ

投稿2020/08/13 09:55

初めまして。ufolooopと申します。
プログラミング初心者です。

現在、XcodeのSwiftにて、くじ引きのようなアプリを作ろうとしております。

arc4random_uniformを使って結果をランダムに表示させることには成功したのですが、次のトライにて、一度出た結果は表示させない方法が分からず足踏みをしています。

例えば、一度大吉が出たら、次回以降は大吉が出ないという仕様にしたいです。

下記、記述したコードになります。
お忙しいところ恐れ入りますが、どなたかfixしていただけますと幸いです。

よろしくお願いいたします。


import SpriteKit
import GameplayKit

class GameScene: SKScene {

//イラスト用スプライトを用意する let mySprite = SKSpriteNode(imageNamed: "omikuji.png") //ボタン用スプライトを用意する let btnSprite = SKSpriteNode(imageNamed: "button.png") //おみくじ結果用ラベルを用意する let myLabel = SKLabelNode(fontNamed: "Verdana-bold") private var label : SKLabelNode? private var spinnyNode : SKShapeNode? override func didMove(to view: SKView) { //背景色をつける self.backgroundColor = SKColor.white //イラストを表示する mySprite.position = CGPoint(x: 5, y: 300) addChild(mySprite) //ボタンを表示する btnSprite.position = CGPoint(x: 5, y: -300) self.addChild(btnSprite) //おみくじ結果用ラベルを表示する myLabel.text = "???" myLabel.fontSize = 65 myLabel.fontColor = SKColor.black myLabel.position = CGPoint(x: 5, y: -50) self.addChild(myLabel) // Get label node from scene and store it for use later self.label = self.childNode(withName: "//helloLabel") as? SKLabelNode if let label = self.label { label.alpha = 0.0 label.run(SKAction.fadeIn(withDuration: 2.0)) } // Create shape node to use during mouse interaction let w = (self.size.width + self.size.height) * 0.05 self.spinnyNode = SKShapeNode.init(rectOf: CGSize.init(width: w, height: w), cornerRadius: w * 0.3) if let spinnyNode = self.spinnyNode { spinnyNode.lineWidth = 2.5 spinnyNode.run(SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(Double.pi), duration: 1))) spinnyNode.run(SKAction.sequence([SKAction.wait(forDuration: 0.5), SKAction.fadeOut(withDuration: 0.5), SKAction.removeFromParent()])) } } func touchDown(atPoint pos : CGPoint) { if let n = self.spinnyNode?.copy() as! SKShapeNode? { n.position = pos n.strokeColor = SKColor.green self.addChild(n) } } func touchMoved(toPoint pos : CGPoint) { if let n = self.spinnyNode?.copy() as! SKShapeNode? { n.position = pos n.strokeColor = SKColor.blue self.addChild(n) } } func touchUp(atPoint pos : CGPoint) { if let n = self.spinnyNode?.copy() as! SKShapeNode? { n.position = pos n.strokeColor = SKColor.red self.addChild(n) } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for touch: AnyObject in touches { // タッチされた位置にあるものを調べて let location = touch.location(in: self) let touchNode = self.atPoint(location) // もし、ボタンなら if touchNode == btnSprite { // ???と表示してから、おみくじを振る myLabel.text = "???" shakeOmikuji() } } } // おみくじを振る処理 func shakeOmikuji() { // 【おみくじを振るアクションをつける】 // おみくじを少し右に傾けるアクション let action1 = SKAction.rotate(toAngle: -0.3, duration: 0.2) // おみくじを少し左に傾けるアクション let action2 = SKAction.rotate( toAngle: 0.3, duration: 0.2) // おみくじをひっくり返すアクション let action3 = SKAction.rotate( toAngle: 3.14, duration: 0.2) // action1,action2,action3を指定した順番に行う let actionS = SKAction.sequence( [action1, action2, action1, action2, action1, action3]) // おみくじに「左右に振ってひっくり返すアクション」をつけて、最後にkekkaを実行する mySprite.run(actionS, completion: showOmikuji) } // 結果を表示する処理 func showOmikuji() { let omikuji = ["大吉","吉","凶"] let r = Int(arc4random_uniform(3)) myLabel.text = omikuji[r] } override func update(_ currentTime: TimeInterval) { // Called before each frame is rendered }

}

polyp👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一つの例として randomOmikujiメソッドを作って結果を返すようにするというのができますね。
配列から選ばれたものを削除していき終わったら空文字が返ります。

再度はじめからやる時はomikuji配列を初期化するメソッドが必要になりますが。

swift

1private var omikuji = ["大吉","吉","凶"] 2 3private func randomOmikuji() -> String { 4 guard !omikuji.isEmpty else { return "" } 5 let r = Int.random(in: 0..<omikuji.count) 6 let result = omikuji.remove(at: r) 7 return result 8} 9 10print(randomOmikuji()) // "大吉" 11print(randomOmikuji()) // ”凶” 12print(randomOmikuji()) // ”吉” 13print(randomOmikuji()) // ""

投稿2020/08/13 10:43

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ufolooop

2020/08/15 05:13

_Kentarou様 ご丁寧なご返信ありがとうございます。 お忙しいところ大変恐縮ではございますが、上記ご教示いただいたコードを次のどこにどのように入れればいいか追加でご教示いただけますと幸甚です。 指導者がいないため正解がわからずしどろもどろしております。 よろしくお願い申し上げます。 _____ // おみくじを振る処理 func shakeOmikuji() { // 【おみくじを振るアクションをつける】 // おみくじを少し右に傾けるアクション let action1 = SKAction.rotate(toAngle: -0.3, duration: 0.2) // おみくじを少し左に傾けるアクション let action2 = SKAction.rotate( toAngle: 0.3, duration: 0.2) // おみくじをひっくり返すアクション let action3 = SKAction.rotate( toAngle: 3.14, duration: 0.2) // action1,action2,action3を指定した順番に行う let actionS = SKAction.sequence( [action1, action2, action1, action2, action1, action3]) // おみくじに「左右に振ってひっくり返すアクション」をつけて、最後にkekkaを実行する mySprite.run(actionS, completion: showOmikuji) } // 結果を表示する処理 func showOmikuji() { let omikuji = ["大吉","吉","凶"] let r = Int(arc4random_uniform(3)) myLabel.text = omikuji[r] }
_Kentarou

2020/08/15 05:45

入れるとしたら、こんな感じですかね。 コードを読んで、これは何をしている処理なのか考えることが上達する近道だと思いますので 頑張ってください。 func showOmikuji() { myLabel.text = randomOmikuji() } private var omikuji = ["大吉","吉","凶"] private func randomOmikuji() -> String { guard !omikuji.isEmpty else { return "" } let r = Int.random(in: 0..<omikuji.count) let result = omikuji.remove(at: r) return result }
ufolooop

2020/08/16 13:28

_Kentarou様 お忙しいところご対応いただきまして誠にありがとうございます! 精進してまいります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問