驾驶卡丁车

小Q正在设计一款2D卡丁车游戏,你的任务是帮助小Q实现其中的一部分功能。

在这款游戏中,游戏地图是一张 n 行 m 列的网格,从上到下依次编号为第 1 行到第 n 行,从左往右依次编号为第 1 列到第 m 列,其中第 i 行第 j 列的格子的坐标为 (i,j),每个格子要么是可以通行的平地,要么是不可通行的障碍。

在地图上的某个平地格子处有一辆由玩家操控的卡丁车。卡丁车的移动速率为 v,并且一共有8种可能的朝向,分别为:

  • "上":前进一步时,将从 (x,y) 移动到 (x−1,y)。
  • "下":前进一步时,将从 (x,y) 移动到 (x+1,y)。
  • "左":前进一步时,将从 (x,y) 移动到 (x,y−1)。
  • "右":前进一步时,将从 (x,y) 移动到 (x,y+1)。
  • "左上":前进一步时,将从 (x,y) 移动到 (x−1,y−1)。
  • "右上":前进一步时,将从 (x,y) 移动到 (x−1,y+1)。
  • "左下":前进一步时,将从 (x,y) 移动到 (x+1,y−1)。
  • "右下":前进一步时,将从 (x,y) 移动到 (x+1,y+1)。

一开始卡丁车朝上位于某个平地格子处,其初始移动速率为 v=0。接下来玩家将依次输入 q 条操作指令,每条操作指令是下列中的一种:

  • "L":卡丁车朝向往左转 45 度。
  • "R":卡丁车朝向往右转 45 度。
  • "U":卡丁车的速率由 v 增大至 v+1。
  • "D":卡丁车的速率由 vvv 减小至 max⁡(v−1,0)。

在执行完每条操作指令后,卡丁车都会沿着其朝向前进 v 步,在移动结束后才会继续响应后续指令。在前进的过程中,如果某一步尝试驶入某个障碍格子或者尝试驶出地图,那么说明卡丁车发生了碰撞,它将就此结束移动,在保持朝向的同时速率 v 降低为 0。特别要注意的是,当朝向是斜45度时,为了防止"穿模"现象的发生,如果卡丁车两侧都是障碍,那么卡丁车同样将被认为发生了碰撞。例如卡丁车朝向右下,现在将从 (x,y) 移动到 (x+1,y+1),那么如果 (x+1,y) 和 (x,y+1) 都是障碍,则卡丁车发生了碰撞。

请写一个程序,在执行完每条操作指令后且卡丁车完成移动之后,汇报卡丁车的坐标以及这次移动过程中是否发生了碰撞。

Input

第一行包含两个正整数 n 和 m (1≤n,m≤50),表示地图的尺寸。

接下来 n 行,第 i 行包含一个长度为 m 的字符串,其中第 j 个字符描述格子 (i,j)。如果它是".",则说明 (i,j) 是平地;如果它是"#",则说明 (i,j) 是障碍;如果它是"*",则说明 (i,j) 是平地,且卡丁车位于此。输入数据保证存在恰好一个"*"。

接下来一行包含一个正整数 q (1≤q≤500),表示指令的数量。

接下来一行包含一个长度为 q 的字符串,每个字符是四种指令中的一种,依次描述每条指令。

Output

输出 q 行,第 i 行输出执行完第 i 条指令且卡丁车完成移动之后的相关信息。如果这一次卡丁车没有发生碰撞,那么输出"x y";如果这一次卡丁车发生了碰撞,那么输出"Crash! x y"。其中 x 和 y 表示卡丁车的坐标为 (x,y)。

Example

Input

5 4
....
##..
..#.
.*..
....
12
URULLULLLLUD

Output

3 2
Crash! 3 2
Crash! 3 2
3 2
3 2
Crash! 3 2
3 2
3 2
3 2
3 2
4 3
4 3

Input

10 10
####....##
##.......#
#....##...
#...####..
#...####..
#...####..
#.........
#...####..
....####..
*...####..
16
UURUURRULUULLUUD

Output

9 1
Crash! 9 1
9 1
8 2
6 4
Crash! 6 4
6 4
7 5
7 6
7 8
Crash! 7 10
7 10
7 10
6 10
4 10
3 10

思路:

首先要记得找到卡丁车的位置之后要将其换成平地,以及横纵坐标每增加一个都要判断其有没有撞到,所以要一步一旬(函数move())。

方向可以取8的模来防止dir超出8。

#include<iostream>
using namespace std;
const int N=55,M=500;
int n,m,q;
char G[N][N],ins[M];
int sx,sy;
int v=0,dir=0;
char ch='#';
int d[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
            //上     右上   右    右下  下   左下    左     左上
bool move();
int main()
{
	scanf("%d %d",&n,&m);
	getchar();//回车符
	for(int i=0;i<n;i++)
		scanf("%s",G[i]);
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			if(G[i][j]=='*')
			{
				sx=i;
				sy=j;
				G[i][j]=ch+11;
			}
	scanf("%d",&q);
	scanf("%s",ins);
	for(int i=0;i<q;i++)
	{
		if(ins[i]=='U')
			v++;
		else if(ins[i]=='D')
		{
			v--;
			if(v<0)
				v=0;
		}
		else if(ins[i]=='R')
			dir=(dir+1)%8;
		else if(ins[i]=='L')
			dir=(dir+7)%8; 
		if(move())
			printf("%d %d\n",sx+1,sy+1);
		else
		{
			printf("Crash! %d %d\n",sx+1,sy+1);
			v=0;
		}
	}
	return 0;
}
bool move()
{
	for(int j=1;j<=v;j++)
	{
		int tx=sx+d[dir][0];
		int ty=sy+d[dir][1];
		if(tx<0||tx>=n||ty<0||ty>=m||G[tx][ty]=='#') return false;
		if((dir==1||dir==3||dir==5||dir==7)&&G[sx][ty]=='#'&&G[tx][sy]=='#') return false;
		sx=tx,sy=ty;
	}
	return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
跑跑卡丁车游戏是一款3D赛车游戏,实现起来比较复杂,需要使用到一些游戏引擎和图形库。以下提供一种基于Pygame实现的简单跑跑卡丁车游戏的实现方法。 首先,需要安装Pygame库,可以使用以下命令进行安装: ``` pip install pygame ``` 接下来,创建一个Python文件,导入Pygame库并初始化: ```python import pygame pygame.init() ``` 然后,设置窗口大小和标题: ```python WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('跑跑卡丁车') ``` 接下来,加载游戏资源,包括赛道、卡丁车、音效等: ```python track_image = pygame.image.load('track.png').convert_alpha() car_image = pygame.image.load('car.png').convert_alpha() engine_sound = pygame.mixer.Sound('engine.wav') ``` 然后,定义一些常量,如卡丁车速度、转向角度等: ```python CAR_SPEED = 5 CAR_TURN_ANGLE = 5 ``` 接下来,创建一个Car类表示卡丁车,并实现它的移动和绘制方法: ```python class Car: def __init__(self, x, y, image): self.x = x self.y = y self.image = image def move(self, dx, dy): self.x += dx self.y += dy def draw(self, surface): surface.blit(self.image, (self.x, self.y)) ``` 然后,创建一个Track类表示赛道,并实现它的绘制方法: ```python class Track: def __init__(self, image): self.image = image self.x = 0 self.y = 0 def draw(self, surface): surface.blit(self.image, (self.x, self.y)) ``` 接下来,定义游戏循环,包括事件处理、卡丁车移动和绘制、赛道绘制等: ```python clock = pygame.time.Clock() car = Car(400, 300, car_image) track = Track(track_image) engine_sound.play() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[pygame.K_UP]: car.move(0, -CAR_SPEED) if keys[pygame.K_DOWN]: car.move(0, CAR_SPEED) if keys[pygame.K_LEFT]: car.move(-CAR_SPEED, 0) if keys[pygame.K_RIGHT]: car.move(CAR_SPEED, 0) window.fill((255, 255, 255)) track.draw(window) car.draw(window) pygame.display.update() clock.tick(60) ``` 最后,运行程序,即可看到简单的跑跑卡丁车游戏。 这只是一个简单的实现方法,如果要实现更复杂的跑跑卡丁车游戏,需要使用到更多的游戏引擎和图形库,并进行更多的开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TherAndI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值