停车场贪吃蛇游戏实训报告

更新时间:2024-01-03 07:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

郑州轻工业学院 网络编程基础 实训报告

实训名称: 指导教师:

姓名: 学号: 班级: 提交日期:

停车场游戏、贪吃蛇游戏

实训一

1. 实训目的

通过开发一款停车场游戏程序,熟练掌握C#编程语言、面向对象程序设计方法和可视化技术。

2. 实训题目

使用C#编程语言,开发一款停车场游戏程序。

3. 功能描述

1) 停车场有5 种颜色的汽车和6 个车位。 2) 每一辆汽车对应颜色的车位。 3) 车位之间有的有通道,有的没有。

4) 最初5 种颜色的汽车未停在对应颜色的车位。

5) 玩家点击汽车,实现将该汽车沿通道移动到空闲的车位上; 当该汽车与空间的车位之间没有通道时,则不移动汽车。 6) 玩家可以点击按钮“自来一次”,重新开始游戏。 7) 当所有的汽车都听到对应颜色的车位上时,游戏成功。

4. 需求分析

根据功能描述可知,停车场游戏的定义数据字典如下: 1) 车(Car):在停车场游戏中,车是玩家操纵的对象。车具 有位置和颜色等属性。在游戏中,玩家可以将汽车沿通道 移动到空闲的车位上。

2) 车位(Space):在停车场游戏中,车位是汽车停留的空间。 车位具有位置、大小和颜色等属性。

3) 通道(Road):在停车场游戏中,通道是汽车移动的路径。 通道具有起始点等属性。当某两个车位间有通道时,汽车 可以直接再这两个车位间移动。当某两个车位间没有通道 时,汽车不可以直接在这两个车位间移动。

5. 设计说明

根据需求分析可知,车位具有位置、大小和颜色等属性,定义 1)Space类用于描述车位的信息。通道具有起点和终点两个属性,定义

2)Road类用于描述通道的信息以及通道与车位之间的关系。车具有位置和颜色等属性,定义Car类用于描述车的信息以及车停留在哪个车位,并实现车的移动功能。

3)为了使游戏的运行更易于控制,定义Game类用于启动游戏、控制游戏和结束游戏。

4)综上所述,在停车场游戏中,有Space(车位)、Road(通道)、Car(车)、Game(游戏)和MainForm(用户接口)六个类。

6. 源代码

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; namespace ParkingLot {

publicpartialclassForm1 : Form {

public Form1() {

InitializeComponent(); game = newGame(); for (int i = 0; i < 5; i++) {

string name = \ + i.ToString();

PictureBox pBox = (PictureBox)this.Controls.Find(name, false)[0];

pBox.Location = newPoint(game.cars[i].center.X - pictureBox0.Width / 2, game.cars[i].center.Y -pictureBox0.Height / 2);

pBox.Visible = true; } }

privateGame game;

privatevoid pictureBox0_Click(object sender, EventArgs e) {

PictureBox pBox = (PictureBox)sender;

if (game.MoveCar(0, game.cars[0].spaceNum,game.freeSpaceNum)) {

pBox.Location = newPoint(game.cars[0].center.X - pBox.Width / 2, game.cars[0].center.Y - pBox.Height / 2); if (game.Success()) {

MessageBox.Show(\恭喜!成功了\); } } else

{

MessageBox.Show(\不能移动\); }

}

privatevoid pictureBox1_Click(object sender, EventArgs e) {

PictureBox pBox = (PictureBox)sender;

if (game.MoveCar(1, game.cars[1].spaceNum, game.freeSpaceNum))

{

pBox.Location = newPoint(game.cars[1].center.X - pBox.Width / 2,

game.cars[1].center.Y - pBox.Height / 2); if (game.Success()) {

MessageBox.Show(\恭喜!成功了\); }

} else

{

MessageBox.Show(\不能移动\); } }

privatevoid pictureBox2_Click(object sender, EventArgs e) {

PictureBox pBox = (PictureBox)sender;

if (game.MoveCar(2, game.cars[2].spaceNum, game.freeSpaceNum)) {

pBox.Location = newPoint(game.cars[2].center.X - pBox.Width / 2,

game.cars[2].center.Y - pBox.Height / 2); if (game.Success())

{

MessageBox.Show(\恭喜!成功了\); } }

else

{

MessageBox.Show(\不能移动\);

} }

privatevoid pictureBox3_Click(object sender, EventArgs e) {

PictureBox pBox = (PictureBox)sender;

if (game.MoveCar(3, game.cars[3].spaceNum, game.freeSpaceNum)) {

pBox.Location = newPoint(game.cars[3].center.X - pBox.Width / 2,

game.cars[3].center.Y - pBox.Height / 2); if (game.Success()) {

InitializeComponent();

game = newGame(lawn.Width, lawn.Height); }

privatevoid Form1_Load(object sender, EventArgs e) {

}

privatevoid timer1_Tick(object sender, EventArgs e) {

if (game.isSnakeAlive) { Graphics g;

g = lawn.CreateGraphics();

game.OnTime(g, lawn.BackColor, lawn.Width, lawn.Height); if (!game.isSnakeAlive) {

MessageBox.Show(\); } } }

privatevoid ToolStripMenuItemStart_Click(object sender, EventArgs e) { Graphics g;

g = lawn.CreateGraphics();

game.Begin(g, lawn.BackColor, lawn.Width, lawn.Height); timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true; ToolStripMenuItemContinue.Enabled = false; }

privatevoid ToolStripMenuItemPause_Click(object sender, EventArgs e) {

timer1.Enabled = false;

ToolStripMenuItemPause.Enabled = false; ToolStripMenuItemContinue.Enabled = true; }

privatevoid ToolStripMenuItemContinue_Click(object sender, EventArgs e) {

timer1.Enabled = true;

ToolStripMenuItemPause.Enabled = true;

ToolStripMenuItemContinue.Enabled = false; }

privatevoid Form1_KeyDown(object sender, KeyEventArgs e) {

if (game.snake.direction == Direction.Down || game.snake.direction == Direction.Up) {

switch (e.KeyCode) { caseKeys.Left:

game.snake.direction = Direction.Left; break;

caseKeys.Right:

game.snake.direction = Direction.Right; break;

} } else

{

switch (e.KeyCode) { caseKeys.Up:

game.snake.direction = Direction.Up; break;

caseKeys.Down:

game.snake.direction = Direction.Down; break;

} } } } }

7.测试报告

测试用例

1 Bean 的生成与显示

1) 测试程序是否能在游戏开始时,生成一颗豆。 2) 测试程序是否能在游戏运行中,正常显示一颗豆。

3) 测试程序是否能在豆被蛇吃掉时,消除原先的豆,并重新 生成一颗豆。

2 Snake 的生成、显示、移动与生长

1) 测试程序是否能在游戏开始时,生成一条蛇。

2) 测试程序是否能在游戏运行中,正常显示一条蛇的运动。 3) 测试程序是否能在游戏运行中,根据用户的按键情况,改 变蛇的移动方向。

4) 测试程序是否能在蛇吃掉豆时,生长一节。 5) 测试程序是否能在蛇头碰到蛇身时,咬断蛇身。

6) 测试程序是否能在蛇头碰到场地边界时死亡,并结束游戏。 测试结果

8.心得体会

通过这三周的实训,我发现自己对所学知识还不太熟练,特别是自己动手做的时候,甚至有些知识点还不太懂,还有,自己太过于马虎,总是在不该出错的地方出错。最让我受益匪浅的是,这次实训让我学会了不要眼高手低,要勤于练习,勇于实践,只有通过练习和实践才能真正的记住自己所学的知识。

本文来源:https://www.bwwdw.com/article/8kox.html

Top