1. 程式人生 > >重慶賽區ACM熱身賽 8527. Do you like 玩遊戲?

重慶賽區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;
}