3D黑白棋 StarReversi

组对编程---3D黑白棋 发布

这是一个用silverlight编写的3D程序,可以360°变化视角,展开/收缩棋盘,实现了标准黑白棋股则及扩展股则(棋盘左右两边连通)

游戏有AI功能,有回放功能,回放过程中可以进入下棋模式

游戏链接:

http://home.ustc.edu.cn/~sqren/(墙内可用)

http://dl.dropbox.com/u/15667321/Reversi3D.html (墙外可用)

下载链接:

https://sites.google.com/site/starreversi/StarReversi.zip (墙外可用)

http://dl.dropbox.com/u/15667321/StarReversi.zip (墙外可用)

http://home.ustc.edu.cn/~sqren/StarReversi.zip (墙内可用)

 

 

 

code:

xmal:

 

代码
<UserControl x:Class="Reversi3D.MainPage"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Execution
="clr-namespace:Balder.Execution;assembly=Balder"
xmlns:Flat
="clr-namespace:Balder.Objects.Flat;assembly=Balder"
xmlns:View
="clr-namespace:Balder.View;assembly=Balder"
xmlns:Geometries
="clr-namespace:Balder.Objects.Geometries;assembly=Balder"
xmlns:Lighting
="clr-namespace:Balder.Lighting;assembly=Balder"
xmlns:Materials
="clr-namespace:Balder.Materials;assembly=Balder"
xmlns:Animation
="clr-namespace:Balder.Animation.Silverlight;assembly=Balder"
xmlns:Objects
="clr-namespace:Balder.Objects;assembly=Balder"
mc:Ignorable
="d"
d:DesignHeight
="600" d:DesignWidth="800">

<Grid x:Name="LayoutRoot" Background="Silver" MouseWheel="Grid_MouseWheel" KeyDown="LayoutRoot_KeyDown" KeyUp="LayoutRoot_KeyUp">

<Grid.Resources>
<Materials:Material x:Name="WhiteMaterial" x:Key="WhiteMaterial" ReflectionMap="/Reversi3D;component/image/laughstar.jpg"/>
<Materials:Material x:Name="BlackMaterial" x:Key="BlackMaterial" ReflectionMap="/Reversi3D;component/image/bluestar.png"/>
<Materials:Material x:Name="StarReversiMaterial" x:Key="StarReversiMaterial" DiffuseMap="/Reversi3D;component/image/starreversi.jpg"/>
<Materials:Material x:Name="YouWinMaterial" x:Key="YouWinMaterial" DiffuseMap="/Reversi3D;component/image/youwin.jpg"/>
<Materials:Material x:Name="YouLoseMaterial" x:Key="YouLoseMaterial" DiffuseMap="/Reversi3D;component/image/youlose.jpg"/>
<Materials:Material x:Name="GameOverMaterial" x:Key="GameOverMaterial" DiffuseMap="/Reversi3D;component/image/gameover.jpg"/>

<!-- <EventTrigger x:Key ="event" RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard x:Name="boxopacity" RepeatBehavior="Forever">
<Animation:StoryboardExtensions.CoordinateAnimation>
<Animation:CoordinateAnimation To="100,100,100" Duration="00:00:05" TargetName="bb" TargetProperty="(Node.Position)"/>
</Animation:StoryboardExtensions.CoordinateAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>-->

<!--<Storyboard x:Name="leftrotation" RepeatBehavior="Forever">
<Animation:StoryboardExtensions.CoordinateAnimation>
<Animation:CoordinateAnimation From="0,0,359" To="0,0,0" Duration="00:00:05" TargetName="group" TargetProperty="(Node.Rotation)"/>
</Animation:StoryboardExtensions.CoordinateAnimation>-->
</Grid.Resources>

<Execution:Game Width ="800" Height="600">
<Execution:Game.Skybox>
<Objects:Skybox IsEnabled ="True"
Front
="/Reversi3D;component/image/star/3.jpg"
Back
="/Reversi3D;component/image/star/1.jpg"
Left
="/Reversi3D;component/image/star/2.jpg"
Right
="/Reversi3D;component/image/star/5.jpg"
Top
="/Reversi3D;component/image/star/6.jpg"
Bottom
="/Reversi3D;component/image/star/4.jpg"

/>
</Execution:Game.Skybox>
<Execution:Game.Camera>
<View:Camera x:Name="cCamera" Position="0, 0, -190" Target="0, 0, 0"/>
</Execution:Game.Camera>

<Lighting:OmniLight Position="300, 400, 400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="300, 400, -400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="300, -400, 400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="300, -400, -400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="-300, 400, 400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="-300, 400, -400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="-300, -400, 400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>
<Lighting:OmniLight Position="-300, -400, -400" Ambient="Black" Diffuse="White" Specular= "boxopacity" Strength="0.3"/>


<Geometries:Geometry x:Name="group" Height="600" Width="800" InteractionEnabled ="True" MouseLeftButtonDown="group_MouseLeftButtonDown" MouseLeftButtonUp="group_MouseLeftButtonUp">
</Geometries:Geometry>

</Execution:Game>


<Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="80"/>
<RowDefinition Height="20"/>
<RowDefinition Height="280"/>
</Grid.RowDefinitions>

<TextBlock Text="Reversi Mode" Grid.Column="0" Grid.Row="1"/>
<ComboBox x:Name="ModeComboBox" Grid.Column="0" Grid.Row="2" SelectedIndex="1">
<ComboBoxItem Content="Normal"/>
<ComboBoxItem Content="Extended"/>
</ComboBox>

<TextBlock Text="Player Number" Grid.Column="0" Grid.Row="3"/>
<ComboBox x:Name="PlayerNumberComboBox" Grid.Column="0" Grid.Row="4" SelectedIndex="0">
<ComboBoxItem Content="Single"/>
<ComboBoxItem Content="Double"/>
</ComboBox>

<Button x:Name="StartButton" Content="Start" Grid.Column="0" Grid.Row="6" Click="StartButton_Click">
</Button>

<Button x:Name="EndThisGame" Content="End" Grid.Column="0" Grid.Row="8" IsEnabled="False" Click="EndThisGame_Click">
</Button>


<Grid x:Name="_infoBox" Grid.Column="0" Grid.Row="10">

<Grid.RenderTransform>
<TranslateTransform x:Name="_infoBoxTranslation"/>
</Grid.RenderTransform>
<Grid.Background>
<SolidColorBrush Opacity="0.5" Color="Gray"/>
</Grid.Background>
<Border BorderBrush="White" BorderThickness="1">
<TextBlock Foreground="White">
<Run x:Name="_player1name"/><Run>:</Run>
<Run x:Name="_player1sorce"/><LineBreak/>
<Run x:Name="_player2name"/><Run>:</Run>
<Run x:Name="_player2sorce"/><LineBreak/>
<Run>Result:</Run>
<Run x:Name="_result"/><LineBreak/>
</TextBlock>
</Border>
</Grid>
<Grid x:Name="_ruleBox" Grid.Column="0" Grid.Row="12">

<Grid.RenderTransform>
<TranslateTransform x:Name="_ruleBoxTranslation"/>
</Grid.RenderTransform>
<Grid.Background>
<SolidColorBrush Opacity="0.5" Color="Gray"/>
</Grid.Background>
<Border BorderBrush="White" BorderThickness="1">
<TextBlock TextWrapping="Wrap" Grid.Column="0" Grid.Row="12">
模式说明:
<LineBreak/>
Normal
--标准黑白棋棋规则<LineBreak/>
Extended
--棋盘左右两边连通<LineBreak/>
操作说明:
<LineBreak/>
‘W’,’A’,’S’,’D’
--调整视角<LineBreak/>
‘Z’
--展开/收缩棋盘<LineBreak/>
鼠标滚轮—改变视距远近
<LineBreak/>
鼠标拖动棋盘改变视角
<LineBreak/>
PS:利用Replay中的Playnow功能,您可以换下AI的棋:)
</TextBlock>
</Border>
</Grid>
</Grid>

<Grid HorizontalAlignment="Right" VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="10"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
<RowDefinition Height="20"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<TextBlock TextWrapping="Wrap" Grid.Column="0" Grid.Row="2">Replay Control</TextBlock>
<Button x:Name="ReplayButton" Content="Replay" Grid.Column="0" Grid.Row="4" IsEnabled="False" Click="ReplayButton_Click">
</Button>
<Button x:Name="PlayNowButton" Content="PlayNow" Grid.Column="0" Grid.Row="6" IsEnabled="False" Click="PlayNowButton_Click" >
</Button>
<Button x:Name="NextButton" Content="Next" Grid.Column="0" Grid.Row="8" IsEnabled="False" Click="NextButton_Click">
</Button>
<Button x:Name="PreviousButton" Content="Previous" Grid.Column="0" Grid.Row="10" IsEnabled="False" Click="PreviousButton_Click">
</Button>


</Grid>



</Grid>

</UserControl>

 

xmal.cs:

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Balder.Silverlight.Content;
using Balder.Math;
using Balder.Objects.Geometries;
using Balder.Execution;
using Balder.Lighting;
using Balder.View;
using Balder.Materials;
using Balder.Objects;
using Balder.Assets;
using Balder.Animation.Silverlight;
using System.Threading;
using System.ComponentModel;
using System.Windows.Interop;



namespace Reversi3D
{
public partial class MainPage : UserControl
{
public AIChess chess = new AIChess();
public MainPage()
{
InitializeComponent();
The_Game();
}

private void The_Game()
{
Create_Tube();
Create_First_Page();
}

private void Create_First_Page()
{
m_bPictureShowBox
= new Box()
{
Name
= "PictureShowBox",
Dimension
= new Coordinate(160, 120, 1),
Position
= new Coordinate(0, 0, -30),
Rotation
= new Coordinate(0, 0, 0)
};
m_bPictureShowBox.SetMaterialOnSide(
0, StarReversiMaterial);

group.Children.Add(m_bPictureShowBox);
}

private void Game_Init()
{
for (char cXName = 'a'; cXName <= 'h'; cXName++)
for (char cYName = '1'; cYName <= '8'; cYName++)
{
((Cylinder)((Geometry)group.FindName(
new string(new char[] { 'g', cXName, cYName }))).Children[1]).IsVisible = false;
}

int x, y;
for (x = 1; x < 9; x++)
{
for (y = 1; y < 9; y++)
{
if (chess.board[f(x, y)] == 0) ;
if (chess.board[f(x, y)] == 2)//WHITE
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = WhiteMaterial;
}
if (chess.board[f(x, y)] == 1)//BLACK
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = BlackMaterial ;
}
}
}
}

private void Create_Tube()
{
Coordinate cooBoxSize
= new Coordinate(iBoxLength, iBoxWidth, iBoxHeight);
Coordinate cooBoxPosition
= new Coordinate(0, 0, 0);

double iPositionX = (-3.5) * iBoxWidth;
for (char cXName = 'a'; cXName <= 'h'; iPositionX += iBoxWidth, cXName++)
{
double iPositionY = (3.5) * iBoxLength;
for (char cYName = '1'; cYName <= '8'; iPositionY -= iBoxLength, cYName++)
{
Box bBox
= new Box()
{
Dimension
= new Coordinate(iBoxWidth, iBoxLength, iBoxHeight),
Position
= new Coordinate(0, 0, 0),
Rotation
= new Coordinate(0, 0, 0),
Name
= new System.String(new char[] { cXName, cYName })
};
bBox.Color
= ((cXName - 'a' + cYName) % 2 == 0) ? Balder.Color.FromArgb(255, 79, 0, 3) : Balder.Color.FromArgb(255, 254, 254, 228);

Cylinder cyChessman
= new Cylinder
{
TopRadius
= 5,
BottomRadius
= 5,
Segments
= 20,
Size
= 3,
Position
= new Coordinate(0, 0, -2.5),
Name
= new System.String(new char[] { 'c', cXName, cYName }),
IsVisible
= false
};
// cyChessman.Material = ((cXName - 'a' + cYName) % 2 == 0) ? BlackMaterial : WhiteMaterial;
cyChessman.Rotation = new Coordinate(90, 0, 0);

Geometry minGroup
= new Geometry()
{
Name
= new System.String(new char[] {'g', cXName, cYName }),
Position
= new Coordinate(iPositionX, iPositionY, -iBoxWidth / 2 / Math.Sin(double_to_angle(22.5))),
Rotation
= new Coordinate(0, 0, 0)
};
minGroup.Children.Add(bBox);
minGroup.Children.Add(cyChessman);
group.Children.Add(minGroup);
}
}
Cylinder cyInner
= new Cylinder()
{
BottomRadius
= iBoxWidth / 2 / Math.Sin(double_to_angle(22.5)),
TopRadius
= iBoxWidth / 2 / Math.Sin(double_to_angle(22.5)),
Segments
= 8,
Position
= new Coordinate(0, 0, 0),
Size
= 8 * iBoxLength + 4,
Name
= "inner"
};
cyInner.Color
= Balder.Color.FromArgb(255, 48, 4, 121);
group.Children.Add(cyInner);
}

private void Board_Retract()
{
if (!bRetractInit)
{
bRetractInit
= true;
Init_Board_Retract_Anmition();
}
if(bSpeared == true)
{
if (bRetractFinish == true)
{
bRetractFinish
= false;
LayoutRoot.Resources.Add(
"retract", sbBoard_Retract);
sbBoard_Retract.Begin();
}
}
}

private void sbBoard_Retract_Completed(object sender, EventArgs e)
{
bRetractFinish
= true;
LayoutRoot.Resources.Remove(
"retract");
bSpeared
= false;
}

private void Init_Board_Retract_Anmition()
{
sbBoard_Retract
= new Storyboard();
sbBoard_Retract.Completed
+= new EventHandler(sbBoard_Retract_Completed);


Duration duration
= new System.TimeSpan(0, 0, 5);
sbBoard_Retract.Duration
= duration;
Coordinate cooPosition;
Coordinate cooRotation;
double iPositionX = (-3.5) * iBoxWidth;
for (char cXName = 'a'; cXName <= 'h'; iPositionX += iBoxWidth, cXName++)
{
double iPositionY = (3.5) * iBoxLength;
for (char cYName = '1'; cYName <= '8'; iPositionY -= iBoxLength, cYName++)
{
cooPosition
= ((Geometry)group.FindName(new System.String((new char[] { 'g', cXName, cYName })))).Position;
cooRotation
= ((Geometry)group.FindName(new System.String((new char[] { 'g', cXName, cYName })))).Rotation;
DoubleAnimation dAnimationPX
= new DoubleAnimation()
{
From
= cooPosition.X,
To
= dLengthX[cXName - 'a'],
Duration
= duration
};
sbBoard_Retract.Children.Add(dAnimationPX);
Storyboard.SetTargetName(dAnimationPX,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPX,
new PropertyPath("(Node.Position).(X)"));

DoubleAnimation dAnimationPY
= new DoubleAnimation()
{
From
= cooPosition.Y,
To
= iPositionY,
Duration
= duration
};
sbBoard_Retract.Children.Add(dAnimationPY);
Storyboard.SetTargetName(dAnimationPY,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPY,
new PropertyPath("(Node.Position).(Y)"));

DoubleAnimation dAnimationPZ
= new DoubleAnimation()
{
From
= cooPosition.Z,
To
= dLengthZ[cXName - 'a'],
Duration
= duration
};
sbBoard_Retract.Children.Add(dAnimationPZ);
Storyboard.SetTargetName(dAnimationPZ,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPZ,
new PropertyPath("(Node.Position).(Z)"));

DoubleAnimation dRoationPY
= new DoubleAnimation()
{
From
= cooRotation.Y,
To
= dRotationY[cXName - 'a'],
Duration
= duration
};
sbBoard_Retract.Children.Add(dRoationPY);
Storyboard.SetTargetName(dRoationPY,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dRoationPY,
new PropertyPath("(Node.Rotation).(Y)"));

}
}
}

private void Board_Spread()
{
if (!bSpeareInit)
{
bSpeareInit
= true;
Init_Board_Spread_Anmition();
}
if(bSpeared == false)
{
if (bSpeareFinish == true)
{
bSpeareFinish
= false;
LayoutRoot.Resources.Add(
"spread", sbBoard_Spread);
sbBoard_Spread.Begin();
}
}
}

private void sbBoard_Spread_Completed(object sender, EventArgs e)
{
// sbBoard_Spread.Stop();
LayoutRoot.Resources.Remove("spread");
bSpeareFinish
= true;
bSpeared
= true;
}

private void Init_Board_Spread_Anmition()
{
sbBoard_Spread
= new Storyboard();
sbBoard_Spread.Completed
+= new EventHandler(sbBoard_Spread_Completed);

Duration duration
= new System.TimeSpan(0, 0, 5);
sbBoard_Spread.Duration
= duration;
Coordinate cooPosition;
Coordinate cooRotation;

double iPositionX = (-3.5) * iBoxWidth;
for (char cXName = 'a'; cXName <= 'h'; iPositionX += iBoxWidth, cXName++)
{
double iPositionY = (3.5) * iBoxLength;
for (char cYName = '1'; cYName <= '8'; iPositionY -= iBoxLength, cYName++)
{
cooPosition
= ((Geometry)group.FindName(new System.String((new char[] { 'g', cXName, cYName })))).Position;
cooRotation
= ((Geometry)group.FindName(new System.String((new char[] { 'g', cXName, cYName })))).Rotation;
DoubleAnimation dAnimationPX
= new DoubleAnimation()
{
From
= cooPosition.X,
To
= iPositionX,
Duration
= duration
};
sbBoard_Spread.Children.Add(dAnimationPX);
Storyboard.SetTargetName(dAnimationPX,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPX,
new PropertyPath("(Node.Position).(X)"));

DoubleAnimation dAnimationPY
= new DoubleAnimation()
{
From
= cooPosition.Y,
To
= iPositionY,
Duration
= duration
};
sbBoard_Spread.Children.Add(dAnimationPY);
Storyboard.SetTargetName(dAnimationPY,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPY,
new PropertyPath("(Node.Position).(Y)"));

DoubleAnimation dAnimationPZ
= new DoubleAnimation()
{
From
= cooPosition.Z,
To
= -iBoxWidth / 2 / Math.Sin(double_to_angle(22.5)),
Duration
= duration
};
sbBoard_Spread.Children.Add(dAnimationPZ);
Storyboard.SetTargetName(dAnimationPZ,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dAnimationPZ,
new PropertyPath("(Node.Position).(Z)"));

DoubleAnimation dRoationPY
= new DoubleAnimation()
{
From
= cooRotation.Y,
To
= 0,
Duration
= duration
};
sbBoard_Spread.Children.Add(dRoationPY);
Storyboard.SetTargetName(dRoationPY,
new System.String((new char[] { 'g', cXName, cYName })));
Storyboard.SetTargetProperty(dRoationPY,
new PropertyPath("(Node.Rotation).(Y)"));

}
}
}

private double double_to_angle(double input)
{
return input * Math.PI / 180;
}

private void sbChessman_Anmition1_Completed(object sender, EventArgs e)
{
sbChessman_Anmition.Stop();
LayoutRoot.Resources.Remove(
"chessman_anmition1");
sbChessman_Anmition.Children.Clear();
sbChessman_Anmition
= null;
foreach (string chessman in m_sTargetChessmen)
{

((Cylinder)((Geometry)group.FindName(
"g" + chessman)).Children[1]).Material
= chess.colour == 1 ? WhiteMaterial : BlackMaterial;
}
Chessman_Anmition2();
}
private void sbChessman_Anmition2_Completed(object sender, EventArgs e)
{
sbChessman_Anmition.Stop();
LayoutRoot.Resources.Remove(
"chessman_anmition2");
sbChessman_Anmition.Children.Clear();
sbChessman_Anmition
= null;
if (bEnded == true)
{
bChessTrunarounded
= true;
return;
}
if(chess.CanGoOrNot() == false)
{
chess.colour
= 3 - chess.colour;
if (m_mode == MODEDEFINE.SING2D || m_mode == MODEDEFINE.SING3D)
bAIturn
= bAIturn ? false : true;
if (bAIturn)
Lock
= 1;
else Lock = 0;
}

if (m_mode == MODEDEFINE.DOUBLE2D || m_mode==MODEDEFINE.DOUBLE3D)
{
bAIturn
= false;
Lock
= 0;
}
if (bAIturn)
{
Thread tAIthread
= new Thread(ComputerChessTurn);
tAIthread.Start();
bAIturn
= false;
}
bChessTrunarounded
= true;
}

private void Chessman_Anmition1()
{
sbChessman_Anmition
= new Storyboard();
sbChessman_Anmition.Completed
+= new EventHandler(sbChessman_Anmition1_Completed);
LayoutRoot.Resources.Add(
"chessman_anmition1", sbChessman_Anmition);
Duration duration
= new System.TimeSpan(0, 0, 0, 0, 400);

foreach (string chessman in m_sTargetChessmen)
{
DoubleAnimation dAnimationPZ
= new DoubleAnimation
{
From
= -2.5,
To
= -18,
Duration
= duration
};
sbChessman_Anmition.Children.Add(dAnimationPZ);
Storyboard.SetTargetName(dAnimationPZ,
'c' + chessman);
Storyboard.SetTargetProperty(dAnimationPZ,
new PropertyPath("(Node.Position).(Z)"));

DoubleAnimation dAnimationRY
= new DoubleAnimation
{
From
= ((Cylinder)((Geometry)group.FindName('g' + chessman)).Children[1]).Rotation.Y,
To
= ((Cylinder)((Geometry)group.FindName('g' + chessman)).Children[1]).Rotation.Y + 90,
Duration
= duration,
SpeedRatio
= 1
};
sbChessman_Anmition.Children.Add(dAnimationRY);
Storyboard.SetTargetName(dAnimationRY,
'c' + chessman);
Storyboard.SetTargetProperty(dAnimationRY,
new PropertyPath("(Node.Rotation).(Y)"));
}
sbChessman_Anmition.Begin();
}
private void Chessman_Anmition2()
{
sbChessman_Anmition
= new Storyboard();
sbChessman_Anmition.Completed
+= new EventHandler(sbChessman_Anmition2_Completed);
LayoutRoot.Resources.Add(
"chessman_anmition2", sbChessman_Anmition);
Duration duration
= new System.TimeSpan(0, 0, 0, 0, 400);

foreach (string chessman in m_sTargetChessmen)
{
DoubleAnimation dAnimationPZ
= new DoubleAnimation
{
From
= -18,
To
= -2.5,
Duration
= duration
};
sbChessman_Anmition.Children.Add(dAnimationPZ);
Storyboard.SetTargetName(dAnimationPZ,
'c' + chessman);
Storyboard.SetTargetProperty(dAnimationPZ,
new PropertyPath("(Node.Position).(Z)"));

DoubleAnimation dAnimationRY
= new DoubleAnimation
{
From
= ((Cylinder)((Geometry)group.FindName('g' + chessman)).Children[1]).Rotation.Y + 90,
To
= ((Cylinder)((Geometry)group.FindName('g' + chessman)).Children[1]).Rotation.Y + 180,
Duration
= duration,
SpeedRatio
= 1
};
sbChessman_Anmition.Children.Add(dAnimationRY);
Storyboard.SetTargetName(dAnimationRY,
'c' + chessman);
Storyboard.SetTargetProperty(dAnimationRY,
new PropertyPath("(Node.Rotation).(Y)"));
}
sbChessman_Anmition.Begin();
}

private void Chessman_TurnAround()
{
if (!bChessTrunarounded)
return;
bChessTrunarounded
= false;
Chessman_Anmition1();
}

private void set_Camera_Position()
{
if(m_viewAngleYZ == 90 || m_viewAngleYZ == 270)
cCamera.Up
= -cCamera.Up;
cCamera.Position.Z
= -iViewLength * Math.Cos(double_to_angle(m_viewAngleXZ)) * Math.Cos(double_to_angle(m_viewAngleYZ));
cCamera.Position.X
= iViewLength * Math.Sin(double_to_angle(m_viewAngleXZ)) * Math.Cos(double_to_angle(m_viewAngleYZ));
cCamera.Position.Y
= iViewLength * Math.Sin(double_to_angle(m_viewAngleYZ));
}

private void Grid_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (e.Delta > 0)
{
iViewLength
-= iViewLength / 15;
set_Camera_Position();
}
if (e.Delta < 0)
{
iViewLength
+= iViewLength / 15;
set_Camera_Position();
}
}

private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.W)
{
m_viewAngleYZ
= (++m_viewAngleYZ) % 360;
set_Camera_Position();
}
if (e.Key == Key.S)
{
m_viewAngleYZ
= (--m_viewAngleYZ) % 360;
set_Camera_Position();
}
if (e.Key == Key.A)
{
m_viewAngleXZ
= (--m_viewAngleXZ) % 360;
set_Camera_Position();
}
if (e.Key == Key.D)
{
m_viewAngleXZ
= (++m_viewAngleXZ) % 360;
set_Camera_Position();
}
if (e.Key == Key.Z)
{
if (bSpeared)
Board_Retract();
else
Board_Spread();
}
if(e.Key == Key.T)
{
Content contentObject
= Application.Current.Host.Content;
contentObject.IsFullScreen
= !contentObject.IsFullScreen;
}
}

private void LayoutRoot_KeyUp(object sender, KeyEventArgs e)
{


}

private void group_MouseLeftButtonDown(object sender, Balder.Input.MouseButtonEventArgs args)
{
sClickedBox
= (args.OriginalSource.Name);
//attention!!! is box???
// ((Box)args.OriginalSource).Color = Colors.Red;
}

private void group_MouseLeftButtonUp(object sender, Balder.Input.MouseButtonEventArgs args)
{
if (bReplay == true)
return;
if (Lock == 0 && bChessTrunarounded == true)
{
if (sClickedBox == (args.OriginalSource.Name) &&
args.OriginalSource.Name
!= "inner" &&
(args.OriginalSource.GetType().ToString()
== "Balder.Objects.Geometries.Box" ||
args.OriginalSource.GetType().ToString()
== "Balder.Objects.Geometries.Cylinder"))
{
string sBoxName = args.OriginalSource.Name.Length == 2 ?
args.OriginalSource.Name : args.OriginalSource.Name.Remove(
0, 1);
if (chess.ChangeBoard(sBoxName) != -1)
{
draw();
Lock
= 1;
if (chess.NewGameOrNot())
{
bEnded
= true;
Game_Over_Show_Picture(chess.WinSignal);
}


//BackgroundWorker bw = new BackgroundWorker();
//bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
//bw.DoWork += new DoWorkEventHandler(ComputerChessTurn);
//bw.RunWorkerAsync();

bAIturn
= true;



}
}
else
sClickedBox
= null;
}
}


//public void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
//{
// if (e.Result.ToString() != "-1")
// draw();
// Lock = 0; //IN IF OR NOT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//}

//public void ComputerChessTurn(object sender, DoWorkEventArgs e)
//{
// e.Result = chess.ComputerTurn();

//}

public void ComputerChessTurn()
{
if (chess.ComputerTurn() != -1)
{
this.Dispatcher.BeginInvoke(() => {
draw();
Lock
= 0;
if (chess.NewGameOrNot())
{
bEnded
= true;
Game_Over_Show_Picture(chess.WinSignal);

}
});
}
}

public void draw()
{
((Cylinder)((Geometry)group.FindName(
"g" + chess.TurnGridArray[chess.TurnGridArray.Count - 1])).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
"g" + chess.TurnGridArray[chess.TurnGridArray.Count - 1])).Children[1]).Material =
(chess.colour
== 1 ? WhiteMaterial : BlackMaterial);
if(bReplay == false)
{
m_sPositionRecord.Add(chess.TurnGridArray[chess.TurnGridArray.Count
- 1]);
}
chess.TurnGridArray.RemoveAt(chess.TurnGridArray.Count
- 1);
m_sTargetChessmen
= chess.TurnGridArray;
Chessman_TurnAround();
_player1sorce.Text
= chess.black.ToString();
_player2sorce.Text
= chess.white.ToString();
return;
}

private void Mode_Choice()
{
switch (ModeComboBox.SelectedIndex)
{
case 0:
chess.ChangeMode(
2);
switch (PlayerNumberComboBox.SelectedIndex)
{
case 0:
m_mode
= MODEDEFINE.SING2D;
break;
case 1:
m_mode
= MODEDEFINE.DOUBLE2D;
break;
default:
break;

}
break;
case 1:
chess.ChangeMode(
3);
switch (PlayerNumberComboBox.SelectedIndex)
{
case 0:
m_mode
= MODEDEFINE.SING3D;
break;
case 1:
m_mode
= MODEDEFINE.DOUBLE3D;
break;
default:
break;

}
break;
default:
m_mode
= MODEDEFINE.SING3D;
break;
}
m_SelectedMode
= m_mode;
}

private void Game_Over_Show_Picture(WhoWin whowin)
{
if (bExchangeSide == true && ((m_SelectedMode == MODEDEFINE.SING2D || m_SelectedMode == MODEDEFINE.SING3D)))
{
switch (whowin)
{
case WhoWin.WhiteWin:
whowin
= WhoWin.BlackWin;
break;
case WhoWin.BlackWin:
whowin
= WhoWin.WhiteWin;
break;
case WhoWin.Draw:
break;
default:
break;
}
}
if (m_mode == MODEDEFINE.DOUBLE2D || m_mode == MODEDEFINE.DOUBLE3D)
{
m_bPictureShowBox.Material
= GameOverMaterial;
switch (whowin)
{
case WhoWin.WhiteWin:
_result.Text
= "Player2 win!";
break;
case WhoWin.BlackWin:
_result.Text
= "Player1 win!";
break;
case WhoWin.Draw:
_result.Text
= "Draw!";
break;
default:
break;
}
}
else
switch (whowin)
{
case WhoWin.WhiteWin:
_result.Text
= "You lose!";
m_bPictureShowBox.Material
= YouLoseMaterial;
break;
case WhoWin.BlackWin:
_result.Text
= "You win!";
m_bPictureShowBox.Material
= YouWinMaterial;
break;
case WhoWin.Draw:
_result.Text
= "Draw!";
m_bPictureShowBox.Material
= GameOverMaterial;
break;
default:
break;
}
group.World.M11
= 1;
group.World.M12
= 0;
group.World.M13
= 0;
group.World.M14
= 0;
group.World.M21
= 0;
group.World.M22
= 1;
group.World.M23
= 0;
group.World.M24
= 0;
group.World.M31
= 0;
group.World.M32
= 0;
group.World.M33
= 1;
group.World.M34
= 0;
group.World.M41
= 0;
group.World.M42
= 0;
group.World.M43
= 0;
group.World.M44
= 1;

LayoutRoot.UpdateLayout();
if (group.Children.Contains(m_bPictureShowBox) == true)
group.Children.Remove(m_bPictureShowBox);
if(group.Children.Contains(m_bPictureShowBox) == false)
group.Children.Add(m_bPictureShowBox);
}

private void Game_Start()
{
group.Children.Remove(m_bPictureShowBox);
if(m_mode == MODEDEFINE.SING2D || m_mode == MODEDEFINE.SING3D)
{
_player1name.Text
= "You";
_player2name.Text
= "AI";
}
else
{
_player1name.Text
= "Player1";
_player2name.Text
= "Player2";
}
_player1sorce.Text
= "2";
_player2sorce.Text
= "2";
if (m_mode == MODEDEFINE.DOUBLE3D || m_mode == MODEDEFINE.SING3D)
Board_Retract();
else
Board_Spread();
}

private void StartButton_Click(object sender, RoutedEventArgs e)
{
m_sPositionRecord
= new List<string>();
StartButton.IsEnabled
= false;
ReplayButton.IsEnabled
= false;
ModeComboBox.IsEnabled
= false;
PlayerNumberComboBox.IsEnabled
= false;
PlayNowButton.IsEnabled
= false;
EndThisGame.IsEnabled
= true;
NextButton.IsEnabled
= false;
PreviousButton.IsEnabled
= false;
bAIturn
= false;
bExchangeSide
= false;
Lock
= 0;
bChessTrunarounded
= true;
bEnded
= false;
bReplay
= false;
_result.Text
= "";
chess.NEW(
3);
Game_Init();
Mode_Choice();
Game_Start();
if (group.Children.Contains(m_bPictureShowBox) == true)
group.Children.Remove(m_bPictureShowBox);
}

private void ReplayButton_Click(object sender, RoutedEventArgs e)
{
if (m_sPositionRecord.Count == 0)
return;
if (m_sTargetChessmen.Count == 0)
{
NextButton.IsEnabled
= false;
}
else
NextButton.IsEnabled
= true;
StartButton.IsEnabled
= false;
PreviousButton.IsEnabled
= false;
PlayNowButton.IsEnabled
= true;
EndThisGame.IsEnabled
= true;
bExchangeSide
= false;
bAIturn
= false;
Lock
= 0;
bChessTrunarounded
= true;
bEnded
= false;
bReplay
= true;
bAIturnInReplay
= false;
m_iReplayIndex
= 0;
bPreviousDraw
= false;
m_boardRecord
= new List<int[]>();
m_blackRecord
= new List<int>();
m_whiteRecord
= new List<int>();
m_colourRecord
= new List<int>();
_result.Text
= "";
if (m_SelectedMode == MODEDEFINE.DOUBLE2D || m_SelectedMode == MODEDEFINE.SING2D)
chess.NEW(
2);
else
chess.NEW(
3);
Game_Init();
Game_Start();
if (m_mode == MODEDEFINE.DOUBLE2D || m_mode == MODEDEFINE.SING2D)
m_mode
= MODEDEFINE.DOUBLE2D;
else
m_mode
= MODEDEFINE.DOUBLE3D;
if (group.Children.Contains(m_bPictureShowBox) == true)
group.Children.Remove(m_bPictureShowBox);
}

private void PlayNowButton_Click(object sender, RoutedEventArgs e)
{
int x, y;
for (x = 1; x < 9; x++)
{
for (y = 1; y < 9; y++)
{
if (chess.board[f(x, y)] == 0)
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = false;
if (chess.board[f(x, y)] == 2)//WHITE
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = WhiteMaterial;
}
if (chess.board[f(x, y)] == 1)//BLACK
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = BlackMaterial;
}
}
}
bReplay
= false;
m_sPositionRecord.RemoveRange(m_iReplayIndex, m_sPositionRecord.Count
- m_iReplayIndex);
m_mode
= m_SelectedMode;
StartButton.IsEnabled
= false;
ReplayButton.IsEnabled
= false;
ModeComboBox.IsEnabled
= false;
PlayerNumberComboBox.IsEnabled
= false;
PlayNowButton.IsEnabled
= false;
EndThisGame.IsEnabled
= true;
NextButton.IsEnabled
= false;
PreviousButton.IsEnabled
= false;
// bAIturn = bAIturnInReplay; //是否可换下AI的棋
if( bAIturnInReplay == true
&& (m_SelectedMode == MODEDEFINE.SING2D || m_SelectedMode == MODEDEFINE.SING3D) )
{
bExchangeSide
= true;
_player1name.Text
= "AI";
_player2name.Text
= "You";
}

if (bEnded == true)
{
bChessTrunarounded
= true;
return;
}
if (chess.CanGoOrNot() == false)
{
chess.colour
= 3 - chess.colour;
if (m_mode == MODEDEFINE.SING2D || m_mode == MODEDEFINE.SING3D)
bAIturn
= bAIturn ? false : true;
if (bAIturn)
Lock
= 1;
else Lock = 0;
}

if (m_mode == MODEDEFINE.DOUBLE2D || m_mode == MODEDEFINE.DOUBLE3D)
{
bAIturn
= false;
Lock
= 0;
}
if (bAIturn)
{
Thread tAIthread
= new Thread(ComputerChessTurn);
tAIthread.Start();
bAIturn
= false;
}
}

private void NextButton_Click(object sender, RoutedEventArgs e)
{
int x, y;
for (x = 1; x < 9; x++)
{
for (y = 1; y < 9; y++)
{
if (chess.board[f(x, y)] == 0)
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = false;
if (chess.board[f(x, y)] == 2)//WHITE
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = WhiteMaterial;
}
if (chess.board[f(x, y)] == 1)//BLACK
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = BlackMaterial;
}
}
}
int[] tempBoard = new int[91];
for (int i = 0; i < 91; i++)
tempBoard[i]
= chess.board[i];
m_boardRecord.Add(tempBoard);
m_blackRecord.Add(chess.black);
m_whiteRecord.Add(chess.white);
m_colourRecord.Add(chess.colour);
PreviousButton.IsEnabled
= true;
bAIturnInReplay
= (chess.colour == 1 ? true : false); //是否可换下AI的棋
if (chess.ChangeBoard(m_sPositionRecord[m_iReplayIndex]) != -1)
{
m_iReplayIndex
++;
if (m_iReplayIndex == m_sPositionRecord.Count)
{
NextButton.IsEnabled
= false;
}
draw();
Lock
= 1;
if (chess.NewGameOrNot())
{
bEnded
= true;
Game_Over_Show_Picture(chess.WinSignal);
}


//BackgroundWorker bw = new BackgroundWorker();
//bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
//bw.DoWork += new DoWorkEventHandler(ComputerChessTurn);
//bw.RunWorkerAsync();

bAIturn
= true;
//Thread tAIthread = new Thread(ComputerChessTurn);

//tAIthread.Start();
}
}

private void PreviousButton_Click(object sender, RoutedEventArgs e)
{
chess.board
= m_boardRecord[m_boardRecord.Count - 1];
chess.black
= m_blackRecord[m_blackRecord.Count - 1];
chess.white
= m_whiteRecord[m_whiteRecord.Count - 1];
chess.colour
= m_colourRecord[m_colourRecord.Count - 1];
m_boardRecord.RemoveAt(m_boardRecord.Count
- 1);
m_blackRecord.RemoveAt(m_blackRecord.Count
- 1);
m_whiteRecord.RemoveAt(m_whiteRecord.Count
- 1);
m_colourRecord.RemoveAt(m_colourRecord.Count
- 1);
m_iReplayIndex
--;
NextButton.IsEnabled
= true;
if (m_iReplayIndex == 0)
PreviousButton.IsEnabled
= false;
int x, y;
for (x = 1; x < 9; x++)
{
for (y = 1; y < 9; y++)
{
if (chess.board[f(x, y)] == 0)
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = false;
if (chess.board[f(x, y)] == 2)//WHITE
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = WhiteMaterial;
}
if (chess.board[f(x, y)] == 1)//BLACK
{
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).IsVisible = true;
((Cylinder)((Geometry)group.FindName(
new System.String(new char[] { 'g', (char)(x - 1 + 'a'), (char)(y - 1 + '1') }))).Children[1]).Material = BlackMaterial;
}
}
}
}

private void EndThisGame_Click(object sender, RoutedEventArgs e)
{
StartButton.IsEnabled
= true;
ReplayButton.IsEnabled
= true;
ModeComboBox.IsEnabled
= true;
PlayerNumberComboBox.IsEnabled
= true;
EndThisGame.IsEnabled
= false;
WhoWin Winsignal
= new WhoWin();
if (chess.white > chess.black) Winsignal = WhoWin.WhiteWin;
if (chess.white < chess.black) Winsignal = WhoWin.BlackWin;
if (chess.white == chess.black) Winsignal = WhoWin.Draw;
Game_Over_Show_Picture(Winsignal);
}

private int f(int x, int y) { return (x * 9 + y); }
const int iBoxHeight = 1;
const int iBoxWidth = 20;
const int iBoxLength = 15;
private int Lock = 0;
private bool bEnded = false;
private int m_viewAngleXZ = 0;
private int m_viewAngleYZ = 0;
private Storyboard sbBoard_Spread;
private Storyboard sbBoard_Retract;
private Storyboard sbChessman_Anmition;
int iViewLength = 190;
static double dSin225 = Math.Sin(22.5 * Math.PI / 180);
static double dCos225 = Math.Cos(22.5 * Math.PI / 180);
static double dTan225 = Math.Tan(22.5 * Math.PI / 180);
static double dConstdl1 = iBoxWidth / 2 * dCos225;
static double dConstdl2 = iBoxWidth / 2 / dTan225 * dCos225;
double[] dLengthX = { -dConstdl1, -dConstdl2, -dConstdl2, -dConstdl1, dConstdl1, dConstdl2, dConstdl2, dConstdl1 };
double[] dLengthZ = { dConstdl2, dConstdl1, -dConstdl1, -dConstdl2, -dConstdl2, -dConstdl1, dConstdl1, dConstdl2 };
double[] dRotationY = { 157.5, 112.5, 67.5, 22.5, -22.5, -67.5, -112.5, -157.5 };
private bool bSpeareInit = false;
private bool bRetractInit = false;
private bool bSpeareFinish = true;
private bool bRetractFinish = true;
private bool bExchangeSide = false;
private string sClickedBox;
private bool bSpeared = true;
private bool bChessTrunarounded = true;
private bool bAIturn = false;
private MODEDEFINE m_mode = new MODEDEFINE();
private Box m_bPictureShowBox;
private List<string> m_sTargetChessmen;
private List<string> m_sPositionRecord;
private List<int[]> m_boardRecord;
private List<int> m_blackRecord;
private List<int> m_whiteRecord;
private List<int> m_colourRecord;
private bool bReplay = false;
private int m_iReplayIndex = 0;
private bool bAIturnInReplay = false;
private bool bPreviousDraw = false;
private MODEDEFINE m_SelectedMode = new MODEDEFINE();
enum MODEDEFINE:int
{
SING2D
= 1,
DOUBLE2D,
SING3D,
DOUBLE3D
};
}
}

 

 

 

posted @ 2010-11-30 10:09  ustc_msra_ase  阅读(1682)  评论(5编辑  收藏  举报