win32强化练习3.5_弹球游戏(键盘+定时器)

弹球游戏

见程序运行图,其实就是1通过定时器使小球运动+2键盘控制下方挡板,挡住则小球反弹,挡不住则失败。


这个相当于3.1和3.3的组合体,并且增加了一些碰撞的判断,实现步骤如下:

1. 声明全局变量和常量(小球和板的坐标,小球的运动方向)

2. 处理WM_PAINT消息,选绘制小球和板,使用相对坐标(基准+偏移)

3. 处理WM_KEYDOWN消息,使板能左右移动 (左右边界偷懒没有控制)

4. 在WM_CREATE消息处理中,开启定时器

5. 最后,处理WM_TIMER消息,让小球坐标变化,并进行各种反弹判定和失败判定


int gXball, gYball, gXbat;	//小球x,y坐标;板的x坐标 
const int gYbat= 220;		//板的Y坐标不变 
int vx = 1, vy = 1;			//小球的x,y向速度 
    	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);			
			Rectangle(hdc, gXbat, gYbat, gXbat + 80, gYbat + 10);			
			Ellipse(hdc, gXball, gYball, gXball+30, gYball+30);						
			EndPaint(hwnd, &ps);
		}
		break;
		case WM_KEYDOWN:
		{
			switch(wParam)
			{
			case VK_LEFT: gXbat -= 10;	break;
			case VK_RIGHT: gXbat += 10;	break;
			default:
				break;
			}
			InvalidateRect(hwnd, NULL, TRUE);	//重绘 
		}
		break;
    	case WM_CREATE:
    		SetTimer(hwnd, 10, 10, NULL);
    		break;
   	case WM_TIMER:
		{
			RECT rt;
			GetClientRect(hwnd, &rt);
			if (gXball < 0 || gXball > rt.right - 30) vx *=-1; //左右反弹 
			if (gYball < 0) vy*= -1;			//上边界反弹 
			if (gYball + 30 == 220)				//是否碰到板反弹 
			{
				if (gXball + 15 > gXbat && gXball + 15 < gXbat + 80)
					vy *= -1;
			}
			if (gYball + 30 == rt.bottom)	//失败判定 
			{
				KillTimer(hwnd, 10);
				MessageBox(hwnd, "失败","",0);
			}
			gXball += vx;
			gYball += vy;
			InvalidateRect(hwnd, NULL, TRUE);	//重绘 
		}
		break;

由这个练习看到,基础还是和3.1和3.3是一样的,不论处理定时器还是键盘消息都是和基础相同的,只是增加了一些判断。

这一些小小的台阶,就让我们的小游戏初步的可以玩了~

基础非常重要,而基础之间的连接和组合更加的重要!





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的弹球游戏的Python代码,使用了Pygame模块: ```python import pygame import random # 初始化Pygame pygame.init() # 游戏窗口大小 WINDOW_WIDTH = 600 WINDOW_HEIGHT = 600 # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # 创建游戏窗口 WINDOW = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("弹球游戏") # 创建小球类 class Ball: def __init__(self, x, y, r, color): self.x = x self.y = y self.r = r self.color = color self.speed_x = random.randint(3, 6) self.speed_y = random.randint(3, 6) def move(self): self.x += self.speed_x self.y += self.speed_y # 检测小球是否触边界 if self.x + self.r > WINDOW_WIDTH or self.x - self.r < 0: self.speed_x = -self.speed_x if self.y + self.r > WINDOW_HEIGHT or self.y - self.r < 0: self.speed_y = -self.speed_y def draw(self): pygame.draw.circle(WINDOW, self.color, (int(self.x), int(self.y)), self.r) # 创建挡板类 class Paddle: def __init__(self, x, y, w, h, color): self.x = x self.y = y self.w = w self.h = h self.color = color def draw(self): pygame.draw.rect(WINDOW, self.color, (self.x, self.y, self.w, self.h)) def move_left(self): self.x -= 5 if self.x < 0: self.x = 0 def move_right(self): self.x += 5 if self.x + self.w > WINDOW_WIDTH: self.x = WINDOW_WIDTH - self.w # 创建小球对象和挡板对象 ball = Ball(WINDOW_WIDTH/2, WINDOW_HEIGHT/2, 10, BLUE) paddle = Paddle(WINDOW_WIDTH/2-50, WINDOW_HEIGHT-20, 100, 10, GREEN) # 游戏主循环 while True: # 响应退出事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 检测挡板移动 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: paddle.move_left() if keys[pygame.K_RIGHT]: paddle.move_right() # 移动小球 ball.move() # 检测小球和挡板是否碰撞 if ball.y + ball.r > paddle.y and ball.x > paddle.x and ball.x < paddle.x + paddle.w: ball.speed_y = -ball.speed_y # 清屏 WINDOW.fill(WHITE) # 绘制小球和挡板 ball.draw() paddle.draw() # 更新屏幕 pygame.display.update() ``` 这是一个非常简单的弹球游戏,小球会在窗口中自动反弹,并且可以用左右箭头键控制挡板移动。你可以根据自己的需要对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值