Message Boards Message Boards

GROUPS:

[WSC19] Creating Crossword Puzzles

Posted 10 days ago
408 Views
|
13 Replies
|
20 Total Likes
|

Early in the summer of 2019, I attended the Wolfram High School Summer Camp. I worked on a project for two weeks which generates a crossword with random words that the user can solve and check. In this post, I will give a general outline of my project, then go into detail about my though process, and finally show the finished product.

How it Works

My project is basically a grid of variables, with the variables containing strings. This may seem simple, but it isn't as easy at it looks. The tricky part is having the strings change to very specific things based on random data each time the user evaluates. This makes the words in the crossword random each time in order to truly generate new crosswords each time.


Initial Start

I started by simply trying to overlay two words, but that didn't work out well... enter image description here

After that attempt, I tried a completely different approach by using grid, variables, and then associations to make a primitive crossword with a few words in it.

Grid[Join[{{Black, Black, AsNwWord[1], Black, Black, 
    Black}}, {SmpWord}, 
  Table[{Black, Black, AsNwWord[n], Black, Black, Black}, {n, 
    RevAsNwWord[AsSmpWord[3]] + 1, Length[NwWord], 1}]], Frame -> All]

This made the nice output of the following: enter code here


Preparation

Firstly, I filtered out all profane words, just to be safe...

lotswords = Pick[WordData[], First /@ Values[
    KeyTake[Classify["Profanity", WordData[], "Probabilities"], 
     True]], p_ /; p < 0.5]

Then I defined functions to make associations and character lists for all of the words in the crossword.

charwordprep[Word_] := Flatten[Characters[Word]]
aswordprep[Word_] := 
 With[{wWord = Flatten[Characters[Word]]}, 
  AssociationThread[Range[Length[wWord]], wWord]]
hintwordprep[Word_] := 
 Part[Flatten[
   Part[WordData[StringDrop[StringDrop[ToString[Word], 1], -1], 
     "Definitions"], 1]], 2]
lengthwordprep[Word_] := ToString@Length[charwordprep[Word]]

After that, I made variables for hints, hint helpers, and the correct solution. Then came the really fun part: I made the actual crossword. This could be done with such little code; I was amazed beyond belief!

fillercross = Framed[Grid[Partition[
     MapIndexed[If[#1 == 1, BlackSquare, WhiteSquares[#2[[1]]]] &, 
      Flatten[pattern]], 10], Background -> Black], 
   Background -> Black];

This had an output that looked like a crossword and that the user could type into which stored the data: enter image description here I then created a variable that checked the solution that the user typed in by using a simple if statement.

solvecheck = Dynamic[If[
   StringReplace[ToString[input], "Null" -> " "] == 
    StringDrop[StringDrop[ToLowerCase[ToString[correctlist]], 1], -1],
    Style[colorize2["This is correct!", ColorData["Rainbow"]], Bold, 
    140], Style["Sorry... try again...", Bold, 40]]]

Final Input

After making all the variables and functions in preparation for this, I finally made the manipulate! The code follows:

Framed[Manipulate[
  Column[{
    Style["Crossword Creator!", Bold, 50],
    "",
    "",
    "Please fill the generated crossword.",
    "You can type in the words, but make sure to click on each box and
insert only one letter per box.", 
    "Fill the crossword with words which have the following HINTS: ",
    "",
    horizhintz,
    "",
    verthintz,
    "",
    HintFirstLetters,
    "",
    HintLength,
    "",
    Wordbank,
    "",
    minicross,
    "",
    fillercross,
    "",
    SolutionChecker,
    "",
    Answers ,
    "",
    Style["Thank you for playing and have a great day!" , 50, 
     Italic]}],
  {HintFirstLetters, {"" -> "Hide", 
    firstletters -> "Show"}}, {HintLength, {"" -> "Hide", 
    hintlength -> "Show"}}, {Wordbank, {"" -> "Hide", 
    wordbank -> "Show"}}, {Answers, {"" -> "Hide", 
    showanswers -> "Show"}}, {SolutionChecker, {"" -> "Not Yet", 
    solvecheck -> "Check!"}}, ImageMargins -> Large], 
 FrameMargins -> 0]

The Final Output

Here is the project's summative output:enter image description here


Reflection

Throughout the process of the development of my project, I learned a few very valuable things. I learnt that even if one sets impossible goals, with time, one will accomplish said goals. Also, I realized that hard problems can be overcome with relatively simple solutions, it's just a matter of choosing the correct approach.

I would like to thank my mentor Sylvia Haas for helping me in so many ways throughout the stressful and difficult process of making this process.

https://github.com/SimeonButtery/WSS-Template

13 Replies
Posted 10 days ago

That's very good! I think it would be nice to also add sound effects to the evaluation and different sounds when the game ended depending on the result, and perhaps also some musical tracks controllable by Manipulate. ..just a few ideas...But your work is very impressive!

Posted 10 days ago

Thank you so much! I really appreciate your feedback.

Wow! This is a great project. Can't wait to see more from you!

Posted 10 days ago

Thanks for having faith in me!

So good 10/10

Posted 10 days ago

Thanks for the support!

Posted 10 days ago

Great project!

Posted 10 days ago

I appreciate that thanks.

Awesome Project!!!!!!!

Posted 10 days ago

Thank you. I'm glad you like it.

Posted 10 days ago

This is cool, Simeon. My grandmother would love it.

Posted 10 days ago

Thats amazing. Hopefully she uses it often!

Posted 10 days ago

Awesome project! :)

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract