좋습니다. 일반 프로그램 일종입니다. 사용자가 컴퓨터 플레이어와 상호 작용할 수있는 포커 프로그램을 작성하려고합니다. 그러나 그것을 단순화하기 위해 두 명의 플레이어가 컴퓨터에서 숫자를 추측하려고하는 훨씬 간단한 프로그램으로 테스트하고 있습니다. 하나는 인간 플레이어이고 다른 하나는 컴퓨터 플레이어입니다.사용자가 wpf에서 상호 작용할 수 있도록 프로그램을 일시 중지
게임에서 플레이어는 프로그램에서 설정 한 숫자를 추측합니다. 컴퓨터 플레이어는 숫자를 무작위로 추출합니다. 사용자가 숫자를 입력하고 추측 버튼을 누르거나 종료 옵션이 있어야합니다.
내 문제는 인간 플레이어가 행동하기 시작했을 때 버튼을 누르거나 텍스트를 입력하여 인간이 반응하도록하기 위해 게임의 종료를 일시 중지 할 수있는 방법입니다.
나는 타이머를 사용하여 시도하고 그것을 시작하고 스레드가 끝날 때까지 기다리는 것처럼 보이지만 그것은 여전히 GUI를 고정시킵니다.
또한 백그라운드 작업자 스레드에서 GUI를 업데이트하기 위해 메시지를 보내려고했지만 다른 스레드의 GUI 요소에 액세스 할 수 없다는 오류가 발생합니다.
누구든지 이것을 구현하는 방법에 대한 제안이 있습니까?
실행 중에 GUI와 상호 작용하는 방법을 이해 했으므로이 프로그램은 완전한 프로그램이 아닙니다.
수의를 추측 클래스 :
public class NumberGuesser {
public Player HumanPlayer { get; private set; }
public Player ComputerPlayer { get; private set;}
private Player[] _players = new Player[2];
private int _maxNumber = 20;
private bool _done = false;
private Random random;
public NumberGuesser() {
HumanPlayer = new HumanPlayer("Me");
ComputerPlayer = new ComputerPlayer("HAL9000");
_players[0] = HumanPlayer;
_players[1] = ComputerPlayer;
random = new Random((int) DateTime.Now.Ticks);
}
public void Play() {
var myNumber = random.Next(_maxNumber);
var index = 0;
while (!_done) {
var currentPlayer = _players[index];
var guess = currentPlayer.Act(_maxNumber);
if (guess == myNumber) {
currentPlayer.Score++;
}
index = (1 + index)%2;
}
}
}
컴퓨터 플레이어 :
public class ComputerPlayer : Player {
private readonly Random _random = new Random((int)DateTime.Now.Ticks);
public ComputerPlayer(string name) : base(name) {
}
public override int Act(int max) {
return _random.Next(max);
}
}
인간의 선수 :
public class HumanPlayer : Player {
public HumanPlayer(string name) : base(name) {
}
public override int Act(int max) {
return UserGuess();
}
private int UserGuess() {
return 0;
}
}
플레이어 클래스 :
public class Player {
public string Name { get; private set; }
public int Score { get; set; }
public Player(string name) {
Name = name;
}
public virtual int Act(int max) {
// How should the human enter the guess here???
return 0;
}
}
내 주요 창
<Window x:Class="GuessMyNumber.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="395" Width="728">
<Grid>
<Label Content="Guess my number!" Height="28" HorizontalAlignment="Left" Margin="122,58,0,0" Name="label1" VerticalAlignment="Top" />
<Grid Height="174" HorizontalAlignment="Left" Margin="31,170,0,0" Name="grid1" VerticalAlignment="Top" Width="272" DataContext="{Binding Path=HumanPlayer}">
<Label Content="Human player" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0" Name="label2" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="55,92,0,0" Name="textBox1" VerticalAlignment="Top" Width="120"
Text="{Binding Path=HumanGuess, UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="Guess" Height="23" HorizontalAlignment="Left" Margin="79,130,0,0" Name="button1" VerticalAlignment="Top" Width="75"
Command="{Binding Path=GuessCommand}"/>
<Label Content="{Binding Path=Name}" Height="28" HorizontalAlignment="Left" Margin="96,6,0,0" Name="label3" VerticalAlignment="Top" />
<Label Content="Score" Height="28" HorizontalAlignment="Left" Margin="6,40,0,0" Name="label4" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="55,42,0,0" Name="textBox2" VerticalAlignment="Top" Width="75" Text="{Binding Path=Score, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
<Button Content="Quit" Height="23" HorizontalAlignment="Left" Margin="182,130,0,0" Name="buttonQuit" VerticalAlignment="Top" Width="75" Command="{Binding Path=QuitCommand}" />
</Grid>
<Grid Height="174" HorizontalAlignment="Left" Margin="328,170,0,0" Name="grid2" VerticalAlignment="Top" Width="270" DataContext="{Binding Path=ComputerPlayer}" >
<Label Content="Computer player" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="55,92,0,0" VerticalAlignment="Top" Width="120" Text="{Binding Path=HumanGuess, UpdateSourceTrigger=PropertyChanged}"/>
<Label Content="{Binding Path=Name}" Height="28" HorizontalAlignment="Left" Margin="111,6,0,0" VerticalAlignment="Top" />
<Label Content="Score" Height="28" HorizontalAlignment="Left" Margin="6,40,0,0" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="55,42,0,0" VerticalAlignment="Top" Width="75" Text="{Binding Path=Score, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
</Grid>
<Button Content="Start Playing" Height="23" HorizontalAlignment="Left" Margin="254,59,0,0" Name="buttonStartPlay" VerticalAlignment="Top" Width="75" Click="buttonStartPlay_Click" />
</Grid>
그리고 뒤에있는 코드 :
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
private readonly NumberGuesser _numberGuesser;
public MainWindow() {
InitializeComponent();
_numberGuesser = new NumberGuesser();
DataContext = _numberGuesser;
}
private void buttonStartPlay_Click(object sender, RoutedEventArgs e) {
_numberGuesser.Play();
}
}
좋습니다. 감사합니다. GuessNumber 클래스의 내 play 함수에서 ActAsync를 어떻게 호출합니까? – Ergodyne
'player.ActCompleted + = SomeHandler; player.ActAsync (최대);' –