Ios 设置Pong的CPU难度

Ios 设置Pong的CPU难度,ios,objective-c,pong,Ios,Objective C,Pong,第二次来这里希望有人能指引我正确的方向 我正在尝试在iOS设备(iPhone/iPod/iPad)的应用程序中实现一个乒乓球游戏,它运行得很好,只是我无法击败CPU,更不用说得分了。下面是实现.m代码: #import "BTM_pongGame.h" #import <QuartzCore/QuartzCore.h> #define STEP_DURATION 0.05 #define RESET_BALL_ANIMATION_DURATION 0.5f #define MARG

第二次来这里希望有人能指引我正确的方向

我正在尝试在iOS设备(iPhone/iPod/iPad)的应用程序中实现一个乒乓球游戏,它运行得很好,只是我无法击败CPU,更不用说得分了。下面是实现.m代码:

#import "BTM_pongGame.h"
#import <QuartzCore/QuartzCore.h>

#define STEP_DURATION 0.05
#define RESET_BALL_ANIMATION_DURATION 0.5f
#define MARGIN_WHERE_BALL_IS_LEAVING 40
//#define CPU_SKILL 20

@interface BTM_pongGame ()

@end

@implementation BTM_pongGame


@synthesize cpuSkill, ballShape;

- (void)viewDidLoad
{
    [super viewDidLoad];

    cpuSkill = [BT_strings getJsonPropertyValue:self.screenData.jsonVars nameOfProperty:@"cpuSkill" defaultValue:@"20"];
    ballShape = [BT_strings getJsonPropertyValue:self.screenData.jsonVars nameOfProperty:@"ballShape" defaultValue:@"1"];

    if ([ballShape  isEqual: @"1"]) {

        self.ball.layer.cornerRadius = self.ball.frame.size.width / 2;

    } else {

        //self.ball.layer.cornerRadius = self.ball.frame.size.width / 2;

    }



}


- (void) wordsPerLineInfoShowAlert {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Choose Game"
                                                    message:@"Multiplayer or Single Player? You decide! Choose below."
                                                   delegate:self
                                          cancelButtonTitle:@"Single Player"
                                          otherButtonTitles:@"Go Back",@"Multi Player", nil];

    [alert show];

}


- (void)alertView: (UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{



    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Single Player"]) {

        [self resetPlayerScoreLabels];
[self updatePlayerScoreLabels];

          self.mode = kGameSinglePlayer;
        [self moveComputerPaddle];

        //Disable panning of computer paddle
        [self.playerOne.superview setGestureRecognizers:@[]];
    [self resetBoardForNewRound];

    } else if ([title isEqualToString:@"Multi Player"]) {

[self resetPlayerScoreLabels];
[self updatePlayerScoreLabels];

        self.mode = kGameMultiPlayer;


        [self resetBoardForNewRound];

    } else if ( [title isEqualToString:@"Go Back"]){


        [self navLeftTap];

    }

}







// thanks to MrsVanBeveren for coding the reset score stuff
 -(void)resetPlayerScoreLabels
{
    playerOneScore = 0;
    playerTwoScore = 0;
}




-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self wordsPerLineInfoShowAlert];

    [self startGameTimer];
}

-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [_gameTimer invalidate];
}

-(void)quitPressed:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void)startGameTimer
{
    [_gameTimer invalidate];
    _gameTimer = [NSTimer scheduledTimerWithTimeInterval:STEP_DURATION target:self selector:@selector(step:) userInfo:nil repeats:YES];
}

#pragma mark Game setup

/*
 * Some maths to calculate a new starting direction
 * By choosing mid left/right part of the unit circle
 *  we avoid getting straight up/down directions
 */
-(void)resetBallDirection
{
    float randomUnity = arc4random_uniform(100)/100.0;
    int horizontalDirection = (arc4random() % 2 ? 1 : -1);
    float angle = M_PI_4 + randomUnity * M_PI_2;
    float direction = horizontalDirection * angle;

    dirX = sin(direction);
    dirY = cos(direction);
}

-(void)resetBoardForNewRound
{
    speed = self.view.frame.size.width / 50.0;

    [self resetBallDirection];

    [_gameTimer invalidate];

    [UIView animateWithDuration:RESET_BALL_ANIMATION_DURATION animations:^{
        self.ball.center = CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0);
    } completion:^(BOOL finished){
        [self startGameTimer];
    }];

    [self enlargeAnimation:self.ball];

}

-(void)updatePlayerScoreLabels
{
    self.playerOneScoreLabel.text = [NSString stringWithFormat:@"%d",playerOneScore];
    self.playerTwoScoreLabel.text = [NSString stringWithFormat:@"%d",playerTwoScore];
}


#pragma mark Paddle handling
- (IBAction)paddlePanned:(UIPanGestureRecognizer*)recognizer {
    UIView *paddleWrapper = recognizer.view;
    UIView *paddle = [[paddleWrapper subviews] lastObject];
    switch([recognizer state]) {
        case UIGestureRecognizerStateBegan: {
            paddle.backgroundColor = UIColor.whiteColor;
        }
            break;

        case UIGestureRecognizerStateChanged: {

            CGPoint position = [recognizer locationInView:self.view];

            CGFloat haldPaddleHeight = paddleWrapper.frame.size.height / 2.0;

            CGPoint newCenter = paddleWrapper.center;
            newCenter.y = position.y;

            newCenter.y = MAX(haldPaddleHeight, newCenter.y);
            newCenter.y = MIN(self.view.bounds.size.height - haldPaddleHeight, newCenter.y);

            paddleWrapper.center = newCenter;

        }
            break;

        case UIGestureRecognizerStateEnded: {
            paddle.backgroundColor = UIColor.grayColor;
        }
            break;

        default:
            break;
    }
}

#pragma mark Game loop

/*
 * Game loop
 *  - Moves the ball and checks for obstacles
 */
- (void)step:(NSTimer*)timer
{
    speed += 0.05;
    [self checkForBallLevingSide];

    CGPoint newCenter = self.ball.center;
    CGFloat ballRadius = self.ball.frame.size.height / 2.0;

    newCenter.x += dirX * speed;
    newCenter.y += dirY * speed;

    CGFloat upperEdge = ballRadius;
    CGFloat bottomEdge = self.view.bounds.size.height - ballRadius;

    // Bounce ball of top/bottom walls
    if (newCenter.y <= upperEdge) {
        dirY = ABS(dirY);
        newCenter.y = upperEdge;
    } else if (newCenter.y >= bottomEdge) {
        dirY = -ABS(dirY);
        newCenter.y = bottomEdge;
    }

    [UIView animateWithDuration:STEP_DURATION animations:^{
        self.ball.center = newCenter;
    }];


}

-(BOOL)didBallHitPaddle:(UIView *)paddle withinLimit:(CGFloat)limit
{
    if (CGRectIntersectsRect(paddle.frame, self.ball.frame)){
        [self deflectBallFromPaddle:paddle];
        CGRect ballFrame = self.ball.frame;
        ballFrame.origin.x = limit;
        self.ball.frame = ballFrame;
        return YES;
    } else
        return NO;
}

-(void)checkForBallLevingSide
{

    float limitLeft = MARGIN_WHERE_BALL_IS_LEAVING;
    float limitRight = self.view.bounds.size.width - self.ball.frame.size.width - MARGIN_WHERE_BALL_IS_LEAVING;

    CGRect ballFrame = self.ball.frame;
    CGFloat ballX = ballFrame.origin.x;

    if (ballX < limitLeft) {
        if (![self didBallHitPaddle:self.playerOne.superview withinLimit:limitLeft])
            [self playerDidMiss:kPlayerOne];
    }else if (ballX > limitRight) {
        if (![self didBallHitPaddle:self.playerTwo.superview withinLimit:limitRight])
            [self playerDidMiss:kPlayerTwo];
    }


}

/*
 * Calculates new dirX and dirY after the bounce.
 * The longer from the paddle's middle the bigger the result angle gets. (Pong style)
 */
-(void)deflectBallFromPaddle:(UIView *)paddle
{
    dirX *= -1;

    CGFloat diff = self.ball.center.y - paddle.center.y;
    float p = diff / paddle.frame.size.height * 2.0f;
    dirY += p * 0.5;


}


-(void)playerDidMiss:(kPlayer)player
{
    if (player == kPlayerOne) {
        playerTwoScore++;
        [self victoryShake:self.playerTwo];
        [self enlargeAnimation:self.playerTwoScoreLabel];
    }
    else if (player == kPlayerTwo) {
        playerOneScore++;
        [self victoryShake:self.playerOne];
        [self enlargeAnimation:self.playerOneScoreLabel];
    }

    [self resetBoardForNewRound];
    [self updatePlayerScoreLabels];
}

-(void)moveComputerPaddle
{
    UIView *paddle = self.playerOne.superview;
    CGPoint cpuCenter = paddle.center;
    CGFloat diff = self.ball.center.y - paddle.center.y;
    CGFloat movement = MIN((int)cpuSkill, ABS(diff));

    movement *= diff > 0 ? 1 : -1;

    cpuCenter.y += movement;

    [UIView animateWithDuration:0.1 animations:^{
        self.playerOne.superview.center = cpuCenter;
    } completion:^(BOOL b) {
        [self moveComputerPaddle];
    }];
}

#pragma mark Animation
-(void)victoryShake:(UIView *)view
{
    CAKeyframeAnimation * anim = [ CAKeyframeAnimation animationWithKeyPath:@"transform" ] ;
    anim.values = [ NSArray arrayWithObjects:
                   [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0.0f, -20.0f, 0.0f) ],
                   [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0.0f, 20.0f, 0.0f) ],
                   nil ] ;
    anim.autoreverses = YES ;
    anim.repeatCount = 4.0f ;
    anim.duration = 0.07f ;

    [view.layer addAnimation:anim forKey:nil];
}

-(void)enlargeAnimation:(UIView *)view
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)];
    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(3.0, 3.0, 1.0)];
    [animation setDuration:RESET_BALL_ANIMATION_DURATION * 0.5];
    animation.repeatCount = 1.0f ;
    [animation setAutoreverses:YES];

    [view.layer addAnimation:animation forKey:nil];
}

@end
#导入“BTM_pongGame.h”
#进口
#定义步骤_持续时间0.05
#定义重置\u球\u动画\u持续时间0.5f
#定义球离开时的边距
//#定义CPU_技能20
@接口BTM_pongGame()
@结束
@实现BTM_pongGame
@合成cpuSkill,球形;
-(无效)viewDidLoad
{
[超级视图下载];
cpuSkill=[BT_strings getJsonPropertyValue:self.screenData.jsonVars nameOfProperty:@“cpuSkill”defaultValue:@“20”];
ballShape=[BT_strings getJsonPropertyValue:self.screenData.jsonVars nameOfProperty:@“ballShape”默认值:@“1”];
如果([ballShape isEqual:@“1”]){
self.ball.layer.cornerRadius=self.ball.frame.size.width/2;
}否则{
//self.ball.layer.cornerRadius=self.ball.frame.size.width/2;
}
}
-(无效)wordsPerLineInfoShowAlert{
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“选择游戏”
信息:@“多人游戏还是单人游戏?由你决定!选择下面的内容。”
代表:赛尔夫
取消按钮:@“单人”
其他按钮提示:@“返回”,“多玩家”,无];
[警报显示];
}
-(无效)alertView:(UIAlertView*)alertView单击按钮索引:(NSInteger)按钮索引
{
NSString*标题=[alertView buttonTitleAtIndex:buttonIndex];
如果([标题isEqualToString:@“单人玩家”]){
[自动重置PlayerCoreLabels];
[self-updatePlayerScoreLabels];
self.mode=kgamesignelplayer;
[自动式电脑桨叶];
//禁用计算机挡板的平移
[self.playeron.superview setgesturecognitioners:@[];
[新一轮自复位板];
}else if([标题IsequalString:@“多玩家”]){
[自动重置PlayerCoreLabels];
[self-updatePlayerScoreLabels];
self.mode=kGameMultiPlayer;
[新一轮自复位板];
}else if([标题IsequalString:@“返回”]){
[自导航左点击];
}
}
//感谢MrsVanBeveren为重置分数编写代码
-(无效)重置PlayerCoreLabels
{
得分=0;
playerTwoScore=0;
}
-(无效)视图显示:(BOOL)动画
{
[超级视图显示:动画];
[self wordsPerLineInfoShowAlert];
[自启动计时器];
}
-(无效)视图消失:(BOOL)已设置动画
{
[超级视窗消失:动画];
[_gametimerinvalidate];
}
-(void)发送者:(id)发送者
{
[自我解除视图控制器激活:是完成:无];
}
-(无效)开始计时
{
[_gametimerinvalidate];
_gameTimer=[NSTimer scheduledTimerWithTimeInterval:STEP_DURATION target:self selector:@selector(STEP:)userInfo:nil repeats:YES];
}
#布拉格马克游戏设置
/*
*计算新起始方向的数学方法
*通过选择单位圆的中间左/右部分
*我们避免直上直下
*/
-(无效)重新设置方向
{
浮点随机单位=arc4random_均匀(100)/100.0;
int horizontalDirection=(arc4random()%2?1:-1);
浮动角度=M_PI_4+随机单位*M_PI_2;
浮动方向=水平方向*角度;
dirX=sin(方向);
dirY=cos(方向);
}
-(无效)重新设置新回合的董事会
{
速度=self.view.frame.size.width/50.0;
[自我指导];
[_gametimerinvalidate];
[UIView animateWithDuration:重置\u球\u动画\u持续时间动画:^{
self.ball.center=CGPointMake(self.view.bounds.size.width/2.0,self.view.bounds.size.height/2.0);
}完成:^(布尔完成){
[自启动计时器];
}];
[自放大动画:self.ball];
}
-(无效)updatePlayerScoreLabels
{
self.playeronescorelab.text=[NSString stringWithFormat:@“%d”,playerOneScore];
self.playerTwoScoreLabel.text=[NSString stringWithFormat:@“%d”,playerTwoScore];
}
#pragma标记桨叶处理
-(iAction)划桨平移:(UIPangestureRecognitor*)识别器{
UIView*PapperWrapper=recognizer.view;
UIView*Papper=[[PapperWrapper子视图]lastObject];
开关([识别器状态]){
案例UIgestureRecognitzerStateStart:{
pable.backgroundColor=UIColor.whiteColor;
}
打破
案例UIgestureRecognitzerStateChanged:{
CGPoint位置=[识别器位置视图:self.view];
CGFloat haldPaddleHeight=pallewrapper.frame.size.height/2.0;
CGPoint newCenter=pallewrapper.center;
newCenter.y=位置.y;
newCenter.y=最大值(haldpaddlehight,newCenter.y);
newCenter.y=MIN(self.view.bounds.size.height-haldpaddlehight,newCenter.y);
pallewrapper.center=newCenter;
}
打破
案例UIgestureRecognitzerStateEnded:{
blade.backgroundColor=UIColor.grayColor;
}
打破
违约:
打破
}
}
#布拉格马克游戏循环
/*
*游戏循环
*-移动球并检查障碍物
*/
-(无效)步骤:(NSTimer*)计时器
{
速度+=0.05;
[球边自检];
CGPoint newCenter=self.ball.center;
CGFloat ballRadius=self.ball.frame.size.height/2.0;
newCenter.x+=dirX*速度;
newCenter.y+=dirY*速度;
CGFloat upperEdge=球半径;
CGFloat BOTTEDGE=self.view.bounds.size.height-球半径;
//顶部/底部墙壁的弹跳球
if(newCenter.y=底边){
dirY=-ABS(dirY);
newCenter.y=底边;
}
[UIView animateWithDuration:步骤\持续时间动画:^{
self.ball.center=newCenter;
}];
}
-(BOOL)DIDBALLIGHT桨叶:(UIView*)桨叶不受限制:(CGFloat)限制
{
CGFloat movement = MIN((int)cpuSkill, ABS(diff));