[英]Winning check and playagain c# tictactoe
我有3个问题:1-第一次按下“ letsPlay”按钮时,无论我在哪里按下,都可以得到oImage,但之后效果很好。 2-Winner()方法不起作用...它什么也不做。 3-如何重置网格背景,因为我找不到任何结果。
好的,这是xaml代码:
<StackPanel>
<Grid VerticalAlignment="Top">
<Button x:Name="letsPlay" Content="Let's Start!" Click="letsPlay_Click"/>
<TextBlock x:Name="turnText"
HorizontalAlignment="Left"
Margin="302,10,0,0"
TextWrapping="Wrap"
Text="Turn = X"
VerticalAlignment="Top"
Foreground="#FFFB0707" FontSize="20"/>
</Grid>
<Grid x:Name="theGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image x:Name="cell9" Grid.Column="2" Grid.Row="2" Source="Images/Logo.png" Tapped="cell9_Tapped"/>
<Image x:Name="cell8" Grid.Column="1" Grid.Row="2" Source="Images/Logo.png" Tapped="cell8_Tapped"/>
<Image x:Name="cell7" Grid.Column="0" Grid.Row="2" Source="Images/Logo.png" Tapped="cell7_Tapped"/>
<Image x:Name="cell4" Grid.Column="0" Grid.Row="1" Source="Images/Logo.png" Tapped="cell4_Tapped"/>
<Image x:Name="cell1" Grid.Column="0" Grid.Row="0" Source="Images/Logo.png" Tapped="cell1_Tapped"/>
<Image x:Name="cell5" Grid.Column="1" Grid.Row="1" Source="Images/Logo.png" Tapped="cell5_Tapped"/>
<Image x:Name="cell2" Grid.Column="1" Grid.Row="0" Source="Images/Logo.png" Tapped="cell2_Tapped"/>
<Image x:Name="cell6" Grid.Column="2" Grid.Row="1" Source="Images/Logo.png" Tapped="cell6_Tapped"/>
<Image x:Name="cell3" Grid.Column="2" Grid.Row="0" Source="Images/Logo.png" Tapped="cell3_Tapped"/>
</Grid>
</StackPanel>
现在查看后面的代码:
bool turn = true;
int moveCount1 = 0;
BitmapImage xImage = new BitmapImage(new Uri("ms-appx:///Images/X.png"));
BitmapImage oImage = new BitmapImage(new Uri("ms-appx:///Images/O.png"));
BitmapImage nullImage = new BitmapImage(new Uri("ms-appx:///Images/Logo.png"));
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
theGrid.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
turnText.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
this.Winner();
}
letsPlay按钮和Reset()方法:
private void letsPlay_Click(object sender, RoutedEventArgs e)
{
Reset();
}
void Reset()
{
theGrid.Visibility = Windows.UI.Xaml.Visibility.Visible;
turnText.Visibility = Windows.UI.Xaml.Visibility.Visible;
turn = true;
turnText.Text = "Turn = X";
moveCount1 = 0;
cell1.Source = nullImage;
cell1.Tapped += cell1_Tapped;
cell2.Source = nullImage;
cell2.Tapped += cell2_Tapped;
cell3.Source = nullImage;
cell3.Tapped += cell3_Tapped;
cell4.Source = nullImage;
cell4.Tapped += cell4_Tapped;
cell5.Source = nullImage;
cell5.Tapped += cell5_Tapped;
cell6.Source = nullImage;
cell6.Tapped += cell6_Tapped;
cell7.Source = nullImage;
cell7.Tapped += cell7_Tapped;
cell8.Source = nullImage;
cell8.Tapped += cell8_Tapped;
cell9.Source = nullImage;
cell9.Tapped += cell9_Tapped;
}
这是一个单元代码示例:
private void cell9_Tapped(object sender, TappedRoutedEventArgs e)
{
if (turn)
{
cell9.Source = xImage;
turn = !turn;
turnText.Text = "Turn = O";
}
else
{
cell9.Source = oImage;
turn = !turn;
turnText.Text = "Turn = X";
}
cell9.Tapped -= cell9_Tapped;
moveCount1++;
}
最后是Winner()方法:
public void Winner()
{
if (
(cell1.Source == xImage && cell2.Source == cell1.Source && cell3.Source == cell1.Source) ||
(cell4.Source == xImage && cell5.Source == cell4.Source && cell6.Source == cell4.Source) ||
(cell7.Source == xImage && cell8.Source == cell7.Source && cell9.Source == cell7.Source) ||
(cell1.Source == xImage && cell5.Source == cell1.Source && cell9.Source == cell1.Source) ||
(cell3.Source == xImage && cell5.Source == cell3.Source && cell7.Source == cell3.Source) ||
(cell1.Source == xImage && cell4.Source == cell1.Source && cell7.Source == cell1.Source) ||
(cell2.Source == xImage && cell5.Source == cell2.Source && cell8.Source == cell2.Source) ||
(cell3.Source == xImage && cell6.Source == cell3.Source && cell9.Source == cell3.Source)
)
{
ImageBrush xWins1 = new ImageBrush();
xWins1.ImageSource = xImage;
theGrid.Background = xWins1;
}
else if (
(cell1.Source == oImage && cell2.Source == cell1.Source && cell3.Source == cell1.Source) ||
(cell4.Source == oImage && cell5.Source == cell4.Source && cell6.Source == cell4.Source) ||
(cell7.Source == oImage && cell8.Source == cell7.Source && cell9.Source == cell7.Source) ||
(cell1.Source == oImage && cell5.Source == cell1.Source && cell9.Source == cell1.Source) ||
(cell3.Source == oImage && cell5.Source == cell3.Source && cell7.Source == cell3.Source) ||
(cell1.Source == oImage && cell4.Source == cell1.Source && cell7.Source == cell1.Source) ||
(cell2.Source == oImage && cell5.Source == cell2.Source && cell8.Source == cell2.Source) ||
(cell3.Source == oImage && cell6.Source == cell3.Source && cell9.Source == cell3.Source)
)
{
ImageBrush oWins1 = new ImageBrush();
oWins1.ImageSource = oImage;
theGrid.Background = oWins1;
}
else if (moveCount1 == 9)
{
ImageBrush tie1 = new ImageBrush();
tie1.ImageSource = nullImage;
theGrid.Background = tie1;
}
}
谢谢您提供的任何帮助,如果您需要更多详细信息,请提前询问。
首先,如果您将单元作为数组访问并实现checkHorizon(int column)
/ checkVerticals(int row)
/ checkCross(bool isRightToLeft)
函数,则该代码看起来会更好得多-该函数可以接收数字并检查为获胜者选择的水平/垂直/交叉线,并返回一个值。 由于我不确定在wpf中是否有一种简单的方法可以将gridView作为数组进行访问,因此,如果您手动插入9个单元格,则此链接提供了一种适用于C#的方法。
您的第一个问题是有关按钮OnClick事件在第一次尝试时未触发。 发生此问题的原因有很多-当我过去为ASP.NET编程时,我会想到这类问题与page_load和ASP页面生命周期有关。 看看wpf的等价物,让我知道它是否解决了您的问题
您的第二个问题非常简单。 您希望Winner()
函数更改图像(如果我正确获取此图像)。 我认为问题还是与对象生命周期有关-问题是对象已全部加载到页面,因此,要查看更改,必须在更改后刷新页面 。
然后是第三个问题,可能是前两个问题的解决方案。 如何刷新您询问的页面? 我从另一个来源借来了语法,因为我从ASP修改了上下文。 解决方案是将用户重定向到您的页面,然后网格将首先重新加载自身。 您可以这样做:
const string pageName = "insert your page name here";
/*Insert some other code here*/
public static redirect(string directionName)
{
Response.Redirect(directionName+".aspx");
}
/* Insert some more code here */
每当gridview发生变化时,您都可以简单地使用redirect(pageName);
祝您好运,如果您还有其他无法解决的问题,请告诉我:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.