关闭

C#课程设计——“猜猜看”开发总结

396人阅读 评论(0) 收藏 举报
分类:

咳咳,结果我还是奇迹般的两天解决了战斗。其实不符合老师的要求,少了什么概率计算。。。什么Pangerank算法,表示在下才疏学浅,不懂这么高端的东西。(其实和来不及慢慢想也有关系,毕竟本人最近背负着3个课程设计而且要在一星期以内解决)好了,为了补偿我还是在原来的基础上加了点东西,虽然不够弥补这个算法,但是我觉得这是我经过思考做出来的东西,还是写一下吧。

首先先写下几条笔记:

1.将密码设置为“*”的格式,在passwordchar的属性里输入“*”就可以了。

2.设置文本框不允许拖动与最大化,只要在FormBotherStyle那里设置为Fixedsingle。

好了,那么接下来就来看一下界面效果吧:


这是登录界面,regist?是用于注册账号的,输入用户名密码就能进入主界面了。

我们先看下注册界面:


这里我们可以注册一个新的账号:比如用户名为:Since,密码为123456


这里注册成功了,那么,接下来我们用这个新的账号来登录吧

登录吧


这里就是登录进去的界面了,可以看到有三个按钮,我们按一下开始游戏进入主界面吧:


那么点击Start按钮



行,进入了游戏,我们可以看一下界面,有3次机会,也就是life,如果用完三次机会你的成绩就会被存入到数据库中并且游戏终止


我由于做这个东西,已经能看出很多人是谁了,所以。。。不小心玩了个41分(其实后面是故意点错的说),

这里点击确定就关闭了该游戏界面并且你的游戏记录将被写入到积分榜中,我们来看下积分榜吧:


好吧,我居然一不小心玩了第一,看来开发者总是能够有超人的发挥~~~

这就是我整个程序的功能了,虽然没有什么Pangerank算法,但是我觉得游戏就该这样子,如果用了什么算概率的那岂不是变成了一个认识工具(好吧,我只是在找借口)

接下来我们看下代码吧:

这里我们看一下登陆界面: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.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.BackColor = Color.Transparent;
            Username.BackColor = Color.Transparent;
            password.BackColor = Color.Transparent;
            linkLabel1.BackColor = Color.Transparent;
            this.MaximizeBox = false;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string user = toUser.Text.ToString();
            string pwd = toPass.Text.ToString();
            string sql1 = "";
            if (user == "")
            {
                MessageBox.Show("Please input user's name and password!");
            }
            else
            {
                MySqlConnection conn = new MySqlConnection("server=localhost;Persist Security Info=True;User id=root;database=test1;password=''");
                conn.Open();
                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                //查询数据库中是否有这样
                cmd.CommandText = " select * from alogin where Username='" + toUser.Text + "'and password = '" + toPass.Text + "'";
                cmd.Parameters.Add(new MySqlParameter("userID", toUser));
                cmd.Parameters.Add(new MySqlParameter("PassWord", toPass));
                
                MySqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    conn.Close();
                    conn.Open();
                    sql1 = "insert into Reg values('" +user+ "','');";//登录后插入到登录记录表
                    MySqlDataAdapter sda = new MySqlDataAdapter(sql1, conn);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    this.Hide();
                    nicewindow nw= new nicewindow();
                    nw.ShowDialog();
                    this.Close();
                    //MessageBox.Show(sql1);
                    conn.Close();
                }
                else
                {
                    MessageBox.Show("User's name or password is wrong,please try again!");
                }
                dr.Close();
                
            }
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Regist R = new Regist();
            R.ShowDialog();
        }
    }
}
主要就是我还有一张隐藏的第三张表,用来记录每一个登录的用户的,主要是为了实现存储分数进入积分榜。
接下来是游戏主界面Maingame.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using MySql.Data.MySqlClient;

namespace WindowsFormsApplication1
{
    public partial class Maingame : Form
    {
        string[] path = Directory.GetFiles(@"student_photo");
        string sq = "";
        //static public int n;
        Random r = new Random();
        Random rx = new Random();
        int x, y, z, score,rd,n;
        int life = 3;
        string[] name={"a","a","a"};
       

        public Maingame()
        {
            InitializeComponent();
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
            
        }

        private void Start_Click(object sender, EventArgs e)
        {
            
            getThreeNum();
            if (x == y || x == z || y == z)
            {
                getThreeNum();
            }
            pictureBox1.Image = Image.FromFile(path[x]);
            pictureBox2.Image = Image.FromFile(path[y]);
            pictureBox3.Image = Image.FromFile(path[z]);
            scores.Text = score.ToString();
            lifes.Text = life.ToString();
           
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            n = 0;
            Judge();
            getThreeNum();
            if (x == y || x == z || y == z)
            {
                getThreeNum();
            }
            pictureBox1.Image = Image.FromFile(path[x]);
            pictureBox2.Image = Image.FromFile(path[y]);
            pictureBox3.Image = Image.FromFile(path[z]);
            scores.Text = score.ToString();
            mlifie();

        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {      
            n = 1;
            Judge();
            getThreeNum();

            if (x == y || x == z || y == z)
            {
                getThreeNum();
            }
                pictureBox1.Image = Image.FromFile(path[x]);
                pictureBox2.Image = Image.FromFile(path[y]);
                pictureBox3.Image = Image.FromFile(path[z]);
                scores.Text = score.ToString();
                mlifie();
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {
            n = 2;
            Judge();
            if (x == y || x == z || y == z)
            {
                getThreeNum();
            }
            getThreeNum();
            pictureBox1.Image = Image.FromFile(path[x]);
            pictureBox2.Image = Image.FromFile(path[y]);
            pictureBox3.Image = Image.FromFile(path[z]);
            mlifie();

        }
        public void getThreeNum() {
            
            x = (int)r.Next(0, path.Length);
            y = (int)r.Next(0, path.Length);
            z = (int)r.Next(0, path.Length);
            
           string[] str = {path[x],path[y],path[z]};
           Match macth = Regex.Match(str[0],@"([\w]{2,})\.jpg");
           string str1= macth.Groups[1].Value;
           Match macth1 = Regex.Match(str[1], @"([\w]{2,})\.jpg");
           string str2 = macth1.Groups[1].Value;
           Match macth2 = Regex.Match(str[2], @"([\w]{2,})\.jpg");
           string str3 = macth2.Groups[1].Value;
       //     name = { str1, str2, str3 };
           name[0] = str1;
           name[1] = str2;
           name[2] = str3;      
           rd = (int)rx.Next(0,2);
           label1.Text = name[rd];
 
        }      
        public  void Judge(){
            if (name[n] == name[rd])
            {
                score++;
            }
            else{
                MessageBox.Show("答错了,加油加油!");
                life--;
            }
        
        }
        public void mlifie() {
            if (life <= 0)
            {
                string name = "";
                this.Close();
                MessageBox.Show("You lose!" + Environment.NewLine + "Yourscore is :" + score);
                //sq = "insert into admin values(" ",'" + UName + "','" + Password + "')";
                string constr = "server=localhost;database=test1;User id=root;";
                MySqlConnection conn = new MySqlConnection(constr);               
                conn.Open();
                string sql1 = "select Users from reg where No = (select MAX(`No`) from reg);";
                DataTable dt = new DataTable();
                MySqlDataAdapter adapter = new MySqlDataAdapter(sql1, conn);
                    adapter.Fill(dt);
                  foreach(DataRow dr in dt.Rows){
                         name =  dr[0].ToString();//或者dr["列名"].ToString();
                  }
                conn.Close();
                conn.Open();
                string sql2  = "insert into Score values('"+name+"','"+score+"');";
                MySqlDataAdapter sda = new MySqlDataAdapter(sql2, conn);
                DataTable dt2 = new DataTable();
                sda.Fill(dt2);
                conn.Close();         

            }
            lifes.Text = life.ToString();
        }

    }
}

这里就显示三张图片的地方了,主要介绍是:

将文件夹中的文件存储路径存放到一个数组中(也就是path[]数组),在path[]数组中,我们随机在0与这个数组的长度最大值之间随机取三个数字,由于这三个数字会出现两个数字相等的情况,这时候需要一个判别,判别是出现两个相等的时候我们就进行重新生成,这里其实存在一个递归的算法,但是递归算法缺点在于有可能出现死循环或者出现内存空间的浪费,但在这里我没想到什么其他的好办法所以只能这样做了。这里取出来的三个数对应的就是三张图片,再使用image.Fromfile方法显示这三张图片。当你点击三张图片的任意一张,对应的会置一个标志位,而同时取出三张图片的文件名并放在一个数组中,这是,数组的长度就为3,而标志位只会在0,1,2三个数之间产生,这时就可以再这三个数之间在随机产生一个数字,这个数字就是我们所猜的正确的图片对应的数字,这里我们三张图片名字存储的数组里,同时取了这三张图片其中一张的名字,这个名字就是标签上显示的名字,而随机选取的这张图片,使用的就是在01,2这三个数中取出来的其中一个随机数所对应的图片,这里只要判别用户选择的图片与对应的随机数是否相等就可以知道这个用户选择的结果对不对。在这个程序中我还设定了一个分数的统计值,这个score值就是用于显示用户的得分,用户选对得1分,选错不得分,而另外life表示用户剩下多少次机会,原始会基于3次机会,当你三次机会用完时,程序将会停止运行,你的成绩将被写入到积分榜的表格中,这样就实现了一个存储积分的功能,用户可以查看自己的积分情况。

其它的表非常简单,就是存储数据而已,这里我们就不写出来了。

接下来我们介绍下数据库的设计:

数据库采用mysql数据库,这里设计的数据库名字为test1,包括以下三个表:


这三个表分别为:用户账户密码登记表,登录记录表,积分榜表

其中用账户密码登记表为:


登录记录表为:


这个表只是截了一小部分,登录了很多次所以有很多条记录。

积分榜表


这就是数据库的设计了。

接下来说一下我的开发过程:

本次开发大约为为11个小时,属于效率比较低的一个开发。

 由于本人对于c#程序语言的不熟悉,很多时候转换类型上要各种查找资料,非常浪费时间,在克服了各种困难之后最终还是成功的开发出来了。这个程序其实很简单,但是因为语言的问题有时候确实是很头疼。

 本人在设计程序的过程中使用了Mysql数据库,这个数据库精简方便,再结合Navicate可视化界面然表格的构建更加方便,这里设计的三张表,是经过对程序需求的设计而做出来的表格,这里三张表我首先考虑到了需要设定一个积分榜,而积分榜中如何知道登录的用户是哪一个呢?这里就考虑到一个登录记录表reg了,这个表格记录了每次登录的用户,而再根据登录的最新信息,设置一个自增变量No来确定最新插入的记录即最近登录的用户,再把这个用户的名字以及分数通过sql语句存储到积分榜表中,这里就实现了一个积分表的出现。

  在开发过程中,我使用了之前作业中做到的连接以及操作数据库的方法,再使用了之前作业中随机生成图片并显示的方法,结合了这些方法加上网上查找的资料最终我成功的开发了这个软件。

这是我的个人体会:

本次开发时间并不是很长,比起之前些的移植到linux上的qt界面来说时间算是少之又少,其实坦白来说,这个程序在使用过程中绝对会暴露出无数的bug,只是现在我还没发现而已,需要经过白盒测试等测试方法才能较好的减少bug的发生。本次开发我体验了c#开发过程中方便以及不方便的地方,c#是一门简便的语言,它操作较为简单,在winform开发过程中许多控件的使用还是比较方便的,但是我认为,也存在非常多的问题,比如你点多了一下会出现一些不该出现的代码,代码的冗余度这个问题应该好好的考量一下。在开发过程中我发现了它并没有qt界面上带来丰富的槽函数和信号函数,而只是相对简单的一些button按钮,但是这些却也非常实用。不得不承认,c#在开发过程中比较方便,但是也存在这许多的问题,所以我觉得,winform程序只适合开发小型程序,在大型程序的开发过程中选择winform并不是一个明智之举,但这只是个人观点,具体情况并不清楚。

这里只是个人观点,所以各路大神求不喷,谢谢!

最后附上网盘链接:http://pan.baidu.com/s/1ntIJFNr

这就是本次课程设计的完成了,阿里嘎多!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8691次
    • 积分:317
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:0篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论