C#界面程序写起来和C++还是有很多区别的,比如在C++里重载运算符在C#里要重载Objective类的函数,而且C#的API居然没有优先队列。
这里面状态判重是用哈希表判重。A*算法用的是距离和,启发能力比不在位更强。
其实HCI方面还有很多可以改进的地方,水过验收之后就懒得改了><
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
namespace EightDigitPuzzle
{
public partial class Form1 : Form
{
string[] figpath;
int[] pic;
int[] now;
int[] tmpst;
Puzzle sample;
int subindex;
public Form1()
{
InitializeComponent();
figpath = new string[9];//保存PictureBox的图片路径
pic = new int[2];
now = new int[2];
tmpst = new int[9];
sample = new Puzzle();
subindex = 0;
string p = "C:\\Users\\dell\\Documents\\Visual Studio 2008\\Projects\\EightDigitPuzzle\\NumberJpg\\";
for (int i = 0; i < 9; i++)
{
figpath[i] = p + i.ToString() + ".jpg";
}
}
public void LoadFig(int n, int f)//给PictureBox加载图片
{
switch (n)
{
case 0:
pictureBox1.Load(figpath[f]);
break;
case 1:
pictureBox2.Load(figpath[f]);
break;
case 2:
pictureBox3.Load(figpath[f]);
break;
case 3:
pictureBox4.Load(figpath[f]);
break;
case 4:
pictureBox5.Load(figpath[f]);
break;
case 5:
pictureBox6.Load(figpath[f]);
break;
case 6:
pictureBox7.Load(figpath[f]);
break;
case 7:
pictureBox8.Load(figpath[f]);
break;
case 8:
pictureBox9.Load(figpath[f]);
break;
}
}
public void ShowFigure(int[] sta)//在PictureBox中显示图片
{
for (int i = 0; i < 9; i++)
{
LoadFig(i, sta[i]);
}
}
public string getfigpath(int pic)//获取第i个PictureBox的图片路径
{
string path = "";
switch (pic)
{
case 0:
path = pictureBox1.ImageLocation;
break;
case 1:
path = pictureBox2.ImageLocation;
break;
case 2:
path = pictureBox3.ImageLocation;
break;
case 3:
path = pictureBox4.ImageLocation;
break;
case 4:
path = pictureBox5.ImageLocation;
break;
case 5:
path = pictureBox6.ImageLocation;
break;
case 6:
path = pictureBox7.ImageLocation;
break;
case 7:
path = pictureBox8.ImageLocation;
break;
case 8:
path = pictureBox9.ImageLocation;
break;
}
return path;
}
public void dynamicshow(int[] pic, int[] now)//根据result[i]中s数组的值改变PictureBox中对应的图片
{
if (timer1.Enabled == false)
{
string oldpath = getfigpath(pic[0]);
string newpath = getfigpath(pic[1]);
string oldfig = figpath[now[0]];
string newfig = figpath[now[1]];
switch (pic[0])
{
case 0:
pictureBox1.Load(newfig);
break;
case 1:
pictureBox2.Load(newfig);
break;
case 2:
pictureBox3.Load(newfig);
break;
case 3:
pictureBox4.Load(newfig);
break;
case 4:
pictureBox5.Load(newfig);
break;
case 5:
pictureBox6.Load(newfig);
break;
case 6:
pictureBox7.Load(newfig);
break;
case 7:
pictureBox8.Load(newfig);
break;
case 8:
pictureBox9.Load(newfig);
break;
}
switch (pic[1])
{
case 0:
pictureBox1.Load(oldfig);
break;
case 1:
pictureBox2.Load(oldfig);
break;
case 2:
pictureBox3.Load(oldfig);
break;
case 3:
pictureBox4.Load(oldfig);
break;
case 4:
pictureBox5.Load(oldfig);
break;
case 5:
pictureBox6.Load(oldfig);
break;
case 6:
pictureBox7.Load(oldfig);
break;
case 7:
pictureBox8.Load(oldfig);
break;
case 8:
pictureBox9.Load(oldfig);
break;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
this.ShowFigure(tmpst);
sample = new Puzzle();
sample.run_bfs();//output message box after form changed.
if (sample.sol == true)
{
this.subindex = 0;
timer3.Enabled = true;
}