打砖块

  1 //
  2 //  ViewController.m
  3 //  Blocks
  4 //
  5 //  Created by apple on 13-7-5.
  6 //  Copyright (c) 2013年 itcast. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10 #import <QuartzCore/QuartzCore.h>
 11
 12 @interface ViewController ()
 13 {
 14     // 游戏开始的标示
 15     BOOL _isPlaying;
 16
 17     // 小球的速度
 18     CGPoint _ballVelocity;
 19
 20     // 游戏时钟
 21     CADisplayLink *_gameTimer;
 22
 23     // 水平位移
 24     CGFloat _deltaX;
 25 }
 26
 27 // 时钟触发方法
 28 - (void)step:(CADisplayLink *)sender;
 29
 30 // 检测与屏幕的碰撞
 31 - (BOOL)checkWithScreen;
 32 // 检测与砖块的碰撞
 33 - (BOOL)checkWithBlocks;
 34 // 检测与挡板的碰撞
 35 - (void)checkWithPaddle;
 36
 37 // 重置游戏状态,胜利、失败
 38 - (void)resetGameStatusWithMessage:(NSString *)message;
 39
 40 @end
 41
 42 @implementation ViewController
 43
 44 - (void)resetGameStatusWithMessage:(NSString *)message
 45 {
 46     NSLog(@"%@", message);
 47
 48     [_gameTimer invalidate];
 49
 50     // 将所有的砖头设置成可见
 51     for (UIImageView *block in _blockImages) {
 52         [block setHidden:NO];
 53         // 将透明度设置为0
 54         [block setAlpha:0];
 55         [block setFrame:CGRectMake(block.center.x, block.center.y, 0, 0)];
 56     }
 57     [UIView animateWithDuration:2.0 animations:^{
 58         for (UIImageView *block in _blockImages) {
 59             // 将透明度设置为0
 60             [block setAlpha:1];
 61             [block setFrame:CGRectMake(block.center.x - 32, block.center.y - 10, 64, 20)];
 62
 63         }
 64     } completion:^(BOOL finished) {
 65         _isPlaying = NO;
 66
 67         [_ballImage setCenter:CGPointMake(160, 430)];
 68         [_paddleImage setCenter:CGPointMake(160, 450)];
 69
 70     }];
 71 }
 72
 73 // 屏幕碰撞检测
 74 - (BOOL)checkWithScreen
 75 {
 76     BOOL gameOver = NO;
 77
 78     // 左边
 79     if ([_ballImage frame].origin.x <= 0) {
 80         _ballVelocity.x = abs(_ballVelocity.x);
 81     }
 82     // 右边
 83     if ([_ballImage frame].origin.x + [_ballImage frame].size.width >= self.view.frame.size.width) {
 84         _ballVelocity.x = -1 * abs(_ballVelocity.x);
 85     }
 86     // 顶部
 87     if ([_ballImage frame].origin.y <= 0) {
 88         _ballVelocity.y = abs(_ballVelocity.y);
 89     }
 90     // 底部
 91     if ([_ballImage frame].origin.y + [_ballImage frame].size.height >= self.view.frame.size.height) {
 92         gameOver = YES;
 93     }
 94
 95     return gameOver;
 96 }
 97
 98 - (BOOL)checkWithBlocks
 99 {
100     // 砖块的碰撞检测
101     for (UIImageView *block in _blockImages) {
102         // 如果与砖块碰撞,那么隐藏砖块
103         if (CGRectIntersectsRect([block frame], [_ballImage frame])
104             && ![block isHidden]) {
105
106             [block setHidden:YES];
107
108             _ballVelocity.y = abs(_ballVelocity.y);
109
110             break;
111         }
112     }
113
114     // 判断游戏胜利
115     BOOL gameWin = YES;
116
117     for (UIImageView *block in _blockImages) {
118         if (![block isHidden]) {
119             gameWin = NO;
120             break;
121         }
122     }
123
124 //    int count = 0;
125 //    for (UIImageView *block in _blockImages) {
126 //        if ([block isHidden]) {
127 //            count++;
128 //        }
129 //    }
130 //
131 //    if (count == [_blockImages count] - 1) {
132 //        gameWin = YES;
133 //    }
134
135     return gameWin;
136 }
137
138 // 挡板的碰撞
139 - (void)checkWithPaddle
140 {
141     if (CGRectIntersectsRect([_ballImage frame], [_paddleImage frame])) {
142         _ballVelocity.y = -1 * abs(_ballVelocity.y);
143         _ballVelocity.x += _deltaX;
144     }
145 }
146
147 - (void)viewDidLoad
148 {
149     [super viewDidLoad];
150     // Do any additional setup after loading the view, typically from a nib.
151 }
152
153 - (void)didReceiveMemoryWarning
154 {
155     [super didReceiveMemoryWarning];
156     // Dispose of any resources that can be recreated.
157 }
158
159 // 时钟处理方法
160 - (void)step:(CADisplayLink *)sender
161 {
162 //    NSLog(@"运行了!!!");
163     // 检测屏幕碰撞
164     if ([self checkWithScreen]) {
165         [self resetGameStatusWithMessage:@"再来一次吧!"];
166     }
167     // 砖块的碰撞
168     if ([self checkWithBlocks]) {
169         [self resetGameStatusWithMessage:@"你真棒!"];
170     }
171     [self checkWithPaddle];
172
173     // 让小球动起来
174     [_ballImage setCenter:CGPointMake(_ballImage.center.x + _ballVelocity.x,
175                                       _ballImage.center.y + _ballVelocity.y)];
176
177 }
178
179 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
180 {
181     if (_isPlaying) {
182         UITouch *touch = [touches anyObject];
183
184         // 计算手指在水平方向的移动距离
185         _deltaX = [touch locationInView:self.view].x - [touch previousLocationInView:self.view].x;
186
187         // 修改挡板位置
188         [_paddleImage setCenter:CGPointMake([_paddleImage center].x + _deltaX, [_paddleImage center].y)];
189     }
190 }
191
192 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
193 {
194     // 如果游戏还没有开始
195     if (!_isPlaying) {
196         // 小球的初始状态
197         _ballVelocity = CGPointMake(0, -5);
198
199         // 定义时钟
200         _gameTimer = [CADisplayLink displayLinkWithTarget:self
201                                                  selector:@selector(step:)];
202
203         // 将当前时钟添加到应用循环
204         [_gameTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
205
206         // 修改游戏状态标示
207         _isPlaying = YES;
208     } else {
209         _deltaX = 0;
210     }
211 }
212
213 @end
时间: 2024-08-24 10:55:17

打砖块的相关文章

猫猫学IOS(十五)UI之曾经大热的打砖块小游戏

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44814523 原文地址:http://blog.csdn.net/u013357243?viewmode=contents !素材代码里面有我写的全部代码,注释齐全,方便学习 先看效果图 代码 //ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csd

Codevs 1257 打砖块

1257 打砖块 http://codevs.cn/problem/1257/ 题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子.如果你要敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它,若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=5

2015 IOS 学习笔记 打砖块练习以及接水果练习 ——蓝懿教育

今天我们进入做实例环节,刘国斌老师带我们做了两个小游戏,两个游戏看似简单但内包含的知识面几乎涵盖了之前所学到的所有东西,所以综合性很强,而且锻炼个人逻辑思维能力. 打砖块练习中,要再界面中添加一个砖块的矩形,两个控制砖块左右移动Button,然后在砖块之上建立一个球,使得界面开始时 球开始移动,然后碰撞到墙面反弹再碰撞反弹,直至反弹至砖块上?接住,使得球与砖块相交时再次反弹. 难点在于要考虑球反弹至墙壁后如何反弹,解决方法是给球设置一个移动速度speed,让这个speed是个数值类型,碰到墙壁,

打砖块(codevs 1257)

题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,--最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,--i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子.如果你要敲掉第i层的第j块砖的话,若i=1,你可以直接敲掉它,若i>1,则你必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=50)层的砖块堆中,敲掉(m<=500)块砖,使得被敲掉的这些砖块的价值总和

bzoj1112[POI2008]砖块Klo*

bzoj1112[POI2008]砖块Klo 题意: N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:丢掉某柱砖的一块砖.给某柱加上一块砖,现在希望用最小次数的动作完成任务.N≤100000 题解: 设一个区间长度为k,其中位数为a,比a小的元素个数为b,和为c:比a大的元素个数为d,和为e.则题目要求维护一个长度为k的滑动窗口,能求出它的b*a-c+e-d*a.故用一个维护sum,size两个值的treap来维护.然而似乎我想复杂了?比所有人代码都大1k!注意要开long

HNOI 2004 打砖块 动态规划

题意: 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,--,最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,--,i,第i层的第j块砖有一个价值a[i,j](a[i,j]<=50).下面是一个有5层砖块的例子: 如果要敲掉第i层的第j块砖的话,若i=1,可以直接敲掉它,若i>1,则必须先敲掉第i-1层的第j和第j+1块砖. 你的任务是从一个有n(n<=50)层的砖块堆中,敲掉(m<=500)块砖,使得被敲掉的这些砖块的价值总和最大. 方法:动态规划 解

IOS 开发入门—打砖块小游戏

忙着期末考试,读书笔记断更了~ ios 游戏处女作—demo 游戏规则 屏幕上方有四排砖块 点击屏幕开始游戏 游戏开始时,小球向上方运行 小球与砖块撞击可以撞碎砖块并反弹 小球与屏幕顶部.右侧.左侧碰撞会反弹 小球与挡板碰撞会反弹 左右移动手指可以挪动挡板 小球从屏幕下方掉出游戏结束 撞碎所有砖块游戏胜利 手机游戏的使用习惯 除非是非常出色的游戏或者游戏模式所迫,否则最好使用竖版的模式,适合用户单手操作手机,比较方便.而 iPad 则最好使用横版. 游戏类的屏幕一般要把手机上面的状态栏隐藏.不同

BZOJ 1112: [POI2008]砖块Klo

1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1736  Solved: 606[Submit][Status][Discuss] Description N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另一柱.仓库无限大. 现在希望用最小次数的动作完成任务. Input 第一行给出N,K. (1 ≤ k ≤ n ≤

luogu 1437 敲砖块(DP)

这道题的DP的状态设计的很有想法啊. 假如我们一行一行来选择的话,状态将会极其复杂. 如果一列一列来看的话,比如你想选aij,那么第i列的前j个都要选,并且第i+1列的前j-1个都要选. 于是状态就很好设计了,定义dp[n][i][j]表示还剩下n个要选的砖块,当前选择第i列的前j个所能达到的最大分值. 那么dp[n][i][j]=max(dp[n-j][i+1][k]+sum[i][j])(j-1<=k<=n-i). 记忆化搜索一下就OK了. # include <cstdio>