您的位置:首页 > 其它

wpf 浇水灌溉小游戏

2015-06-23 14:20 387 查看
今天带来的是一个灌溉的小游戏,先看一看效果图!





废话不多说先看一看代码,今天这个比较复杂,运用到了类的一些基本知识,首先创建一个classPipe类,用来表示管子的属性,和管子的四个方向开口,开始的时候管子的开口方向都是false,一个Num用来表示图片号,有一个构造方法,有一个参数,通过参数确定管子的开口方向。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _0622
{
class ClassPiPe
{
public ClassPiPe(int num)//构造方法
{
Num = num;
switch (num)
{
case 1:
IsDown = IsReight = true;
break;
case 2:
IsDown = IsLeft = true;
break;
case 3:
IsLeft = IsUp = true;
break;
case 4:
IsLeft = IsReight = true;
break;
case 5:
IsDown = IsUp = IsLeft = true;
break;
case 6:
IsUp = IsLeft = IsReight = true;
break;
case 7:
IsReight = IsDown = IsUp = true;
break;
case 8:
IsDown = IsLeft = IsReight = true;
break;
case 9:
IsLeft = IsReight = true;
break;
case 10:
IsDown = IsUp = true;
break;
case 11:
IsUp = IsReight = IsDown = IsLeft = true;
break;
case 12:
IsUp = IsReight = IsDown = IsLeft = false;
break;
}
}

int num;//记录图片号

public int Num
{
get { return num; }
set { num = value; }
}

bool isUp;

public bool IsUp
{
get { return isUp; }
set { isUp = value; }
}

bool isDown;

public bool IsDown
{
get { return isDown; }
set { isDown = value; }
}
bool isLeft;

public bool IsLeft
{
get { return isLeft; }
set { isLeft = value; }
}
bool isReight;

public bool IsReight
{
get { return isReight; }
set { isReight = value; }
}
}
}


接下来创建一个土地类,ClassFiled,主要用来判断管子的周围是不是有地,如果存在,就表示水可以通过管子流下去! 还有一个ImaClick用来表示这块土地上面的管子,还有刚才创建的那个ClassPipe类,是刚开始的时候管子的开口都是关闭的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace _0622
{
class ClassFiled
{
public ClassFiled(int num)
{
if (num > 6)
{
IsLinkUp = true;
}
if (num < 41)
{
IsLinkDown = true;
}
if (num % 7 != 0)
{
IsLinkLeft = true;
}
if (num % 7 != 6)
{
IsLinkReight = true;
}
}
ClassPiPe cp = new ClassPiPe(12);

internal ClassPiPe Cp
{
get { return cp; }
set { cp = value; }
}

Image imgclick = new Image();

public Image Imgclick
{
get { return imgclick; }
set { imgclick = value; }
}

bool iswatered;

public bool Iswatered
{
get { return iswatered; }
set { iswatered = value; }
}

bool isLinkUp;

public bool IsLinkUp
{
get { return isLinkUp; }
set { isLinkUp = value; }
}
bool isLinkDown;

public bool IsLinkDown
{
get { return isLinkDown; }
set { isLinkDown = value; }
}
bool isLinkLeft;

public bool IsLinkLeft
{
get { return isLinkLeft; }
set { isLinkLeft = value; }
}
bool isLinkReight;

public bool IsLinkReight
{
get { return isLinkReight; }
set { isLinkReight = value; }
}
}
}


下面就是我们的主要函数体了,先来分析一个,首先我们要将49快土地的位置放好,然后关键水池下面的管子通道,完成之后呢,在创建我们要进行放置的四张管子图片, 将管子的图片号存放带管子类数组当中去 ,然后将管子图片存放到一个数组里面中区,每当点击一个土地的时候,将数组里面管子放到土地上面,然后后一个管子向前移动,一次循环,随即产生一个新的管子,放置到最新的数组里面。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _0622
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{

Image[] imgclick;//存放图片
Image[] imgleft = new Image[4];
int x = 7;
Image imgv = new Image();
Image imgw = new Image();
Random r = new Random();
ClassPiPe[] pipe = new ClassPiPe[4];//类数组
ClassFiled[] Cf = new ClassFiled[49];
int click;//点击次数
Button bt = new Button();
public MainWindow()
{
InitializeComponent();
this.WindowState = System.Windows.WindowState.Maximized;
this.Width = SystemParameters.FullPrimaryScreenWidth;//设置全宽度
this.Height = SystemParameters.FullPrimaryScreenHeight;//设置全频高度
this.Left = 0;//让窗体的开始位置处于整个屏幕
this.Top = 0;
this.WindowStyle = System.Windows.WindowStyle.None;//去边框
this.AllowsTransparency = true;//透明
this.Background = Brushes.BurlyWood;//背景透明
this.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;//剧中
imgclick = new Image[x * x];
tudi();//产生土地
btn();//产生按钮
guanzi();//产生管子
}

private void btn()
{
bt.Content = "重新开始";
bt.Click += new RoutedEventHandler(bt_Click);
bt.Width = 70;
bt.Height = 30;
Canvas.SetTop(bt, 200);
Canvas.SetLeft(bt, 200);
back.Children.Add(bt);
}

private void guanzi()
{
for (int i = 0; i < 4; i++)
{
Image imgguan = new Image();
pipe[i] = new ClassPiPe(r.Next(1, 12));//图片号
imgleft[i] = imgguan;//存放管子的数组
if (i == 3)
{
imgguan.Width = 90;
imgguan.Height = 90;
}
else
{
imgguan.Width = 80;
imgguan.Height = 80;
}
imgguan.Source = new BitmapImage(new Uri("images/Ready/" + pipe[i].Num + ".jpg", UriKind.Relative));
Canvas.SetLeft(imgguan, 50 + i * 95);
Canvas.SetTop(imgguan, 50);
back.Children.Add(imgguan);
}
}
private void tudi()
{
for (int i = 0; i < imgclick.Length; i++)
{
Image img = new Image();
img.Source = new BitmapImage(new Uri("images/field.jpg", UriKind.Relative));
Cf[i] = new ClassFiled(i);//土地号
img.Tag = i;
img.Width = 80;
img.Height = 80;
img.MouseDown += new MouseButtonEventHandler(img_MouseDown);
Canvas.SetLeft(img, this.Width / 2 + i % 7 * img.Width);
Canvas.SetTop(img, 200 + i / 7 * img.Height);
imgclick[i] = img;
back.Children.Add(img);

}
imgv.Source = new BitmapImage(new Uri("images/V.jpg", UriKind.Relative));
imgv.Width = 80;
imgv.Height = 150;
Canvas.SetLeft(imgv, this.Width / 2 + 560 / 2 - 40);
Canvas.SetTop(imgv, 85);
back.Children.Add(imgv);

imgw.Source = new BitmapImage(new Uri("images/Water.jpg", UriKind.Relative));
imgw.Width = 120;
imgw.Height = 120;
Canvas.SetLeft(imgw, this.Width / 2 + 560 / 2 - 60);
Canvas.SetTop(imgw, 21);
back.Children.Add(imgw);
imgw.MouseDown += new MouseButtonEventHandler(imgw_MouseDown);
}

void bt_Click(object sender, RoutedEventArgs e)
{
back.Children.Clear();
click = 0;
btn();
tudi();
guanzi();

}
//点击水源
//实例化类
int num = 3;
void imgw_MouseDown(object sender, MouseButtonEventArgs e)
{
imgv.Source = new BitmapImage(new Uri("images/Water/H10.jpg", UriKind.Relative));
Watering(num);
}

private void Watering(int num)
{
// guan(num);
if (click < 49)//没有铺满土地
{
MessageBox.Show("Sorry 土地没有填充完毕!");
}
if (click == 49)
{
if (Cf[3].Cp.IsUp)
{
guan(num);
//    for (int i = 0; i < 49; i++)
//    {
//        if (Cf[i].Iswatered == false)
//        {
//            goto stop;
//        }
//        if (i == 48)
//        {
//            MessageBox.Show("成功");
//        }
//    }
//stop: MessageBox.Show("失败");

}
else
{
MessageBox.Show("失败");
}
}

}

private void guan(int num)
{
if (Cf[num].Iswatered == false)
{
Cf[num].Iswatered = true;
Cf[num].Imgclick.Source = new BitmapImage(new Uri("images/Water/H" + Cf[num].Cp.Num + ".jpg", UriKind.Relative));
if (Cf[num].IsLinkReight && Cf[num].Cp.IsReight && Cf[num + 1].Cp.IsLeft)
{
Watering(num + 1);
}
if (Cf[num].IsLinkLeft && Cf[num].Cp.IsLeft && Cf[num - 1].Cp.IsReight)
{
Watering(num - 1);
}
if (Cf[num].IsLinkUp && Cf[num].Cp.IsUp && Cf[num - 7].Cp.IsDown)
{
Watering(num - 7);
}
if (Cf[num].IsLinkDown && Cf[num].Cp.IsDown && Cf[num + 7].Cp.IsUp)
{
Watering(num + 7);
}

}

}
//点击土地
void img_MouseDown(object sender, MouseButtonEventArgs e)
{
Image img = (Image)sender;
img.MouseDown -= new MouseButtonEventHandler(img_MouseDown);
Cf[(int)img.Tag].Cp = pipe[3];//将放在地里面的管子属性放到土地类里面去img.Tag表示土地的号码在土地类里面去用管子类
Cf[(int)img.Tag].Imgclick = img;//将点击的图片放到地里面
img.Source = new BitmapImage(new Uri("images/Ready/" + pipe[3].Num + ".jpg", UriKind.Relative));
click++;
for (int i = 3; i > 0; i--)
{
pipe[i] = pipe[i - 1];
imgleft[i].Source = imgleft[i - 1].Source;
}
if (click > 45)
{

pipe[0] = null;
imgleft[0].Source = null;
}
else
{
pipe[0] = new ClassPiPe(r.Next(1, 11));
imgleft[0].Source = new BitmapImage(new Uri("images/Ready/" + pipe[0].Num + ".jpg", UriKind.Relative));
}

}
}
}


好了到了这一步就基本完成了整个过程,!

源码下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: