Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
zmx0142857
GitHub Repository: zmx0142857/mini-games
Path: blob/master/c/cube-font/0.1/fun-cube.cpp
363 views
1
/*
2
Name: Funcube_1.0
3
Author: zmx0142857
4
Version: 1.0
5
Copyright:
6
Link:
7
Description:Input 2D graphics, output 3D.
8
_____
9
/\ \
10
/::\____\
11
/:::/ /
12
/:::/ /
13
/:::/ /
14
00......00 /:::/____/
15
00......00 /::::\ \
16
00......00 /::::::\ \ _____
17
00......00 /:::/\:::\ \ /\ \
18
0000000000 -> /:::/ \:::\ /::\____\
19
0000000000 \::/ \:::\ /:::/ /
20
00......00 \/____/ \:::\/:::/ /
21
00......00 \::::::/ /
22
00......00 \::::/ /
23
00......00 /:::/ /
24
/:::/ /
25
/:::/ /
26
/:::/ /
27
\::/ /
28
\/____/
29
30
31
32
33
_____________
34
.../000\.. /::::::::\ \
35
../00000\. /::::::::::\ \
36
./0000000\ /:::/~~\:::::\____\
37
/0/...\000 /::::\~~ \:::::| |
38
00.....000 /::::::\ \::::| |
39
0000000000 -> /:::/\:::\ |:::| |
40
0000000000 \::/ \:::\ |:::| |
41
00.....000 \/____\:::\/::::| |
42
00.....000 \::::::::|____|
43
00.....000 \::::::/ /
44
/:::::/ /
45
/:::::/ /
46
/:::::/ /
47
\::::/ /
48
\::/ /
49
\/____/
50
00......00
51
00......00
52
00......00
53
00......00
54
0000000000
55
0000000000
56
00......00
57
00......00
58
00......00
59
00......00
60
61
.../000\..
62
../00000\.
63
./0000000\
64
/0/...\000
65
00.....000
66
0000000000
67
0000000000
68
00.....000
69
00.....000
70
00.....000
71
72
00000000\.
73
000000000.
74
00....\00.
75
00..../0/.
76
00000000\.
77
000000000\
78
00.....\00
79
00...../00
80
000000000/
81
00000000/.
82
*/
83
#include<iostream>
84
#include<stdlib.h>
85
using namespace std;
86
87
#define iHEIGHT 10
88
#define iWIDTH 10
89
#define THICKNESS 5
90
#define oHEIGHT iHEIGHT+iWIDTH+2
91
#define oWIDTH iHEIGHT+iWIDTH+THICKNESS
92
93
char input[iHEIGHT][iWIDTH]={'\0'};
94
char output[oHEIGHT][oWIDTH]={'\0'};
95
char unit[5][2][THICKNESS+3]={'\0'};
96
bool hasup,hasdown,hasleft,hasright; //hasleft=false 意味着左一格是'.'或没有左一格了
97
bool isconcave; //isconcave=true意味着此处是凹形,要画底线
98
/*
99
choice 0 1 2 3 4
100
101
default default default
102
103
write :\ \ :: _______ |: :| |
104
:/ / ~~~~~~~ ::\ \ |: :| |
105
THICKNESS ^^^^^
106
*/
107
void writeUnit(int row,int col,int choice);
108
109
int main()
110
{
111
//definition
112
int i,j,row,col;
113
114
unit[0][0][0]=unit[0][1][0]=':';
115
unit[0][0][1]=unit[0][0][THICKNESS+1]='\\';
116
unit[0][1][1]=unit[0][1][THICKNESS+1]='/';
117
118
unit[1][0][0]=unit[1][0][1]=':';
119
for(i=0; i<THICKNESS+2; i++)
120
unit[1][1][i]='~';
121
122
unit[2][1][0]=unit[2][1][1]=':';
123
unit[2][1][2]=unit[2][1][THICKNESS+2]='\\';
124
for(i=0; i<THICKNESS+2; i++)
125
unit[2][0][i]='_';
126
127
unit[3][0][0]=unit[3][1][0]='|';
128
unit[3][0][1]=unit[3][1][1]=':';
129
130
unit[4][0][0]=unit[4][1][0]=':';
131
unit[4][0][1]=unit[4][0][THICKNESS+1]
132
=unit[4][1][1]=unit[4][1][THICKNESS+1]='|';
133
//input
134
cout<<"Input a 2D description, using '/', '\\', '0' and '.':\n";
135
for(i=0; i<iHEIGHT; i++)
136
for(j=0; j<iWIDTH; j++)
137
cin>>input[i][j];
138
//write
139
for(i=iHEIGHT-1; i>=0; i--)
140
for(j=0; j<iWIDTH; j++)
141
{
142
//防止数组溢出,做了些“多余”的工作!
143
hasup = i!=0 && input[i-1][j]!='.' && i!=0;
144
hasdown = i!=iHEIGHT-1 && input[i+1][j]!='.' && i!=iHEIGHT-1;
145
hasleft = j!=0 && input[i][j-1]!='.' && j!=0;
146
hasright= j!=iWIDTH-1 && input[i][j+1]!='.' && j!=iWIDTH-1;
147
148
isconcave=i!=iHEIGHT-1 && j!=iWIDTH-1 && input[i+1][j+1]!='.'
149
&& (input[i][j]!='\\' || input[i+1][j+1]!='\\')
150
&& i!=iHEIGHT-1 && j!=iWIDTH-1;
151
152
row=1+i+j;
153
col=9-i+j;
154
/*
155
从input到output的坐标变换公式是:
156
row'=1+row+col
157
col'=9-row+col
158
row=(row'-col')/2 + 4
159
col=(row'+col')/2 - 5
160
*/
161
switch(input[i][j])
162
{
163
case '0':
164
writeUnit(row,col,0);
165
break;
166
case '/':
167
writeUnit(row,col, 1+ (!hasup || !hasleft));
168
break;
169
case '\\':
170
writeUnit(row,col, 3+ (!hasup || !hasright));
171
break;
172
default:
173
break;
174
}
175
}
176
//output
177
for(i=0; i<oHEIGHT; i++)
178
{
179
for(j=0; j<oWIDTH; j++)
180
cout<<output[i][j];
181
cout<<endl;
182
}
183
//pause
184
system("pause");
185
return 0;
186
}
187
188
void writeUnit(int row,int col,int choice)
189
{
190
int i,j,k;
191
192
if(choice==0 || choice==4)
193
{
194
if(!hasleft)
195
unit[choice][0][0]='/'; //左边
196
else
197
unit[choice][0][0]=':';
198
199
if(!hasleft && !hasup)
200
for(k=2; k<=THICKNESS; k++)
201
unit[choice][0][k]='~'; //画上线
202
else if(choice==0 &&
203
(
204
(!hasright && !hasup)
205
||
206
input[(row-col)/2 + 4][(row+col)/2 - 4]=='\\' //右是'\'
207
)
208
)
209
for(k=2; k<=THICKNESS; k++)
210
unit[choice][0][k]='_'; //画中线
211
else
212
for(k=2; k<=THICKNESS; k++)
213
unit[choice][0][k]=' ';
214
}
215
216
if(choice==0 || choice==2 || choice==4)
217
{
218
if(!hasdown)
219
unit[choice][1][0]='\\'; //底边
220
else
221
unit[choice][1][0]=':';
222
223
if(
224
isconcave
225
||
226
(choice==0 && !hasdown)
227
||
228
(
229
choice==4
230
&&
231
(
232
(row-col)/2 + 5==iHEIGHT
233
||
234
(row+col)/2 - 4==iWIDTH //右下出界
235
||
236
input[(row-col)/2 + 5][(row+col)/2 - 4]!='\\' //右下不是'\'
237
)
238
)
239
)
240
for(k=2; k<=THICKNESS; k++)
241
unit[choice][1][k]='_'; //画底线
242
else
243
for(k=2; k<=THICKNESS; k++)
244
unit[choice][1][k]=' ';
245
}
246
247
//打印单位
248
for(i=0; i<2; i++)
249
for(j=0; j<THICKNESS+3; j++)
250
if(row+i<oHEIGHT && col+j<oWIDTH)
251
{
252
output[row+i][col+j]=unit[choice][i][j];
253
}
254
}
255
256
#undef iHEIGHT
257
#undef iWIDTH
258
#undef THICKNESS
259
#undef oHEIGHT
260
#undef oWIDTH
261
262