重庆赛区ACM热身赛 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。

分析

提一个坑:
当指令不是 ‘w’,‘s’,‘a’,‘d’,‘q’ 时,是不吃弱子的
这就意味着,只有每次打印前(此时位置已经改变)才判断 M 的位置与 * 位置是否重合

#include<fstream>
#include<iostream>
#define blank 0
#define player 1
#define symbol 2
int score; 
using namespace std;

int rz[10][10];  
int G[10][10];

// 获得得分 
void getScore(){
	for(int i=0;i<10;i++)
		for(int j=0;j<10;j++){
			if(rz[i][j] == symbol){ 
				if(G[i][j] == player){ 
					score++;
					rz[i][j] = blank; 
				} 
				else
					G[i][j] = rz[i][j];
			} 
	} 
}
// 输出 
void print(){
	getScore();
	cout<<"score:"<<score<<endl;
	cout<<"============"<<endl;
	for(int i=0;i<10;i++){
		cout<<"|";
		for(int j=0;j<10;j++){
			if(G[i][j] == blank)
				cout<<" ";
			else if(G[i][j] == player)
				cout<<"M";
			else if(G[i][j] == symbol)
				cout<<"*";
		}
		cout<<"|"<<endl;
	}
	cout<<"============"<<endl;
	cout<<endl; 
}
// 初始化 
void Init(){
	for(int i=0;i<10;i++)
		for(int j=0;j<10;j++){
			G[i][j] = blank;
			rz[i][j] = blank;
		}
	score = 0;
}


int main()
{
	int tmpx,tmpy;
	int x,y;
	int n;
	char ins;
	cin>>x>>y;
	cin>>n;
	Init();
	G[x][y] = player;
	print();
	for(int i=0;i<n;i++){
		cin>>ins; 
		// 生成"弱子" 
		if(ins == 'f'){ 
			cin>>tmpx>>tmpy;
			rz[tmpx][tmpy] = symbol;
		}else if(ins == 'd'){
			// 不能再右 
			if(y==9){ 
				print();
				continue;
			} 
			G[x][y] = blank;
			y++;
			G[x][y] = player;
			print();
		}else if(ins == 'a'){
			// 不能再左 
			if(y==0){ 
				print();
				continue;
			} 
			G[x][y] = blank;
			y--;
			G[x][y] = player;
			print();
		}else if(ins == 'w'){
			// 不能再上 
			if(x==0){ 
				print();
				continue;
			} 
			G[x][y] = blank;
			x--;
			G[x][y] = player;
			print();
		}else if(ins == 's'){
			// 不能再下
			if(x==9){ 
				print();
				continue;
			} 
			G[x][y] = blank;
			x++;
			G[x][y] = player;
			print();
		}else if(ins == 'q'){
			print();
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liyuanyue2017/article/details/84191715
今日推荐