Sie sind vermutlich noch nicht im Forum angemeldet - Klicken Sie hier um sich kostenlos anzumelden Impressum 
Sie können sich hier anmelden
Dieses Thema hat 96 Antworten
und wurde 7.148 mal aufgerufen
 Bugreports & Suggestions
Seiten 1 | 2 | 3 | 4 | 5 | 6 | 7
Scotty Offline

Administrator


Beiträge: 3.777

10.09.2020 08:27
#91 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

Zitat von Raman im Beitrag #90
What are obvious issues that you would find in any dictionary that would be provided to you for uploading to sourceforge page?

I check for duplicates and used letters. If English, for example, contains not just A..Z but 1,!,) there is likely a typo somewhere.
Zitat von Raman im Beitrag #90
Who are unauthorized persons and what do you mean by abusing the dictionary in terms of an open source project?

If the author wishes his work to be used in Scrabble3D only s/he can do so. Abusing means for example to commercially exploit the hard work of compiling a good dictionary but third parties.
Zitat von Raman im Beitrag #90
If I prepare and give you a much better version of math.dic, then would you be interested to upload that in sourceforge page to share that with everyone else in the world on top of another existing math.dic that is already existing on sourceforge page that is prepared by someone else?

Sure, ideally you get in contact with the original author. Otherwise I would take your "much better version" opinion without hesitation if there is another user's word. In case of math.dic it's not too difficult to check myself.


Download: Sourceforge | Help:Wiki | Discussion: Forum | News: Twitter | Fanship: Facebook | IRC: Freenode #scrabble3d

Bussinchen Offline




Beiträge: 90

10.09.2020 08:59
#92 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

Zitat von Raman im Beitrag #90
Word puzzles thread in General Forum in English group in this forum could just be made use of simply for English Scrabble puzzles and that this thread or elsewhere for non-English Scrabble puzzles.
Or that would new thread over thereby would be good enough exclusively for that?

As you write in English, I think it is okay if you start a new thread here in the English section on General and call it "Maths Scrabble Puzzles".

Raman Offline




Beiträge: 167

10.09.2020 11:06
#93 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

Some clarifications about your wordings in your forum posts:

Zitat von Scotty im Beitrag Tamil Scrabble
Don't find obvious issues with the dictionary. But since you replace every character my sanity checks don't bite. Some minor issues: I'm not happy with 1k tiles. It's easier to multiply the number (there is a control on top of the list) than shrinking. Maybe you have numerous rarely used characters that need a frequency of zero, which would multiply to n in that case. But even then, isn't it easier to adjust these zeros to ones? Perhaps I'm wrong and you cannot play classic Scrabble at all and need super large boards.

Besides this, may I use your name and email address in the header? Credits and questions belong to the author.

What do you mean by 'my sanity checks don't bite'?
By the way, why do you use 1k tiles instead of 1000 tiles?
Zitat von Scotty im Beitrag #75
>version of Lazarus IDE and FreePascal
Try with 2.4, not sure. And perhaps Lazarus ~1.0, but if you compile from source it might be not so crucial.

What do you mean by 'it might not be so crucial'?
Zitat von Scotty im Beitrag #77
Sorry, it's not possible to have a letter more than once on the distribution table. And actually I think it would over-randomize the game.

What do you mean by 'it would over-randomize the game'?

Superscript equals (⁼) is used in maths dictionary instead of ASCII character of = because ASCII character of = is a reserved symbol in dictionaries.
Earlier on modular congruent to symbol (≡) was used in place of superscript equals (⁼) to serve for that purpose, as it can be seen in earlier posts in 'Maths Scrabble implemented' thread in 'More languages' forum in 'International' group in this forum and in Wikipedia page for Scrabble letter distributions.
Right now that in maths dictionary, superscript equals (⁼) is used, because it looks much better than even subscript equals (₌), as it can be seen by anyone whoever downloads Scrabble3D application with maths dictionary and plays a game of Maths Scrabble in it, with its own default letter distribution or player's own modification of letter set of Maths Scrabble according to their own wishes, depending upon or not, whether meaningless, useless and incorrect symbols such as those like ∞, < and > are removed from letter set of Maths Scrabble according to their own wishes.
Anyway that ≡, ⁼, ₌ are non-ASCII special characters and not be supported by making use of keyboard or even by making use of on screen keyboard for any of operating systems because of the fact that it is not even part of Latin Supplement category of character set or Latin Extended A category of character set or Latin Extended B category of character set.

Reserved symbols in dictionaries, that cannot be made use of for in dictionary words, include that of:
= separator between word and meaning in dictionaries and separator between placed words and other attributes in saved game files.
; separator between meaning and category in dictionaries and separator between placed word and connected words in saved game files.
, separator between attributes in saved game files.
? made use of for jokers in saved game files until a letter is assigned for it during play (whenever that tile appears on rack and a letter is assigned for it during play either by making use of human players or computer players).
, and ? symbols are not used in dictionaries but only in saved game files, so that confusion can be caused for computer whenever that making use of Scrabble3D application while in process of writing to saved game files and reading from saved game files, ever.
On the other hand that ! symbol is only made use of in Scrabble3D application as a placeholder for not yet shown random tile chosen at the start of played game that are not shown to players until they come to player's rack and not shown to opponent players from a player's rack until that tile is placed upon Scrabble board (why is that so?) that is displayed as tooltip text whenever mouse hovers upon Scrabble3D application area to display all of tiles that are remaining in bag and that can switch over upon to display between player's scores, number of tiles that are remaining in bag and amount of time that is left for each of players.
In any case that ! symbol is not part of reserved symbols in dictionaries and saved game files and can be made use of for in dictionary words. So that it can also be made use of for in replace characters in dictionaries without any doubt that it would not work out while in process of writing to saved game files and reading from saved game files. In Maths dictionary, it is made use of for in factorial symbol and so that I also bravely used without any of type of doubt as a replace symbol in my own prepared version of Tamil dictionary, whether making use of digraph tiles and trigraph tiles or not for representing each of 1 single letter in Tamil language by itself.

Any random tile configured in played game in Scrabble3D application is assigned a letter at the start of played game and so that is assigned while in process of writing to saved game files and reading from saved game files.
Only that specific and particular letter is not shown to players at start of played game and ! symbol is displayed as tooltip text whenever that mouse hovers upon Scrabble3D application area to display all of tiles that are remaining in bag ever.

What if Scrabble game that is started to be played is saved at the start of the played game, then such mystery tiles would be openly known to all of types of players that are reading it and that human players as well as computer players would be available to play offline. Knowing random seed would let know sequence of tile generation in Scrabble3D application by making use of computer program (easy) or by making use of manual calculation (difficult) if a human player whoever would be playing offline allows and permits other human players and themselves to just do that simply.
Online games that can be played only with other human players and not with other computer players does not allow saving of games played until they are completed. Best move calculation and seeing other player's racks are disabled until game played is completed, so is also seeing meanings of dictionary words whenever mouse hovers over upon any of type of placed word in any of type of language upon Scrabble board if challenge state is enabled until game played is completed. Online games played will be stored in server that would be visible to ordinary online players for 14 days since the last move had been made and after that they would be archived and that they would be made visible to ordinary online players only by the Scrabble3D application administrators and not by making use of any of type of ordinary online players.

Raman Offline




Beiträge: 167

25.10.2020 18:40
#94 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

Zitat von Scotty im Beitrag #29

Zitat von Raman
Does it always look out for ways to push away as much as tiles as possible while not allowing high scoring and rarely used letters to stagnate in its rack?


If the Computer wins the game (more points than opponent) it places as much letters as possible. Otherwise as much points.


I don't think that is literally true.

Consider the following board position, at the endgame, when there are no more tiles left in the bag.
When computer evaluated for the best move and when it is computer's turn to play at its strongest level, the best move for play by computer at its strongest level comes to merely 14 points, which is 7 = 7 - 0 at the rightmost column.
But there is another move which scores 108 points and pushes more tiles than 7 = 7 - 0.
But that move is only fourth in the best move list out of 5. Why is it so?

Attached Equate400.txt saved game file for your own reference. Please rename it to Equate400.ssg before experimenting it by yourself.
Also that equate.dic is too large to be attached here. It can be shared by a link after uploading it on Google Drive, but anyway that I am sharing my python script from which you can generate yourself by running Python 2.7.

equate.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
 
num = [1, 1, 2, 1, 3, 1, 2, 3, 4, 1, 5, 1, 2, 3, 4, 5, 6, 1, 3, 5, 7, 1, 2, 4, 5, 7, 8, 1, 3, 7, 9, 1, 5, 7, 11, 0]
den = [2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 12, 12, 12, 12, 1]
sym = ['#', '$', '&', '(', ')', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '%', ':', '^', '.', '!']
conj = [0, 2, 1, 4, 3, 8, 7, 6, 5, 10, 9, 16, 15, 14, 13, 12, 11, 20, 19, 18, 17, 26, 25, 24, 23, 22, 21, 30, 29, 28, 27, 34, 33, 32, 31, 35]
m = ["\xe2\x81\xb0", "\xc2\xb9", "\xc2\xb2", "\xc2\xb3", "\xe2\x81\xb4", "\xe2\x81\xb5", "\xe2\x81\xb6", "\xe2\x81\xb7", "\xe2\x81\xb8", "\xe2\x81\xb9"]
n = ["\xe2\x82\x80", "\xe2\x82\x81", "\xe2\x82\x82", "\xe2\x82\x83", "\xe2\x82\x84", "\xe2\x82\x85", "\xe2\x82\x86", "\xe2\x82\x87", "\xe2\x82\x88", "\xe2\x82\x89"]
d = {}
for j in range(len(sym) - 1):
d[(num[j], den[j])] = sym[j]
def superscript(s):
a = ""
for c in s:
a += m[ord(c) - 48]
return a
def subscript(t):
b = ""
for d in t:
b += n[ord(d) - 48]
return b
def gcd(p, q):
while q > 0:
(p, q) = (q, p % q)
return p
def string(nu, de):
result = ''
if nu >= de or nu == 0:
result += str(nu / de)
if nu % de > 0:
result += d[(nu % de, de)]
return result
def terms(nu, de):
result = 0
if nu >= de or nu == 0:
result += len(str(nu / de))
if nu % de > 0:
result += 1
return result
print '[Header]'
print 'Version=100000'
print 'Author=Raman Viswanathan <raman22feb1988@gmail.com>'
print 'StandardCategory=Equalities'
print 'Licence=GNU General Public License, v3'
print 'Release=24.10.20'
print 'Comment=Equate game style of Scrabble with mathematical equations'
print 'Letters=@,0,1,2,3,4,5,6,7,8,9,-,*,/,+,#,$,&,(,),A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,%,:,^,.'
print 'Values=1,2,1,1,2,2,3,3,4,3,4,4,3,3,4,5,6,6,5,5,8,8,8,8,7,7,10,10,10,10,10,10,8,8,8,8,10,10,10,10,10,10,9,9,9,9,9,9,9,9'
print 'Counts=36,8,10,9,8,8,8,8,7,7,7,7,11,11,7,4,2,2,2,2,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1'
print 'Key='
print '[Replace]'
print '-=\xe2\x88\x92'
print '*=\xc3\x97'
print '/=\xc3\xb7'
print '@=\xe2\x81\xbc'
for i in range(len(sym) - 1):
print sym[i] + '=' + superscript(str(num[i])) + '/' + subscript(str(den[i]))
print '[Categories]'
print '1=Addition'
print '2=Subtraction'
print '3=Multiplication'
print '4=Division'
print '[Words]'
for k in range(10000):
print str(k) + '@' + str(k) + '='
for k in range(100):
for l in range(len(sym) - 1):
print (str(k), '') [k == 0] + d[(num[l], den[l])] + '@' + (str(k), '') [k == 0] + d[(num[l], den[l])] + '='
for k in range(10):
for l in range(len(sym) - 1):
for o in range(10):
for r in range(len(sym) - 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * w + u * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11 or y % z == 0:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '+' + string(v, w) + '@' + string(y, z) + '=;1'
print string(y, z) + '@' + string(t, u) + '+' + string(v, w) + '=;1'
print string(y, z) + '-' + string(t, u) + '@' + string(v, w) + '=;2'
print string(v, w) + '@' + string(y, z) + '-' + string(t, u) + '=;2'
for k in range(100):
for l in range(len(sym) - 1, len(sym)):
for o in range(100):
for r in range(len(sym) - 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * w + u * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '+' + string(v, w) + '@' + string(y, z) + '=;1'
print string(y, z) + '@' + string(t, u) + '+' + string(v, w) + '=;1'
print string(y, z) + '-' + string(t, u) + '@' + string(v, w) + '=;2'
print string(v, w) + '@' + string(y, z) + '-' + string(t, u) + '=;2'
for k in range(100):
for l in range(len(sym) - 1):
for o in range(100):
for r in range(len(sym) - 1, len(sym)):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * w + u * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '+' + string(v, w) + '@' + string(y, z) + '=;1'
print string(y, z) + '@' + string(t, u) + '+' + string(v, w) + '=;1'
print string(y, z) + '-' + string(t, u) + '@' + string(v, w) + '=;2'
print string(v, w) + '@' + string(y, z) + '-' + string(t, u) + '=;2'
for k in range(100):
for l in range(len(sym) - 1):
for o in range(100):
for r in range(conj[l], conj[l] + 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * w + u * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '+' + string(v, w) + '@' + string(y, z) + '=;1'
print string(y, z) + '@' + string(t, u) + '+' + string(v, w) + '=;1'
print string(y, z) + '-' + string(t, u) + '@' + string(v, w) + '=;2'
print string(v, w) + '@' + string(y, z) + '-' + string(t, u) + '=;2'
for k in range(1000):
for o in range(1000):
y = k + o
if len(str(k)) + len(str(o)) + len(str(y)) <= 7:
print str(k) + '+' + str(o) + '@' + str(y) + '=;1'
print str(y) + '@' + str(k) + '+' + str(o) + '=;1'
print str(y) + '-' + str(k) + '@' + str(o) + '=;2'
print str(o) + '@' + str(y) + '-' + str(k) + '=;2'
for k in range(100):
for l in range(len(sym) - 1):
for o in range(100):
for r in range(len(sym) - 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '*' + string(v, w) + '@' + string(y, z) + '=;3'
print string(y, z) + '@' + string(t, u) + '*' + string(v, w) + '=;3'
print string(y, z) + '/' + string(t, u) + '@' + string(v, w) + '=;4'
print string(v, w) + '@' + string(y, z) + '/' + string(t, u) + '=;4'
for k in range(100):
for l in range(len(sym) - 1, len(sym)):
for o in range(100):
for r in range(len(sym) - 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '*' + string(v, w) + '@' + string(y, z) + '=;3'
print string(y, z) + '@' + string(t, u) + '*' + string(v, w) + '=;3'
if k > 0:
print string(y, z) + '/' + string(t, u) + '@' + string(v, w) + '=;4'
print string(v, w) + '@' + string(y, z) + '/' + string(t, u) + '=;4'
for k in range(100):
for l in range(len(sym) - 1):
for o in range(100):
for r in range(len(sym) - 1, len(sym)):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) <= 6:
print string(t, u) + '*' + string(v, w) + '@' + string(y, z) + '=;3'
print string(y, z) + '@' + string(t, u) + '*' + string(v, w) + '=;3'
print string(y, z) + '/' + string(t, u) + '@' + string(v, w) + '=;4'
print string(v, w) + '@' + string(y, z) + '/' + string(t, u) + '=;4'
for k in range(1, 100):
for l in range(len(sym) - 1, len(sym)):
for o in range(100):
for r in range(len(sym) - 1):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) == 7:
print string(t, u) + '*' + string(v, w) + '@' + string(y, z) + '=;3'
print string(y, z) + '@' + string(t, u) + '*' + string(v, w) + '=;3'
if k > 0:
print string(y, z) + '/' + string(t, u) + '@' + string(v, w) + '=;4'
print string(v, w) + '@' + string(y, z) + '/' + string(t, u) + '=;4'
for k in range(100):
for l in range(len(sym) - 1):
for o in range(1, 100):
for r in range(len(sym) - 1, len(sym)):
t = den[l] * k + num[l]
u = den[l]
v = den[r] * o + num[r]
w = den[r]
y = t * v
z = u * w
g = gcd(y, z)
y /= g
z /= g
if z > 12 or z == 11:
continue
if terms(t, u) + terms(v, w) + terms(y, z) == 7:
print string(t, u) + '*' + string(v, w) + '@' + string(y, z) + '=;3'
print string(y, z) + '@' + string(t, u) + '*' + string(v, w) + '=;3'
print string(y, z) + '/' + string(t, u) + '@' + string(v, w) + '=;4'
print string(v, w) + '@' + string(y, z) + '/' + string(t, u) + '=;4'
for k in range(1, 1000):
for o in range(1, 1000):
y = k * o
if len(str(k)) + len(str(o)) + len(str(y)) <= 8:
print str(k) + '*' + str(o) + '@' + str(y) + '=;3'
print str(y) + '@' + str(k) + '*' + str(o) + '=;3'
print str(y) + '/' + str(k) + '@' + str(o) + '=;4'
print str(o) + '@' + str(y) + '/' + str(k) + '=;4'
print '0*0@0=;3'
print '0@0*0=;3'
for k in range(1, 10000):
print '0*' + str(k) + '@0=;3'
print '0@0*' + str(k) + '=;3'
print str(k) + '*0@0=;3'
print '0@' + str(k) + '*0=;3'
print '0/' + str(k) + '@0=;4'
print '0@0/' + str(k) + '=;4'
for l in range(len(sym) - 1):
k = range(0, 1000, den[l])
for r in range(len(k)):
y = k[r] * num[l] / den[l]
z = k[r]
if z >= 100:
print sym[l] + '*' + str(z) + '@' + str(y) + '=;3'
print str(z) + '*' + sym[l] + '@' + str(y) + '=;3'
print str(y) + '@' + sym[l] + '*' + str(z) + '=;3'
print str(y) + '@' + str(z) + '*' + sym[l] + '=;3'
print str(y) + '/' + str(z) + '@' + sym[l] + '=;4'
print str(y) + '/' + sym[l] + '@' + str(z) + '=;4'
print sym[l] + '@' + str(y) + '/' + str(z) + '=;4'
print str(z) + '@' + str(y) + '/' + sym[l] + '=;4'
 


By the way that if joker is exchanged for the same letter on the board, as in B21 square in this board position, the star should disappear. But here it does not happen to be the case. Why is it so?
Also that the turn does not get ended for me if I exchange the joker with the same letter on the board, as it says so in the configuration settings page and Scrabble3D application's wiki page. Why is it so?

By the way that it is only possible for human players to exchange joker with the same letter on the board or convert at most one tile to a joker per turn in What-If-Only variant. I hope that you are just aware of that simply, but that you do not take that as a serious issue, because it counteracts with the skill level of the computer players playing the highest scoring plays ever.
The computer players do not do that. Why is it so?

Dateianlage:
Equate400.txt
Scotty Offline

Administrator


Beiträge: 3.777

26.10.2020 09:32
#95 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

Can tell only what was intended: place as much letters as possible. And the computer can exchange tiles, it just depends on settings and situation. Not sure though if this applies to whatif as well.


Download: Sourceforge | Help:Wiki | Discussion: Forum | News: Twitter | Fanship: Facebook | IRC: Freenode #scrabble3d

Flora Offline



Beiträge: 2

29.11.2023 19:49
#96 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

I have been unable to enter to the network for about a week. It says "too many accounts". What happened?!

Scotty Offline

Administrator


Beiträge: 3.777

30.11.2023 08:42
#97 RE: Unfixed bugs in Scrabble3D application. Zitat · Antworten

You cannot create another account from your computer. Please re-activate one of those you have.
(Feel free to ask for your password in private)


Download: Version 4 | Help:Wiki | Discussion: Forum | News: Mastodon | Fanship: Facebook

Seiten 1 | 2 | 3 | 4 | 5 | 6 | 7
 Sprung  
Xobor Forum Software von Xobor.de
Einfach ein Forum erstellen
Datenschutz