NumPuzzle 设计说明书
背景
开发环境:Microsoft Visual Studio .Net 2003
开发语言:C#
开发者:Red_angelX
1 总体设计
设计思路:根据玩家设置的棋盘布局大小N,动态生成一个N*N的数组,存放1到N*N-1和0xff的byte,游戏开始随机打乱这个数组,根据玩家按键来交换该数组元素位置,判断元素排列顺序来判断是否已经完成游戏。
2 游戏界面
3 具体设计
全局变量定义
int
GameSize
=
0
;
//
棋盘大小
byte [] Position; // 数组
Button[] Buttons; // 表现按扭
const int MAP_WIDTH = 300 ; // 棋盘宽度
bool IsRun = false ; // 游戏状态
int Clicks = 0 ; // 总移动数
byte [] Position; // 数组
Button[] Buttons; // 表现按扭
const int MAP_WIDTH = 300 ; // 棋盘宽度
bool IsRun = false ; // 游戏状态
int Clicks = 0 ; // 总移动数
初始化游戏函数InitGame()
//
初始化游戏相关设置
private void InitGame()
... {
/**//****************************************
**清除已有棋盘按扭,代码略
******************************************/
Buttons = new Button[GameSize*GameSize];
Position = new byte[GameSize*GameSize];
Position[0] = 0xff; //空的位置
for(int i=1;i<Position.Length;i++)
...{
Position[i] = (byte)i;//初始化数组
}
//随机洗牌
byte[] key = new byte[GameSize*GameSize];
new Random().NextBytes(key);
Array.Sort(key,Position);
/**//******************************************
** 动态生成棋盘按扭,代码略
*******************************************/
IsRun = true; //设置游戏运行标志
this.Clicks = 0;
}
private void InitGame()
... {
/**//****************************************
**清除已有棋盘按扭,代码略
******************************************/
Buttons = new Button[GameSize*GameSize];
Position = new byte[GameSize*GameSize];
Position[0] = 0xff; //空的位置
for(int i=1;i<Position.Length;i++)
...{
Position[i] = (byte)i;//初始化数组
}
//随机洗牌
byte[] key = new byte[GameSize*GameSize];
new Random().NextBytes(key);
Array.Sort(key,Position);
/**//******************************************
** 动态生成棋盘按扭,代码略
*******************************************/
IsRun = true; //设置游戏运行标志
this.Clicks = 0;
}
根据按键交换数组位置
private
void
DoChange(Keys key)
/**/
/* 交换数组位置 */
... {
//寻找空格位置
int offest = -1;
int MoveIndex = -1;
for(int i=0;i<Position.Length;i++)
...{
if(Position[i] == 0xff)
...{
offest = i;
break;
}
}
//判断玩家按键
switch(key)
...{
case Keys.Left:
MoveIndex = offest + 1;
if(offest % GameSize == GameSize - 1)
return;
break;
/**//*省略其他情况*/
}//End Switch
//判断是否能有效移动
if(MoveIndex < 0 || MoveIndex >= Position.Length)
return;
Clicks++;
this.statusBar1.Text = Clicks.ToString()+" Move";
PlaySound.Play("MOVE.WAV");
//交换数组中offest和MoveIndex位置
byte temp;
temp = Position[offest];
Position[offest] = Position[MoveIndex];
Position[MoveIndex] = temp;
//更新UI
UpDataUI(offest,MoveIndex);
//检查游戏是否过关
CheckWin();
}
... {
//寻找空格位置
int offest = -1;
int MoveIndex = -1;
for(int i=0;i<Position.Length;i++)
...{
if(Position[i] == 0xff)
...{
offest = i;
break;
}
}
//判断玩家按键
switch(key)
...{
case Keys.Left:
MoveIndex = offest + 1;
if(offest % GameSize == GameSize - 1)
return;
break;
/**//*省略其他情况*/
}//End Switch
//判断是否能有效移动
if(MoveIndex < 0 || MoveIndex >= Position.Length)
return;
Clicks++;
this.statusBar1.Text = Clicks.ToString()+" Move";
PlaySound.Play("MOVE.WAV");
//交换数组中offest和MoveIndex位置
byte temp;
temp = Position[offest];
Position[offest] = Position[MoveIndex];
Position[MoveIndex] = temp;
//更新UI
UpDataUI(offest,MoveIndex);
//检查游戏是否过关
CheckWin();
}
更新游戏界面函数UpDataUI
private
void
UpDataUI(
int
offest,
int
MoveIndex)
... {
if(this.IsRun == false)
return;
Buttons[offest].Visible = true;
Buttons[offest].Text = Position[offest].ToString();
Buttons[MoveIndex].Visible = false;
}
... {
if(this.IsRun == false)
return;
Buttons[offest].Visible = true;
Buttons[offest].Text = Position[offest].ToString();
Buttons[MoveIndex].Visible = false;
}
判断游戏是否过关 CheckWin()
private
void
CheckWin()
... {
for(int i=1;i<Position.Length;i++)
...{
if(Position[i-1] != (byte)i)
...{
return; //不符合条件返回
}
}
//过关后播放相应音乐和显示过关对话框
PlaySound.Play("WIN.WAV");
IsRun = false;
this.statusBar1.Text+=" 过关!";
Winner wn = new Winner(GameSize,this.Clicks);
wn.ShowDialog();
}
... {
for(int i=1;i<Position.Length;i++)
...{
if(Position[i-1] != (byte)i)
...{
return; //不符合条件返回
}
}
//过关后播放相应音乐和显示过关对话框
PlaySound.Play("WIN.WAV");
IsRun = false;
this.statusBar1.Text+=" 过关!";
Winner wn = new Winner(GameSize,this.Clicks);
wn.ShowDialog();
}
3 总结
拼数字游戏总体设计情况如上,并没有很多很高深的内容,实现的核心在于对数组的操作排列。
源代码下载地址:http://free5.ys168.com/?xuyuexyz DotNet/NumPuzzle.rar