Ios 设置Pong的CPU难度
第二次来这里希望有人能指引我正确的方向 我正在尝试在iOS设备(iPhone/iPod/iPad)的应用程序中实现一个乒乓球游戏,它运行得很好,只是我无法击败CPU,更不用说得分了。下面是实现.m代码: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
#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));