in reply to [OT] Perl / Computer Science Science Fair Projects
Just one other idea Mancala
The rules and a picture of the board are given here:
http://www.centralconnector.com/GAMES/mancala.html
If you are not familiar with the game, try it before you poohpooh it as too simple. The programming logic should be fairly straight forward, but still challenging and the player needs to play a clever strategy. It is more complex and unique than tic tac toe.
Advantages as a Science fair project – it can be designed and developed in stages, any of the stages would be acceptable as a project for the fair submission.
Possible steps:
1)board lay out can be in non graphic mode, using digits to represent the number of stones in each bowl. With dashes or * as separators.
2) programming can be done as a series of variables, or as an array to calculate the move results handled in either for, or while loops.
3) user input can be designated as a text entry designating the bowl whose stones should be distributed.
4) the gui representation can be added later if time permits.
Good luck to your sister in the project!
And I bet you could point her to a super place to get perl advice!
Update  here is some crude code  it uses arrays and simple control statements to create a text mancala board, allows a user to enter a bin number and then distributes the stones. Please note there are much more elegant ways to handle the situation, but I tried to keep the code concepts fairly basic so a new user could get a feel for it wihout being overwhelmed. I assume you will be helping/coaching your sister.
I would strongly suggest you and your sister play the game in the real world, to get a feel for where the code should go.
this code was developed in the following order:
1) create 2 arrays, display the board.
2) accept user input, and edit check it.
3) distribute stones code
#### don't panic this code is not complex, just repetitive
Nuff said, I hope this code may help as an idea generator.
#!/usr/bin/perl
# this program creates a text based maa board with text input
#########################################
########### DON'T PANIC
#########################################
# bins for each player (should be 7  6 bins + 1 mancala)
@p1 = (4,4,4,4,4,4,0);
@p2 = (4,4,4,4,4,4,0);
while ($in ne "Q"){
# send the routine to draw the board the number of stones in each bin
&draw_board($p1[0],$p1[1],$p1[2],$p1[3],$p1[4],$p1[5],$p1[6],
$p2[0],$p2[1],$p2[2],$p2[3],$p2[4],$p2[5],$p2[6]);
# ask for input
print "enter bin to distribute or Q to exit:";
# get keyboard input
$in = <>;
# remove the carriage return from the entry
chomp $in;
# edit check the input
# return to top of loop if Q is entered
next if ($in eq "Q");
# display error message if a non digit or bin number is out of range
# then erturn to the top of the loop
if ($in =~ /\D/  $in < 1  $in > 12){
print " bin can only be 1 through 12 or Q\n\n";
next;
}
# we have a valid entry, so distribute stones
&distribute_stones($in);
}
sub distribute_stones{
# set variable $bin to the user input bin t be distribuetd
$bin = $_[0];
# set the variable $stones_2_distribute equal to the number of stones
# in the array for player 1 or player 2 represented by the bin number
# the user entered. Then set that array entry to 0. (because all of
# the stones in that bin have been picked up to be distributed)
#
# remember  perl arrays are indexed from 0  or simply stated, the
# first entry used in a per array is number 0.
# this code is for the player 1 array (@p1)
if ($bin == 1){
$stones_2_dist = $p1[0];
$p1[0] = 0;
}
if ($bin == 2){
$stones_2_dist = $p1[1];
$p1[1] = 0;
}
if ($bin == 3){
$stones_2_dist = $p1[2];
$p1[2] = 0;
}
if ($bin == 4){
$stones_2_dist = $p1[3];
$p1[3] = 0;
}
if ($bin == 5){
$stones_2_dist = $p1[4];
$p1[4] = 0;
}
if ($bin == 6){
$stones_2_dist = $p1[5];
$p1[5] = 0;
}
# this code is for player 2 array (@p2)
if ($bin == 7){
$stones_2_dist = $p2[0];
$p2[0] = 0;
}
if ($bin == 8){
$stones_2_dist = $p2[1];
$p2[1] = 0;
}
if ($bin == 9){
$stones_2_dist = $p2[2];
$p2[2] = 0;
}
if ($bin == 10){
$stones_2_dist = $p2[3];
$p2[3] = 0;
}
if ($bin == 11){
$stones_2_dist = $p2[4];
$p2[4] = 0;
}
if ($bin == 12){
$stones_2_dist = $p2[5];
$p2[5] = 0;
}
# variable $bin_switch will help us determine where
# to start distributing stones, then will be set to 0
# so the remaining stones can be distributed in order
#
$bin_switch = $bin;
while ($stones_2_dist > 0){
# please see coding notes below
# this piece of code will only be accessed when stone distribution
# comes around the corner  it will never be the first bin a
# stone is distributed to
if ($bin_switch < 1){
$p1[0]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 2){
# add 1 to player 1 array first entry
# the folloing line is shorthand for $p1[0] = $p1[0] + 1
$p1[1]++;
$stones_2_dist; # subtract one from our pile of stones to dis
+tribute
$bin_switch = 0; # set the bin switch to zero so remainder of st
+ones can be distribnuted
}
# this line will cause control to return to the top of the
# loop, if there are no more stones to distribute, where
# the while statement will terminate the loop
next if ($stones_2_dist < 1);
if ($bin_switch < 3){
$p1[2]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 4){
$p1[3]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 5){
$p1[4]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 6){
$p1[5]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
#determine if a stone should be dropped in player 1's
#mancala (bins 16 belong to player 1)
if ($bin > 0 && $bin <7){
$p1[6]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
## begin player 2 array
# this piece of code will only be accessed when stone distribution
# comes around the corner  it will never be the first bin a
# stone is distributed to
if ($bin_switch < 7){
$p2[0]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 8){
$p2[1]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 9){
$p2[2]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 10){
$p2[3]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 11){
$p2[4]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
if ($bin_switch < 12){
$p2[5]++;
$stones_2_dist;
$bin_switch = 0;
}
next if ($stones_2_dist < 1);
#determine if a stone should be dropped in player 2's
#mancala (bins 712 belong to player 2)
if ($bin > 6 && $bin <13){
$p2[6]++;
$stones_2_dist;
$bin_switch = 0;
}
# the following line is not technically required
# but will save trouble if you ever need to add
# some code between this line and the end of the loop
next if ($stones_2_dist < 1);
}
}
sub draw_board{
# display the board
print "\n\n\n";
printf " Bin= %3d  %3d  %3d  %3d  %3d  %3d  \n\n" ,12,11,
+10,9,8,7;
printf "\n";
printf " %3d  %3d  %3d  %3d  %3d  %3d  %3d  \n" ,$_[13],$
+_[12], $_[11],$_[10],$_[9],$_[8],$_[7];
printf " +++++ \n";
printf "  %3d  %3d  %3d  %3d  %3d  %3d  %3d\n" ,$_[0],
+$_[1],$_[2],$_[3],$_[4],$_[5],$_[6];
printf "\n";
printf "\n Bin= %3d  %3d  %3d  %3d  %3d  %3d  \n\n" ,1,2,
+3,4,5,6;
}
