C++俄羅斯方塊程序設計詳細說明
《C++俄羅斯方塊程序設計詳細說明》由會員分享,可在線閱讀,更多相關《C++俄羅斯方塊程序設計詳細說明(34頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、該實驗制作的是小游戲----俄羅斯方塊 1.可實現(xiàn)以下基本功能: 用戶可自定義添加或刪除方塊樣式及顏色; 用戶可自定義修改游戲背景顏色及按鍵設置。 2.另增加了幾個功能: 按鍵設置改變后點擊保存,會彈出對話框提示“保存成功” ; 點擊“開始”運行游戲,背景音樂自動播放,點擊暫停后,背景音樂也隨之停止; 每消除一行,會有特效聲音提示消除成功; 根據(jù)消行多少會自動加分并顯示。 游戲界面效果圖如下: 配置窗體效果圖如下: 磚塊樣式配置效果圖如下: 游戲設計分為如下九個部分:
2、一, 新建窗體“配置窗體”(TrmConfig) 添加TabControl控件 (1) 磚塊樣式配置 I.abel控件(lblMode) 點擊“事件”,選擇“Paint” Graphics gp=e.Graphics; gp.Clear(Color.Black); Pen p=new Pen(Color.White); for (int i=31;i<155;i=i+31) gp.DrawLine(p,1,i,155,i); for (int i=31;i<155;i=i+31) gp.DrawLine(p,i,1,i,155); SolidBrush s=new So
3、lidBrush(blockColor); for (int x=0;x<5;x++) { for(int y=0;y<5;y++) { if(struArr[x,y]) { gp.FillRectangle(s,31*x+1,31*y+1,30,30); } } } 點擊“事件”,選擇“MouseClick” private bool[,] struArr=new bool[5,5]; private Color blockColor=Color.Red; ----------------------------------------------------
4、---- if (e.Button!=MouseButtons.Left) return; int xPos,yPos; xPos=e.X/31; yPos=e.Y/31; struArr[xPos,yPos]=!struArr[xPos,yPos]; bool b=struArr[xPos,yPos]; Graphics gp=lblMode.CreateGraphics(); SolidBrush s=new SolidBrush(b ? blockColor:Color.Black); gp.FillRectangle(s,31*xPos+1,31*yPos+1,30
5、,30); gp.Dispose(); II.添加ColorDialog控件 添加label(lblColor)控件 點擊“事件”,選擇“click” colorDialog1.ShowDialog(); blockColor=colorDialog1.Color; lblColor.BackColor=colorDialog1.Color; lblMode.Invalidate(); III.添加listView控件(lsvBlockSet) 點擊“事件”,選擇“ItemSelectionChanged” if (e.IsSelected) { blockC
6、olor=Color.FromArgb(int.Parse(e.Item.SubItems[1].Text));
lblColor.BackColor=blockColor;
string s=e.Item.SubItems[0].Text;
for(int i=0;i 7、if(i)
{
isEmpty=true;
break;
}
}
if (!isEmpty)
{
MessageBox.Show("圖案為空,請先用鼠標點擊左邊窗口繪制圖案!","提示窗口",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
StringBuilder sb=new StringBuilder(25);
foreach (bool i in struArr)
{
sb.Append(i?"1":"0");
}
string blockString=sb.ToString 8、();
foreach(ListViewItem item in lsvBlockSet.Items)
{
if (item.SubItems[0].Text==blockString)
{
MessageBox.Show("該圖案已經(jīng)存在!","提示窗口",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
}
ListViewItem myItem=new ListViewItem();
myItem=lsvBlockSet.Items.Add(blockString);
myItem.Sub 9、Items.Add(Convert.ToString(blockColor.ToArgb()));
V.“刪除”按鈕(btnDel)
if(lsvBlockSet.SelectedItems.Count==0)
{
MessageBox.Show("請在右邊窗口選擇一個條目進行刪除!","提示窗口",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
lsvBlockSet.Items.Remove(lsvBlockSet.SelectedItems[0]);
btnClear.PerformCli 10、ck();
VI.“清空”(btnClear)
for (int x=0;x<5;x++)
{
for(int y=0;y<5;y++)
{
struArr[x,y]=false;
}
}
lblMode.Invalidate();
VII.“修改”(btnUpdate)
if(lsvBlockSet.SelectedItems.Count==0)
{
MessageBox.Show("請在右邊窗口選擇一個條目進行修改!","提示窗口",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
retur 11、n;
}
bool isEmpty=false;
foreach (bool i in struArr)
{
if(i)
{
isEmpty=true;
break;
}
}
if (!isEmpty)
{
MessageBox.Show("圖案為空,請先用鼠標點擊左邊窗口繪制圖案再進行修改!","提示窗口",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
StringBuilder sb=new StringBuilder(25);
foreach (bool i in stru 12、Arr)
{
sb.Append(i?"1":"0");
}
lsvBlockSet.SelectedItems[0].SubItems[0].Text=sb.ToString();
lsvBlockSet.SelectedItems[0].SubItems[1].Text=Convert.ToString(blockColor.ToArgb());
(2) 參數(shù)配置
I.添加GroupBox1控件(gbKeySet)“鍵盤設置”
i.拖入六個label控件
ii.拖入六個TextBox控件(改名)
全部選中,選擇“事件”,選擇“KeyDown”
if((e 13、.KeyValue>=33 && e.KeyValue<=36)||(e.KeyValue>=45 && e.KeyValue<=46)||
(e.KeyValue>=48 && e.KeyValue<=57)||(e.KeyValue>=65 && e.KeyValue<=90)||
(e.KeyValue>=96 && e.KeyValue<=107)||(e.KeyValue>=109 && e.KeyValue<=111)||
(e.KeyValue>=186 && e.KeyValue<=192)||(e.KeyValue>=219 && e.KeyValue<=222))
14、{
foreach(Control c in gbKeySet.Controls)
{
Control TempC=c as TextBox;
if(TempC!=null &&((TextBox)TempC).Text!="")
{
if(((int)((TextBox)TempC).Tag)==e.KeyValue)
{
((TextBox)TempC).Text="";
((TextBox)TempC).Tag=Keys.None;
}
}
}
((TextBox)sender).Text=e.KeyCode.ToString();
((TextBox)sen 15、der).Tag=(Keys)e.KeyValue;
}
II.添加GroupBox2控件(gbEnvironmentSet)“環(huán)境設置”
i.拖入四個label控件
ii.拖入三個TextBox控件(改名)
一個label控件(lblBackColor)
選擇“事件”,選擇“click”
colorDialog1.ShowDialog();
lblBackColor.BackColor=colorDialog1.Color;
III.
i.參數(shù)初始化設置
為配置窗體的代碼窗口添加私有成員變量
private Config config=new Con 16、fig();
初始化
config.LoadFromXmlFile();
InfoArr info = config.Info;
ListViewItem myItem=new ListViewItem();
for(int i=0;i 17、tring();
txtDown.Tag=config.DownKey;
txtDrop.Text=((Keys)config.DropKey).ToString();
txtDrop.Tag=config.DropKey;
txtLeft.Text=((Keys)config.MoveLeftKey).ToString();
txtLeft.Tag=config.MoveLeftKey;
txtRight.Text=((Keys)config.MoveRightKey).ToString();
txtRight.Tag=config.MoveRightKey;
txtDeas 18、il.Text=((Keys)config.DeasilRotateKey).ToString();
txtDeasil.Tag=config.DeasilRotateKey;
txtContra.Text=((Keys)config.ContraRotateKey).ToString();
txtContra.Tag=config.ContraRotateKey;
txtCoorWidth.Text=config.CoorWidth.ToString();
txtCoorHeight.Text=config.CoorHeight.ToString();
txtRectPix. 19、Text=config.RectPix.ToString();
lblBackColor.BackColor=config.BackColor;
ii.保存更改
選擇“事件”,選擇“click”
保存用戶更改的設置
InfoArr info=new InfoArr();
foreach(ListViewItem item in lsvBlockSet.Items)
{
info.Add(item.SubItems[0].Text,item.SubItems[1].Text);
}
config.Info=info;
config.DownKey=(Keys)txtDo 20、wn.Tag;
config.DropKey=(Keys)txtDrop.Tag;
config.MoveLeftKey=(Keys)txtLeft.Tag;
config.MoveRightKey=(Keys)txtRight.Tag;
config.DeasilRotateKey=(Keys)txtDeasil.Tag;
config.ContraRotateKey=(Keys)txtContra.Tag;
config.CoorWidth=int.Parse(txtCoorWidth.Text);
config.CoorHeight=int.Parse(txtCoorHei 21、ght.Text);
config.RectPix=int.Parse(txtRectPix.Text);
config.BackColor=lblBackColor.BackColor;
config.SaveToXmlFile();
二, 信息保存
解決方案中添加BlockSet.Xml文件
22、0000000000
23、000000
24、8
25、>-16777216 26、r BColor
{
get
{
return _bColor;
}
set
{
_bColor=value;
}
}
public string GetIdStr()
{
StringBuilder s=new StringBuilder(25);
foreach(bool b in _id)
{
s.Append(b?"1":"0");
}
return s.ToString();
}
public string GetColorStr()
{
return Convert.ToString(_bColor.ToArgb());
}
由于使用 27、到了Color類,要添加命名空間
using Syetem.Drawing;
由于使用了StringBuilder類以及BitArray類
using System.Collections.Generic;
-->using System.Collections;
四, 多個磚塊信息類
解決方案中添加InfoArr.cs類
I .各個方塊信息類
private ArrayList info = new ArrayList();
private int _length=0;
public int Length
{
get
{
return _length;
28、}
}
public BlockInfo this[int index]
{
get
{
return (BlockInfo)info[index];
}
}
public string this[string id]
{
set
{
if(value =="")
{
return;
}
for(int i=0;i 29、oInt32(value));
}
catch(System.FormatException)
{
MessageBox.Show("顏色信息錯誤!請刪除BlockSet.xml文件,并重新啟動程序","錯誤信息",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
}
}
//由于使用到了ArrayList,要添加命名空間
using System.Collections.Generic;
-->using System.Collections;
//由于使用到了MessageBox,要添加命名空間
usin 30、g System.Windows.Forms;
由于使用到了Color類,還要添加
using Syetem.Drawing;
II.添加字符轉(zhuǎn)換成員方法
private BitArray StrToBit(string id)
{
if(id.Length !=25)
{
throw new System.FormatException("磚塊樣式信息不合法!請刪除BlockSet.xml文件,并重新啟動程序");
}
BitArray ba =new BitArray(25);
for(int i=0;i<25;i++)
{
ba[i]=(id[i]==0)? 31、false:true;
}
return ba;
}
III.添加磚塊信息成員方法
public void Add(BitArray id,Color bColor)
{
if(id.Length !=25)
{
throw new System.FormatException("磚塊樣式信息不合法!請刪除BlockSet.xml文件,并重新啟動程序");
}
info.Add(new BlockInfo(id,bColor));
_length++;
}
IV.對上面方法重載
public void Add(string id,string bColor 32、)
{
Color temp;
if(!(bColor==""))
{
temp=Color.FromArgb(Convert.ToInt32(bColor));
}
else
{
temp=Color.Empty;
}
info.Add(new BlockInfo(StrToBit(id),temp));
_length++;
}
五, 新建配置類
解決方案中添加 Config.cs類
private Keys _downKey;
private Keys _dropKey;
private Keys _moveLeftKey;
private 33、Keys _moveRightKey;
private Keys _deasilRotateKey;
private Keys _contraRotateKey;
private int _coorWidth;
private int _coorHeight;
private int _rectPix;
private Color _backColor;
private InfoArr info=new InfoArr();
I.私有變量屬性
#region 私有變量相應的屬性
public Keys DownKey
{
get
{
return _downKey; 34、
}
set
{
_downKey=value;
}
}
public Keys DropKey
{
get
{
return _dropKey;
}
set
{
_dropKey=value;
}
}
public Keys MoveLeftKey
{
get
{
return _moveLeftKey;
}
set
{
_moveLeftKey=value;
}
}
public Keys MoveRightKey
{
get
{
return _moveRightKey;
}
set
{
_moveRightKey 35、=value;
}
}
public Keys DeasilRotateKey
{
get
{
return _deasilRotateKey;
}
set
{
_deasilRotateKey=value;
}
}
public Keys ContraRotateKey
{
get
{
return _contraRotateKey;
}
set
{
_contraRotateKey=value;
}
}
public int CoorWidth
{
get
{
return _coorWidth;
}
set
{
if(va 36、lue>=10&&value<=50)
_coorWidth=value;
}
}
public int CoorHeight
{
get
{
return _coorHeight;
}
set
{
if(value>=15&&value<=50)
_coorHeight=value;
}
}
public int RectPix
{
get
{
return _rectPix;
}
set
{
if(value>=10&&value<=30)
_rectPix=value;
}
}
public Color BackColor
{
37、get
{
return _backColor;
}
set
{
_backColor=value;
}
}
public InfoArr Info
{
get
{
return info;
}
set
{
info=value;
}
}
#endregion
II.從xml讀取信息
public void LoadFromXmlFile()//從xml讀取信息
{
XmlTextReader reader;
if (File.Exists("BlockSet.xml"))
{
reader=new XmlTextReader("Blo 38、ckSet.xml");
}
else
{
Assembly asm=Assembly.GetExecutingAssembly();
Stream sm=asm.GetManifestResourceStream("Tetris.BlockSet.xml");
reader=new XmlTextReader(sm);
}
string key="";
try
{
while(reader.Read())
{
if(reader.NodeType ==XmlNodeType.Element)
{
if(reader.Name =="ID")
{
key=re 39、ader.ReadElementString().Trim();
info.Add(key,"");
}
else if (reader.Name =="Color")
{
info[key]=reader.ReadElementString().Trim();
}
else if (reader.Name =="DownKey")
{
_downKey=(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="DropKey")
{
_dropKey=(Ke 40、ys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="MoveLeftKey")
{
_moveLeftKey=(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="MoveRightKey")
{
_moveRightKey=(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else 41、if (reader.Name =="DeasilRotateKey")
{
_deasilRotateKey=(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="ContraRotateKey")
{
_contraRotateKey=(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="CoorWidth")
{
_coorWidth=Conv 42、ert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="CoorHeight")
{
_coorHeight=Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="RectPix")
{
_rectPix=Convert.ToInt32(reader.ReadElementString().Trim());
}
else if (reader.Name =="BackColor")
43、
{
_backColor=Color.FromArgb(Convert.ToInt32(reader.ReadElementString().Trim()));
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
if(reader !=null)
reader.Close();
}
III.把信息保存為xml文件
public void SaveToXmlFile() //把信息保存為xml文件
{
XmlDocument doc =new XmlDocu 44、ment();
doc.LoadXml(" 45、XmlElement xelColor=doc.CreateElement("Color");
xelColor.InnerText=((BlockInfo)info[i]).GetColorStr();
xelType.AppendChild(xelColor);
root.AppendChild(xelType);
}
//寫快捷鍵
XmlElement xelKey=doc.CreateElement("Key");
XmlElement xelDownKey=doc.CreateElement("DownKey");
xelDownKey.InnerText=Con 46、vert.ToInt32(_downKey).ToString();
xelKey.AppendChild(xelDownKey);
XmlElement xelDropKey=doc.CreateElement("DropKey");
xelDropKey.InnerText=Convert.ToInt32(_dropKey).ToString();
xelKey.AppendChild(xelDropKey);
XmlElement xelMoveLeftKey=doc.CreateElement("MoveLeftKey");
xelMoveLeftKey.Inner 47、Text=Convert.ToInt32(_moveLeftKey).ToString();
xelKey.AppendChild(xelMoveLeftKey);
XmlElement xelMoveRightKey=doc.CreateElement("MoveRightKey");
xelMoveRightKey.InnerText=Convert.ToInt32(_moveRightKey).ToString();
xelKey.AppendChild(xelMoveRightKey);
XmlElement xelDeasilRotateKey=doc.Create 48、Element("DeasilRotateKey");
xelDeasilRotateKey.InnerText=Convert.ToInt32(_deasilRotateKey).ToString();
xelKey.AppendChild(xelDeasilRotateKey);
XmlElement xelContraRotateKey=doc.CreateElement("ContraRotateKey");
xelContraRotateKey.InnerText=Convert.ToInt32(_contraRotateKey).ToString();
xelKey. 49、AppendChild(xelContraRotateKey);
root.AppendChild(xelKey);
//寫界面信息
XmlElement xelSurface=doc.CreateElement("Surface");
XmlElement xelCoorWidth=doc.CreateElement("CoorWidth");
xelCoorWidth.InnerText= _coorWidth.ToString();
xelSurface.AppendChild(xelCoorWidth);
XmlElement xelCoorHeight=do 50、c.CreateElement("CoorHeight");
xelCoorHeight.InnerText= _coorHeight.ToString();
xelSurface.AppendChild(xelCoorHeight);
XmlElement xelRectPix=doc.CreateElement("RectPix");
xelRectPix.InnerText= _rectPix.ToString();
xelSurface.AppendChild(xelRectPix);
XmlElement xelBackColor=doc.CreateElemen 51、t("BackColor");
xelBackColor.InnerText=_backColor.ToArgb().ToString();
xelSurface.AppendChild(xelBackColor);
root.AppendChild(xelSurface);
doc.Save("BlockSet.xml");
}
六, 新建方塊類
解決方案中添加Block.cs類
protected Point[] structArr;
protected int _xPos;
protected int _yPos;
protected Color _ 52、blockColor;
protected Color disapperColor;
protected int rectPix;
public Block()
{
}
public Block(Point[] sa, Color bColor, Color dColor, int pix)
{
_blockColor=bColor;
disapperColor=dColor;
rectPix=pix;
structArr=sa;
}
public Point this[int index]
{
get
{
return structArr[index];
53、}
}
public int Length
{
get
{
return structArr.Length;
}
}
#region 成員變量相應的屬性
public int XPos
{
get
{
return _xPos;
}
set
{
_xPos=value;
}
}
public int YPos
{
get
{
return _yPos;
}
set
{
_yPos=value;
}
}
public Color BlockColor
{
get
{
return _blockColor;
}
}
#e 54、ndregion
--------------------------------
public void DeasilRotate()//順時針旋轉(zhuǎn)
{
int temp;
for(int i=0;i 55、
{
temp=structArr[i].X;
structArr[i].X=-structArr[i].Y;
structArr[i].Y=temp;
}
}
private Rectangle PointToRect(Point p)//坐標點轉(zhuǎn)化為畫布坐標值
{
return new Rectangle((_xPos + p.X)*rectPix+1,
(_yPos-p.Y)*rectPix+1,
rectPix-2,
rectPix-2);
}
public virtual void Paint(Graphics gp)//制定畫板下繪制磚塊
{
Sol 56、idBrush sb=new SolidBrush(_blockColor);
foreach(Point p in structArr)
{
lock(gp)
{
gp.FillRectangle(sb,PointToRect(p));
}
}
}
public void erase(Graphics gp)//擦除矩形
{
SolidBrush sb=new SolidBrush(disapperColor);
foreach(Point p in structArr)
{
lock(gp)
{
gp.FillRectangle(sb,PointToRect 57、(p));
}
}
}
七, 新建生產(chǎn)磚塊的類
解決方案中添加BlockGroup.cs類
private InfoArr info;
private Color disapperColor;
private int rectPix;
public BlockGroup()
{
Config config=new Config();
config.LoadFromXmlFile();
info=new InfoArr();
info=config.Info;
disapperColor=config.BackColor;
rectPix=config.R 58、ectPix;
}
public Block GetABlock()
{
Random rd=new Random();
int keyOrder=rd.Next(0,info.Length);
BitAarry ba=info[keyOrder].ID;
int struNum=0;
foreach(bool b in ba)
{
if(b)
{
struNum++;
}
}
Point[] structArr=new Point[struNum];
int k=0;
for(int j=0;j 59、
structArr[k].X=j/5-2;
structArr[k].Y=2-j%5;
k++;
}
}
return new Block(structArr,info[keyOrder].BColor,disapperColor,rectPix);
}
八, 新建為磚塊活動定規(guī)則的類
在解決方案中添加Palette.cs類
private int _width=15;
private int _height=25;
private Color[,] coorArr;
private Color disapperColor;
private Graphic 60、s gpPalette;
private Graphics gpReady;
private BlockGroup bGroup;
private Block runBlock;
private Block readyBlock;
private int rectPix;
private System.Timers.Timer timerBlock;
private int timeSpan=800;
public Palette(int x,int y,int pix,Color dColor,Graphics gp,Graphics gr)
{
_width=x 61、;
_height=y;
coorArr=new Color[_width,_height];
disapperColor=dColor;
gpPalette=gp;
gpReady=gr;
rectPix=pix;
}
public void Start()
{
bGroup=new BlockGroup();
runBlock=bGroup.GetABlock();
runBlock.XPos=_width/2;
int y=0;
for(int i=0;i 62、unBlock[i].Y;
}
}
runBlock.YPos=y;
gpPalette.Clear(disapperColor);//清空畫板
runBlock.Paint(gpPalette);
Thread.Sleep(20);
readyBlock=bGroup.GetABlock();
readyBlock.XPos=2;
readyBlock.YPos=2;
gpReady.Clear(disapperColor);//清空畫板
readyBlock.Paint(gpReady);
timerBlock=new Sy 63、stem.Timers.Timer(timeSpan);
timerBlock.Elapsed +=new System.Timers.ElapsedEventHandler(OnTimedEvent);
timerBlock.AutoReset=true;
timerBlock.Start();
}
private void OnTimedEvent(object source,ElapsedEventArgs e)
{
CheckAndOverBlock();
Down();
}
public bool Down()
{
int xPos=runBloc 64、k.XPos;
int yPos=runBlock.YPos+1;
for(int i=0;i 65、 void Drop()
{
timerBlock.Stop();
while(Down());
timerBlock.Start();
}
public void MoveLeft()
{
int xPos=runBlock.XPos-1;
int yPos=runBlock.YPos;
for(int i=0;i 66、}
runBlock.erase(gpPalette);
runBlock.XPos--;
runBlock.Paint(gpPalette);
}
public void MoveRight()
{
int xPos=runBlock.XPos+1;
int yPos=runBlock.YPos;
for(int i=0;i
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。