重庆赛区ACM热身赛 8527. Do you like 玩游戏?

本文介绍了一款由Mistariano设计的简易游戏编程挑战,玩家需控制角色在一个10x10区域内移动,通过消灭“弱子”得分。文章详细解析了游戏规则、输入输出格式,并分享了AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8527. Do you like 玩游戏?

 

【问题描述】

何花花喜欢玩游戏,他想请你设计一款以他为主角的简单游戏,满足他深邃暗黑的幻想Da☆Ze。这真的是一款简单的游戏,你要控制花花在一个10*10的区域内自由移动,玩家输入“w”,“s”,“a”,“d”分别控制角色向上下左右移动,如果输入命令“f x y”则会在区域内坐标为(x,y)的位置生成一个“弱子”,当花花移动到“弱子”的位置时就会把他抹杀并加1分。注意,判定何花花抹杀某个“弱子”,当且仅当在即将输出某帧画面时他们的坐标相同。
为了检验你设计的游戏是否合格,何花花提供了游戏开始后他输入的n个指令,你要输出游戏刚开始时和这n个指令输入过程中游戏的每一帧画面和当时的分数。

 

【输入形式】

第一行两个整数x,y,0≤x,y<10,(x,y)代表何花花出生位置的坐标。
第二行一个整数n,0<n≤1000,代表输入指令的数量。
接下来n行,输入n条指令,格式如下:
当指令为“f x y”,其中x,y为两个整数时,在即将显示的一帧于(x,y)创建一个“弱子”。如果该位置之前已存在“弱子”,则指令无效。

当指令为“w”,“s”,“a”,“d”中的一种时,分别表示角色在即将显示的一帧中向上、下、左、右移动一个单位。注意如果这个操作会导致角色穿过游戏区域四周的墙壁,则指令无效。

当指令为“q”时,什么也不会发生。

保证输入的指令只有上述三类。何花花保证每两帧间有且仅有一个指令是“w”,“s”,“a”,“d”,“q”这五个中的一种,且这个指令总是下一帧前的最后一个指令,这意味着无论是否有效,执行这五个指令中的任意一个后应该立刻输出游戏的下一帧画面和此时的分数。

 

【输出形式】

输出分t组,每组对应一帧的分数和画面。
每组第一行输出“score:”和此时分数。
第二行和第十三行输出“============”(12个“=”),代表游戏区域上下的墙壁。
第三至十二行,每行第1和第12个字符为“|”,代表游戏区域左右的墙壁;中间的每行10个共100个字符对应游戏区域中的100个位置,若该位置没有物体输出空格,若何花花在该位置输出“M”,若该位置存在“弱子”则输出“*”。
因此某组输出看起来应该是这样的:

score:0
============
|*M        |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
============

注意游戏区域的坐标系有些特别,以左上角为原点(0,0),纵向向下为x轴正方向,向右为y轴正方向,因此在上面这帧画面中,何花花(“M”)的坐标是(0,1)。
注意,不要忘了输出游戏刚开始时的那帧。

两组输出之间,请用单独的一行分隔。

 

【样例输入】

 

1 1
4
s
f 2 2
q
d

 

【样例输出】

 

score:0
============
|          |
| M        |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
============
 
score:0
============
|          |
|          |
| M        |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
============
 
score:0
============
|          |
|          |
| M*       |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
============
 
score:1
============
|          |
|          |
|  M       |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
============

 

【出题人】

当然是Mistariano我本人了Da☆Ze。

 

 

题解:这题emmm,看见有大佬交了75次。。。

三个坑:1、这个也太黑了,不知道是我的理解的问题吗,看了他这个提示,我以为f 的坐标应该是反的。。。

2、只有‘w’、‘a’、‘s’、‘d’、‘q’指令才输出动画,‘f’不输出,‘f’不输出,‘f’不输出

3、如果生成的弱子和M重合了,除非后面原地q了一下,不然是不加分的,也就是说,弱子的位置要单独用数组存

下面是AC代码:

#include"iostream"

using namespace std;
int map[10][10]={0};
int score;
int tan[10][10]={0};

void print()
{
	cout << "score:" << score << endl;
	cout << "============" << endl;
	for(int i=0;i<10;i++)
	{
		cout << "|";
		for(int j=0;j<10;j++)
		{
			if(map[i][j] == 0)
			{
				if(tan[i][j] == 0)
					cout << " ";
				else
					cout << "*"; 
			}
			else if(map[i][j] == 1)
				cout << "M";
		}
		cout << "|" << endl;
	}
	cout << "============" << endl << endl;
}

int main()
{
	int x,y;
	cin >> x >> y;
	map[x][y] = 1;
	int n;
	cin >> n;
	print();
	for(int i=0;i<n;i++)
	{
		char p;
		cin >> p;
		if(p == 'f')
		{
			int a,b;
			cin >> a >> b;
			tan[a][b]=1;
			continue;
		}
		else if(p == 'w')
		{
			if(x == 0)
			{
				print();
				continue;
			}
			map[x][y]=0;
			x--;
			map[x][y]=1;
		}
		else if(p == 'a')
		{
			if(y == 0)
			{
				print();
				continue;
			}
			map[x][y]=0;
			y--;
			map[x][y]=1;
		}
		else if(p == 's')
		{
			if(x == 9)
			{
				print();
				continue;
			}
			map[x][y]=0;
			x++;
			map[x][y]=1;
		}
		else if(p == 'd')
		{
			if(y == 9)
			{
				print();
				continue;
			}
			map[x][y]=0;
			y++;
			map[x][y]=1;
		}
		else if(p == 'q');
		
		if(tan[x][y] == 1)
		{
			tan[x][y]=0;
			score++;
		}
		print();		
	}
	return 0;
}

 

觉得有用点个赞吧,右上角哦,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值