终于要跟C#说拜拜了,好辛苦的说!今天迎来C#的期末测试,很认真地码代码。李强是一个很负责任的老师,C#课就作业花时间。李强的C#课有个优点就是只上机,不笔试,期末测试3个小时也就400行代码,而且还都是系统自己填充的。

一、考试要求:
1、独立完成,可查阅资料,但不可复制代码。
2、完成时间:今晚8:30之前提交邮件。
3、邮件名称:学号+姓名+期末测试
二、测试题目:
问题描述:将马随机放在NXN棋盘的某个方格中,马按走棋规则进行移动,由玩家鼠标点击马可移动的方格表示下一步移动的格子。要求
每个方格上只进入一次,走遍棋盘上全部N^2个方格,游戏结束。
要求:
1、用WinForm编程,图形化界面显示游戏过程。
2、游戏分初级、中级、高级,棋盘分别为6*6、8*8和10*10方格。
3、窗体界面:
  (1)界面布局
   主菜单:
    游戏        操作       查看         英雄榜        帮助
    开局        撤销                    显示          关于本游戏
    ----        恢复       状态栏        复位
    初级
    中级
    高级
    ----
    退出
  状态栏: 开局时间(秒数)
  (2)窗口大小
     因随等级变化自动变化大小。可最小化、关闭,不可最大化,或鼠标拉动改变窗体大小。

4、功能要求:
   (1)开局:
   棋盘所有方格内容为空,随机定一方格为马起始位置,方格内显示数字1,加底色区别其他空方格,开始计时。
   若游戏已开局,则确定是否要重新开局,若是,则按开局操作,若否,则返回游戏。
   (2)初级、中级、高级
    按等级重新生成游戏方格,初始化界面和计时。
   (3)退出
    退出游戏
   (4)撤销
    撤销已走的当前步,可一直撤销到起始步。
   (5)恢复
     可恢复后一步,可一直恢复到当前步。
   (6)状态栏
     可显示或关闭状态栏
   (7)英雄榜显示
      只显示三个等级的最好成绩记录,包括等级、姓名和计时成绩。初始值为:匿名、999秒
   (8)复位
      将英雄榜复位为初始值。
   (9)关于本游戏
      说明游戏的规则和玩法
5、游戏玩法:
  (1)马按日子格走,不出棋盘边界,不走已走过的格子。
  (2)鼠标点击可走的格子表示下一步,格子加底色区分空格子,并给出编号为当前步格子编号加1。鼠标点击不可走格子时,系统给
出提示信息。
  (3)当走完全部格子,若用时比英雄榜记录同等级的成绩好,提示输入玩家名称,保存到英雄榜,并显示英雄榜。否则,只提示游戏
完成。
6、高级功能:
  (1)当鼠标左键点击当前格并持续按住时,对格子加底色显示下一步可走的方格(不包括已走的方格),鼠标松开后提示消失。
  (2)菜单功能中的(4)、(5)、(7)、(8)。
7、附加功能:
  每走一步后,启动一线程计算下一步的最佳走法,当鼠标右键单击当前步时,若线程已完成计算,则提示下一步的走法,否则提示还
在计算中。
8、评分标准:
(1)完成基本功能:85分
(2)完成高级功能:100分
(3)完成附加功能:20附加分

跟期中测试一样,要求好多,不过这样我也省得写要求。这次测试花了三个小时完成,因为时间有限,没太多精力写附加功能了。

右键下面下载链接选择链接另存为下载试玩:

HorseRidingBoard.zip(修复了一些BUG,但是下面代码没有更新)

主要代码:

Form1.cs

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;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace HorseRidingBoard
{
    public partial class Form1 : Form
    {
        int N;
        int X, Y;
        int L;
        public int level;
        public int top, maxtop, time;
        int[,] dir = {{-1, -2}, {-1, 2}, {1, -2}, {1, 2}, {-2, -1}, {-2, 1}, {2, -1}, {2, 1}};
        public struct node
        {
            public int x, y;
        }
        node[] step = new node[144];
        bool[,] vis = new bool[12, 12];
        public System.Windows.Forms.Button[,] Btn = new Button[12, 12];
        public ClassHero hero;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            level = 1;
            N = 6;
            L = 50;
            time = 0;
            top = 0;
            timer1.Stop();
            JudgeCheck();
            toolStripStatusLabel1.Text = "耗时 0 秒";
            toolStripStatusLabel2.Text = "已走 0 步";
            hero = new ClassHero();
            复位ToolStripMenuItem_Click(sender, e);
            GreatButton();
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].Enabled = false;
            RefreshMenu();
        }

        void JudgeCheck()
        {
            初级ToolStripMenuItem.Checked = false;
            中级ToolStripMenuItem.Checked = false;
            高级ToolStripMenuItem.Checked = false;
            switch (level) {
                case 1:
                    初级ToolStripMenuItem.Checked = true;
                    N = 6;
                    break;
                case 2:
                    中级ToolStripMenuItem.Checked = true;
                    N = 8;
                    break;
                case 3:
                    高级ToolStripMenuItem.Checked = true;
                    N = 10;
                    break;
            }
        }

        private void 开局ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewGame();
            GreatButton();
            RandomStart();
            PutButton();
        }

        void NewGame()
        {
            panel1.Controls.Clear();
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j) vis[i, j] = false;
            top = 0;
            maxtop = 0;
            time = 0;
            timer1.Start();
            RefreshMenu();
        }

        void GreatButton()
        {
            panel1.Size = new System.Drawing.Size(L * N, L * N);
            panel1.Padding = new Padding(0);
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                {
                    Btn[i, j] = new Button();
                    Btn[i, j].Location = new System.Drawing.Point(i * L, j * L);
                    Btn[i, j].Size = new System.Drawing.Size(L, L);
                    Btn[i, j].Margin = new System.Windows.Forms.Padding(0, 0, 0, 0);
                    Btn[i, j].Name = Convert.ToString(i) + Convert.ToString(j);
                    Btn[i, j].Click += new EventHandler(ButtonClick);
                    Btn[i, j].FlatStyle = FlatStyle.Flat;
                    Btn[i, j].FlatAppearance.BorderColor = Color.LightGray;
                    panel1.Controls.Add(Btn[i, j]);
                }
        }

        void RandomStart()
        {
            Random rd = new Random();
            X = rd.Next() % N;
            Y = rd.Next() % N;
            step[top].x = X;
            step[top].y = Y;
            ++top;
            maxtop = top;
        }

        void PutButton()
        {
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].Font = new System.Drawing.Font("微软雅黑", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[j, i].Text = "";
            Btn[X, Y].Text = "1";
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].Enabled = false;
            vis[X, Y] = true;
            RefreshButton();
        }

        void RefreshButton()
        {
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].Enabled = false;
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].Cursor = DefaultCursor;
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    Btn[i, j].BackColor = DefaultBackColor;
            Btn[X, Y].BackColor = Color.YellowGreen;
            for (int i = 0; i < 8; ++i)
            {
                int x = X + dir[i, 0], y = Y + dir[i, 1];
                if (x < 0 || x >= N || y < 0 || y >= N) continue;
                if (vis[x, y]) continue;
                Btn[x, y].Enabled = true;
                Btn[x, y].BackColor = Color.Yellow;
                Btn[x, y].Cursor = Cursors.Hand;
            }
            RefreshStatus();
            RefreshMenu();
        }

        private void ButtonClick(object sender, EventArgs e)
        {
            Button t = (Button)sender;
            int x = t.Name[0] - '0';
            int y = t.Name[1] - '0';
            step[top].x = x;
            step[top].y = y;
            ++top;
            maxtop = top;
            vis[x, y] = true;
            Btn[x, y].Enabled = false;
            Btn[x, y].Text = top.ToString();
            X = x;
            Y = y;
            RefreshButton();
        }

        private void 初级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            level = 1;
            JudgeCheck();
            开局ToolStripMenuItem_Click(sender, e);
        }

        private void 中级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            level = 2;
            JudgeCheck();
            开局ToolStripMenuItem_Click(sender, e);
        }

        private void 高级ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            level = 3;
            JudgeCheck();
            开局ToolStripMenuItem_Click(sender, e);
        }

        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void 撤销ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Btn[X, Y].Text = "";
            vis[X, Y] = false;
            --top;
            X = step[top - 1].x;
            Y = step[top - 1].y;
            RefreshButton();
        }

        private void 恢复ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            X = step[top].x;
            Y = step[top].y;
            vis[X, Y] = true;
            ++top;
            Btn[X, Y].Text = top.ToString();
            RefreshButton();
        }

        void RefreshStatus()
        {
            toolStripStatusLabel1.Text = "耗时 " + time.ToString() + " 秒";
            toolStripStatusLabel2.Text = "已走 " + top.ToString() + " 步";
            if (top == N * N)
            {
                timer1.Stop();
                if (time <= hero.d[level].Time)
                {
                    MessageBox.Show("很遗憾您没有打破记录\n点击确定重新开始游戏", "游戏结束", MessageBoxButtons.OK);
                }
                else
                {
                    Form f2 = new Form2(this);
                    f2.ShowDialog();
                    MessageBox.Show("点击确定开始新游戏", "提示", MessageBoxButtons.OK);
                }
                NewGame();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            ++time;
            RefreshStatus();
        }

        private void 状态栏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (状态栏ToolStripMenuItem.Checked == true)
            {
                状态栏ToolStripMenuItem.Checked = false;
            }
            else
            {
                状态栏ToolStripMenuItem.Checked = true;
            }
            if (状态栏ToolStripMenuItem.Checked == true)
            {
                statusStrip1.Show();
            }
            else
            {
                statusStrip1.Hide();
            }
        }

        public void Read()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream fileStream = new FileStream("D:\\.hero.dat", FileMode.Open);
            hero = (ClassHero)formatter.Deserialize(fileStream);
            fileStream.Flush();
            fileStream.Close();
            fileStream.Dispose();
        }
        
        void RefreshMenu()
        {
                        if (top <= 1)
            {
                撤销ToolStripMenuItem.Enabled = false;
            }
            else
            {
                撤销ToolStripMenuItem.Enabled = true;
            }
            if (top >= maxtop)
            {
                恢复ToolStripMenuItem.Enabled = false;
            }
            else
            {
                恢复ToolStripMenuItem.Enabled = true;
            }
        }

        public void Write()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            FileStream fileStream = new FileStream("D:\\.hero.dat", FileMode.Create);
            formatter.Serialize(fileStream, hero);
            fileStream.Flush();
            fileStream.Close();
            fileStream.Dispose();
        }

        private void 显示ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Read();
            string[] str = new string[3];
            str[0] = "初级:";
            str[1] = "中级:";
            str[2] = "高级:";
            for (int i = 0; i < 3; ++i)
            {
                str[i] = str[i] + hero.d[i].Name + " " + hero.d[i].Time.ToString() + " 秒";
            }
            MessageBox.Show(str[0] + "\n" + str[1] + "\n" + str[2], "英雄榜", MessageBoxButtons.OK, MessageBoxIcon.None);
        }

        private void 复位ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 3; ++i)
            {
                hero.d[i].Name = "匿名";
                hero.d[i].Time = 999;
            }
            Write();
        }

        private void 关于作者ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("作者:林海鸿\n学号:13055712\n网站:haipz.com\n", "作者", MessageBoxButtons.OK, MessageBoxIcon.None);
        }

        private void 关于游戏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("马踏棋盘\n走完所有方格游戏结束", "游戏", MessageBoxButtons.OK, MessageBoxIcon.None);
        }

        [Serializable]
        public class ClassHero
        {
            [Serializable]
            public struct Node
            {
                private string name;
                private int time;

                public string Name
                {
                    get
                    {
                        return name;
                    }
                    set
                    {
                        name = value;
                    }
                }

                public int Time
                {
                    get
                    {
                        return time;
                    }
                    set
                    {
                        time = value;
                    }
                }
            }
            public Node[] d = new Node[3];
        }

    }
}

Form2.cs

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 HorseRidingBoard
{
    public partial class Form2 : Form
    {
        Form1 f1 = new Form1();

        public Form2(Form1 firstForm)
        {
            InitializeComponent();
            f1 = firstForm;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f1.hero.d[f1.level].Name = textBox1.ToString();
            f1.hero.d[f1.level].Time = f1.time;
            f1.Write();
            Close();
        }
    }
}

转载保留版权:http://haipz.com/blog/i/3270 - 海胖博客