C# 实现两条贪吃蛇同时移动.docx
- 文档编号:23361401
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:41.70KB
C# 实现两条贪吃蛇同时移动.docx
《C# 实现两条贪吃蛇同时移动.docx》由会员分享,可在线阅读,更多相关《C# 实现两条贪吃蛇同时移动.docx(18页珍藏版)》请在冰豆网上搜索。
C#实现两条贪吃蛇同时移动
C#实现两条贪吃蛇同时移动
需要同时控制2条贪吃蛇,并且蛇的速度变快以及同时生成Good和Bad两种食物,吃到GoodFood蛇身加1,反之减1,另外改进了蛇碰撞代码,其它效果同之前一样。
Grid0:
菜单,分数,难度选择等
效果图如下:
边框Border
Grid1
GoodFood
边框内为游戏区域Canvas
蛇2,初始向右移动
蛇1,初始向左移动
BadFood
界面设计:
把主Grid分为2个Grid,Grid0里面主要是菜单,得分,坐标等;Grid1里面再放一个Grid命名为GridName,然后在里面放一个边框(border),在边框里加入蛇移动区域(canvas)
程序设计:
主要就是食物和蛇的生成,此处均使用border控件,这里需要注意的是食物大小和蛇每一截大小需要一样,不然会吃不到食物^_^
另外,此处由于有Good和Bad2种食物,因此也要判断食物生成是否重叠,另外改进了之前判断食物和蛇冲突问题^_^
同样的,由于SoundPlayer不能同时播放几种音乐,因此此例需要用mediaplayer来播放背景应用和音效,可以选择背景音乐。
主要代码如下:
privatevoidSnake1Timer_Tick(objectsender,EventArgse)//蛇1移动事件
{
for(inti=0;i { if(snakeList1[i].Tag.ToString()=="Right")//向右移动 { Canvas.SetLeft(snakeList1[i],Canvas.GetLeft(snakeList1[i])+size); } elseif(snakeList1[i].Tag.ToString()=="Left")//向左移动 { Canvas.SetLeft(snakeList1[i],Canvas.GetLeft(snakeList1[i])-size); } elseif(snakeList1[i].Tag.ToString()=="Up")//向上移动 { Canvas.SetTop(snakeList1[i],Canvas.GetTop(snakeList1[i])-size); } elseif(snakeList1[i].Tag.ToString()=="Down")//向下移动 { Canvas.SetTop(snakeList1[i],Canvas.GetTop(snakeList1[i])+size); } } if(snakeList1.Count>0)//蛇1位置显示,如果蛇身为0,位置不显示 { lab2.Content="蛇实际位置X: "+Canvas.GetTop(snakeList1[0]).ToString(); lab3.Content="蛇实际位置Y: "+Canvas.GetLeft(snakeList1[0]).ToString(); } else { lab2.Content="蛇实际位置X: ---"; lab3.Content="蛇实际位置Y: ---"; } for(inti=snakeList1.Count-1;i>0;i--) { snakeList1[i].Tag=snakeList1[i-1].Tag;//蛇身跟随蛇头,占蛇头位置 } //蛇1碰到墙或者蛇长度为0 if(snakeList1.Count==0||Canvas.GetTop(snakeList1[0])<=-1||Canvas.GetTop(snakeList1[0])>=gameArea.Height||Canvas.GetLeft(snakeList1[0])<=-1||Canvas.GetLeft(snakeList1[0])>=gameArea.Width) { GameOver(); } //吃到好食物 if(snakeList1.Count>0&&Canvas.GetTop(snakeList1[0])==Canvas.GetTop(GoodFood)&&Canvas.GetLeft(snakeList1[0])==Canvas.GetLeft(GoodFood)) { Music_EatGoodFood=newMediaPlayer();//吃到好食物音乐 Music_EatGoodFood.Open(newUri(Environment.CurrentDirectory+"/Music/0.wav",UriKind.Relative)); Music_EatGoodFood.Play(); gameArea.Children.Remove(GoodFood);//删除吃的好食物 CreateGoodFood();//重新创建好食物 BorderSnake1=newBorder { Width=size, Height=size, Tag="", Background=Brushes.Purple, CornerRadius=newCornerRadius(5)//边框圆角的半径 };//增添蛇身 Canvas.SetLeft(Snake1,Canvas.GetLeft(snakeList1[snakeList1.Count-1]));//获取到蛇尾的Left位置 Canvas.SetTop(Snake1,Canvas.GetTop(snakeList1[snakeList1.Count-1]));//获取到蛇尾的Top位置 gameArea.Children.Add(Snake1); snakeList1.Add(Snake1); score++; Label1.Content="得分: "+score+"分"; } //吃到坏食物 if(snakeList1.Count>0&&Canvas.GetTop(snakeList1[0])==Canvas.GetTop(BadFood)&&Canvas.GetLeft(snakeList1[0])==Canvas.GetLeft(BadFood)) { SystemSounds.Hand.Play();//吃到坏食物音乐 gameArea.Children.Remove(BadFood);//删掉吃的坏食物 CreateBadFood();//重新创建坏食物 if(score>0) { score--; Label1.Content="得分: "+score+"分"; } gameArea.Children.Remove(snakeList1[snakeList1.Count-1]);//清除蛇身最后一节 snakeList1.Remove(snakeList1[snakeList1.Count-1]);//清除集合最后一节 } for(inti=1;i { if(Canvas.GetTop(snakeList1[0])==Canvas.GetTop(snakeList1[i])&&Canvas.GetLeft(snakeList1[0])==Canvas.GetLeft(snakeList1[i]))//蛇头碰到蛇身 { GameOver(); } } } //蛇2移动事件同理 privatevoidMainWindow_KeyDown(objectsender,KeyEventArgse)//判断按键移动方向 { if(level==1)//初级1条蛇WSAD移动 { switch(e.Key) { caseKey.A: snakeList1[0].Tag="Left";break; caseKey.D: snakeList1[0].Tag="Right";break; caseKey.W: snakeList1[0].Tag="Up";break; caseKey.S: snakeList1[0].Tag="Down";break; default: break; } } else { switch(e.Key) { caseKey.A: snakeList1[0].Tag="Left";break; caseKey.D: snakeList1[0].Tag="Right";break; caseKey.W: snakeList1[0].Tag="Up";break; caseKey.S: snakeList1[0].Tag="Down";break; caseKey.Left: snakeList2[0].Tag="Left";break; caseKey.Right: snakeList2[0].Tag="Right";break; caseKey.Up: snakeList2[0].Tag="Up";break; caseKey.Down: snakeList2[0].Tag="Down";break; default: break; } } } privatevoidCreateGoodFood()//创建好食物 { GoodFood.Width=size; GoodFood.Height=size; GoodFood.Background=Brushes.Purple;//食物颜色 GoodFood.CornerRadius=newCornerRadius(5); #region判断生成的好食物是否和坏食物重叠,且是否和蛇1蛇2重叠 if(BadFood.Width==10) { boolb1=false; do { Canvas.SetLeft(GoodFood,ran.Next(1,98)*size); Canvas.SetTop(GoodFood,ran.Next(1,78)*size); for(inti=0;i { for(intj=0;j { boolc1=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(BadFood))&&(Canvas.GetTop(GoodFood)==Canvas.GetTop(BadFood)); boolc2=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(snakeList1[i])&&Canvas.GetTop(GoodFood)==Canvas.GetTop(snakeList1[i])); boolc3=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(snakeList2[j])&&Canvas.GetTop(GoodFood)==Canvas.GetTop(snakeList2[j])); if(! (c1||c2||c3)) { b1=false; } else { b1=true; } } } }while(b1); } else { boolb2=false; do { Canvas.SetLeft(GoodFood,ran.Next(1,98)*size); Canvas.SetTop(GoodFood,ran.Next(1,78)*size); for(inti=0;i { for(intj=0;j { boolc2=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(snakeList1[i])&&Canvas.GetTop(GoodFood)==Canvas.GetTop(snakeList1[i])); boolc3=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(snakeList2[j])&&Canvas.GetTop(GoodFood)==Canvas.GetTop(snakeList2[j])); if(! (c2||c3)) { b2=false; } else { b2=true; } } } }while(b2); } #endregion gameArea.Children.Add(GoodFood); } privatevoidCreateBadFood()//创建坏食物 { BadFood.Width=size; BadFood.Height=size; BadFood.Background=Brushes.Black; BadFood.CornerRadius=newCornerRadius(5); boolb1=false; do { Canvas.SetLeft(BadFood,ran.Next(1,98)*size); Canvas.SetTop(BadFood,ran.Next(1,78)*size); for(inti=0;i { for(intj=0;j { boolc1=(Canvas.GetLeft(GoodFood)==Canvas.GetLeft(BadFood))&&(Canvas.GetTop(GoodFood)==Canvas.GetTop(BadFood)); boolc2=(Canvas.GetLeft(BadFood)==Canvas.GetLeft(snakeList1[i])&&Canvas.GetTop(BadFood)==Canvas.GetTop(snakeList1[i])); boolc3=(Canvas.GetLeft(BadFood)==Canvas.GetLeft(snakeList2[j])&&Canvas.GetTop(BadFood)==Canvas.GetTop(snakeList2[j])); if(! (c1||c2||c3)) { b1=false; } else { b1=true; } } } }while(b1); gameArea.Children.Add(BadFood); } privatevoidCreateSnake1()//创建蛇1 { intlenght=4;//默认蛇长度 for(inti=0;i { Bordersna1=newBorder { Width=size, Height=size,//蛇宽度,高度 Tag="Left"//默认方法向左移动 }; if(i==0) { sna1.Background=Brushes.Red;//蛇头颜色 } else { sna1.Background=Brushes.Purple;//蛇身颜色 } Canvas.SetLeft(sna1,gameArea.Width/2+(size*i));//需要确保蛇初始位是10的倍数,不然吃不到食物.. Canvas.SetTop(sna1,gameArea.Height/2); sna1.CornerRadius=newCornerRadius(5); gameArea.Children.Add(sna1); snakeList1.Add(sna1); } } privatevoidCreateSnake2()//创建蛇2 { intlength=4; for(inti=0;i { Bordersna2=newBorder { Width=size, Height=size, Tag="Right"//默认方法向右移动 }; if(i==0) { sna2.Background=Brushes.Red;//蛇头颜色 } else { sna2.Background=Brushes.Orange;//蛇身颜色 } Canvas.SetLeft(sna2,gameArea.Width/2-(size*i));//需要确保蛇初始位是10的倍数,不然吃不到食物.. Canvas.SetTop(sna2,(gameArea.Height/2)+10);//生成蛇2在蛇1下方(蛇1Y轴+10) sna2.CornerRadius=newCornerRadius(5); gameArea.Children.Add(sna2); snakeList2.Add(sna2); } } privatevoidLevel1_Click(objectsender,RoutedEventArgse)//游戏难度选择1 { if(GameStart==false) { MessageBox.Show("请先结束游戏! "); } else { level=1; SnakeTime=100; LevelDisplay.Content="当前难度: 初级"; Music_BGM.Open(newUri(Environment.CurrentDirectory+"/Music/3.wav",UriKind.Relative));//背景音乐选择 } } privatevoidLevel2_Click(objectsender,RoutedEventArgse)//游戏难度选择2 { if(GameStart==false) { MessageBox.Show("请先结束游戏! "); } else { level=2; SnakeTime=100; LevelDisplay.Content="当前难度: 高级"; Music_BGM.Open(newUri(Environment.CurrentDirectory+"/Music/2.wav",UriKind.Relative));//背景音乐选择 } } privatevoidStartBtn_Click(objectsender,RoutedEventArgse)//开始游戏 { gameArea.Focus(); this.KeyDown+=MainWindow_KeyDown; snake1Timer.Interval=TimeSpan.FromMilliseconds(SnakeTime); snake2Timer.Interval=TimeSpan.FromMilliseconds(SnakeTime); CreateSnake3(); if(GameStart==true)//不能重复点击开始 { if(level==1) { CreateSnake1(); } else { CreateSnake1();//生成蛇1 CreateSnake2();//生成蛇2 } CreateGoodFood();//生成好食物 CreateBadFood();//生成坏食物 } if(level==1) { snake1Timer.Start(); } else { snake1Timer.Start(); snake2Timer.Start(); } Music_BGM.MediaEnded+=Music_BGM_MediaEnded;//背景音乐循环播放事件 Music_BGM.Play();//背景音乐播放 GameStart=false;//游戏启动后禁止再启动 Start_Btn.IsEnabled=false; } privatevoidPauseBtn_Click(objectsender,RoutedEventArgse)//暂停游戏 { this.KeyDown-=MainWindow_KeyDown; if(level==1) { snake1Timer.Stop(); } else { snake1Timer.Stop();//蛇移动停止 snake2Timer.Stop(); } GameStart=false;//游戏启动后禁止再启动 Start_Btn.IsEnabled=true; Music_BGM.Pause();//背景音乐暂停 } privatevoidStopBtn_Click(objectsender,RoutedEventArgse)//停止游戏 { this.KeyDown-=MainWindow_KeyDown; if(level==1) { snake1Timer.Stop(); } else { snake1Timer.Stop();//蛇移动停止 snake2Timer.Stop(); } gameArea.Children.Clear();//清除游戏区 if(level==1) { snakeList1.Clear(); } else { snakeList1.Clear();//清除存储蛇的泛型 snakeList2.Clear(); } GameStart=true;//允许游戏开始 score=0; Label1.Content="得分: "+score+"分"; Music_BGM.Stop();//背景音乐停止 Start_Btn.IsEnabled=true; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 实现两条贪吃蛇同时移动 实现 贪吃 同时 移动
![提示](https://static.bdocx.com/images/bang_tan.gif)