基于C#使用winform技术的游戏平台的实现【C#课程设计】

news2024/11/18 15:52:19

基于C#使用winform技术的游戏平台的实现【C#课程设计】

  • 说明
    • 项目结构
    • 项目运行截图及实现的功能
  • 部分代码一些说明(个人觉得一些难点的说明)
    • 一、ListView ,ImageList 的综合使用
    • 二、图片上传以及picturebox 图片的动态替换
    • 三、图表插件的使用
    • 四、SQL工具类封装
    • 五、高德地图天气API的使用
  • 数据库设计部分
  • 完整代码资源

说明

今天,也是刚刚答完辩,终于可以将自己写的代码放到CSDN上啦,这个是开学之前就做好的一个项目,然后就是简单的使用winform做了一个CS结构的课设,实现了基础的crud以及扩展的导入导出Excel和图表控件及高德地图天气API接口的使用。使用了一些基本的控件和特殊一点的控件就是ImageList 和 listView (因为我们课上没有学过,所以觉得比较特殊)

项目结构

然后下面的话,是整体项目的一个结构(简单分了一下包,DataAccess就是数据接入层dao,Entity就是对应的一些实体类,Resources是项目的一些静态资源,Utils下的话是我自己做的一些工具类,Views的是winform一些不同功能的窗体区分

在这里插入图片描述

项目运行截图及实现的功能

  1. 登录和注册
    在这里插入图片描述
    在这里插入图片描述
    账号的密码使用md5进行加密

  2. 登录首页
    在这里插入图片描述
    这里的话,实现了一个侧边栏的封装和自定义最小化和最大化按钮,然后中间主体是一个高德地图的天气API,具体使用我会在后面的文章列出,然后还有个底部的计时器实现时间刷新功能。

  3. 用户的个人信息修改,头像上传及重置功能
    在这里插入图片描述

  4. 游戏商城列表查看(用户端)
    在这里插入图片描述
    这里主要使用的两个控件就是listView和imageList,以及Panel布局组件(当我点选左侧的游戏时,右侧的游戏详情会进行显示,当然多条件查询也是可以的哈)

  5. 个人游戏仓库查看
    在这里插入图片描述
    这里的话和上面那个也差不多,就是自己买的游戏,用到的控件也是imageList和那个listView

  6. 管理员账号的登录(游戏管理)
    在这里插入图片描述
    管理员账号登录,右侧显示的侧边栏内容是不一样的,实现了数据的导入导出(可以将Excel中的内容导入到数据库中),然后就是一些crud操作。

  7. 用户信息管理
    在这里插入图片描述
    和上面的游戏管理功能基本差不多,就不一一赘述啦。

  8. 数据分析
    在这里插入图片描述
    这个的话,是使用了一些livecharts的图表控件来做的,算是一点点创新把。

部分代码一些说明(个人觉得一些难点的说明)

一、ListView ,ImageList 的综合使用

在C#中,ListView是一个常用的控件,用于在Windows窗体应用程序中显示数据。它可以以多种方式呈现数据,包括大图标、小图标、列表和详细信息。
在C#中,ImageList是一个用于存储图像集合的类。它提供了一种方便的方式来管理和使用一组图像,通常用于在用户界面控件中显示图像列表。

private void DrawLvGame(DataSet ds)
{
    // 先清空,防止计时器一直添加
    this.listViewGames.Items.Clear();
    this.imageList1.Images.Clear(); //清空图片数组
    // 渲染到listView中
    if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
    {
        listViewGames.View = View.LargeIcon; //设置listview为大图标模式
        listViewGames.LargeImageList = imageList1;// 设置listview的图片数组


        listViewGames.Visible = true;
        // 开始绘制控件,暂时挂起lv
        listViewGames.BeginUpdate();

        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            ListViewItem lv = new ListViewItem();
            lv.ImageIndex = i;
            lv.Text = ds.Tables[0].Rows[i][0].ToString();
            // 设置图标
            this.imageList1.Images.Add(Image.FromFile(baseImageUrl + ds.Tables[0].Rows[i][1].ToString()));
            listViewGames.Items.Add(lv);
        }
        // 结束绘制
        listViewGames.EndUpdate();
    }
}

说明:

  1. 通过 listview对象.view 的方式可以设置ListView的显示方式,其中View对象是一个枚举类,列举了可供listview选择的5种方式,我选择大图标模式(显示效果好看一点)

在这里插入图片描述

  1. 我这里的需求是,需要将数据库的游戏信息读取出来,然后动态的去显示对应的图片,所以需要通过listViewGames.LargeImageList = imageList1 去绑定一个图片数组(imageList1 为 ImageList控件,listViewGames 为ListView控件)

在这里插入图片描述

  1. BeginUpdate() 和 EndUpdate()两个方法,方法用于控制 ListView 的更新。它们的作用是在进行大量添加、删除或修改 ListView 中的项目时,提高性能和用户界面响应速度。
  2. ImageList 添加数据,通过ImageList对象.Images.Add(Image对象),这里有个需要注意的点,应为我们从数据库中读取的图片路径为一个字符串,所以我们需要通过这个字符串转换为Image对象,然后Image类中提供了一个方法 Image.FromFile(path),将文件路径对应的图片读取为Image对象。
  3. 综上所述,我只需要在获取到游戏列表数据时,去遍历,将图片路径添加到imageList控件的项目中,然后在ListView控件中添加ListViewItem即可。

二、图片上传以及picturebox 图片的动态替换

文件框选择 OpenFileDialog 完成文件上传到本地磁盘功能

private void btnChangeAvatr_Click(object sender, EventArgs e)
{
    OpenFileDialog fileDialog = new OpenFileDialog();
    fileDialog.Multiselect = true; fileDialog.Title = "请选择文件";
    fileDialog.Filter = "所有文件(*jpg*)|*.jpg*"; //设置要选择的文件的类型
    if (fileDialog.ShowDialog() == DialogResult.OK)
    {
        // 获取图片上传的路径
        string localFilePath = fileDialog.FileName;

        //格式化处理,提取文件名 数据库要存的url
        string savePath = localFilePath.Substring(localFilePath.LastIndexOf("\\") + 1);

        // 存储到本地目录中 如果本地不存在该图片,那么就上传
        if (!File.Exists(baseImageUrl + savePath))
        {
            File.Copy(localFilePath, baseImageUrl + savePath, false);
        }
        // 数据库更新操作 传递nickname和新的图片url即可
        int flag = UserDataAccess.GetInstance().UpdateUserAvatar(user.Nickname, savePath);
        if (flag > 0)
        {
            MessageBox.Show("更新成功!!\n本地存储图片路径为:" + baseImageUrl + savePath);
            RefreshWindow();
        }
        else
        {
            MessageBox.Show("修改失败!");
        }

    }

}

说明:

  1. c#中的资源图片通常存放于当前项目的Resources,若想在项目中使用图片,则必须将图片上传到Resources目录下。
  2. 通常上传文件获取文件的路径是一个完整路径,而我们只需要它的文件名,所以通过Substring(localFilePath.LastIndexOf(“\”) + 1) 来截取最后一级目录即文件名
  3. 文件上传一个简单的去重校验 File.Exists(path),返回 true | false,
  4. 文件上传 File.copy(源路径,目的路径,是否重写【true|false】)

文件动态替换功能

Bitmap bitmap = new Bitmap(baseImageUrl + user.Avatar);
this.picAvatar.BackgroundImage = bitmap;

说白了就两行代码,PictureBox.BackgroundImage 的值可以是一个 Bitmap对象(Bitmap对象继承自Image对象),而 Bitmap对象可以通过类似File类的方式(通过路径产生)。

在这里插入图片描述

在这里插入图片描述

三、图表插件的使用

因为之前写过一篇类似的博客 ,我就直接贴博客链接了winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?

因为我这个项目创建的时候,没注意,然后创建的项目是 .net6版本的,所以下面就介绍 ScottPlot 这个图表插件的使用(看文档就基本ok了),scottPlot 官网链接:。

  1. 进入官网,选择QuickStart快速开始,然后选择winform的就行,看看快速入门的例子
    在这里插入图片描述

  2. 看完之后,就根据自己的需求去选择不同的图表进行配置 https://scottplot.net/cookbook/4.1/,查看它的cookbook就好啦
    一个柱状图的demo https://scottplot.net/cookbook/4.1/,感觉着配置都基本不用说,反正按照配置项去获取对应的数据就可以生成一个动态的图表了。

在这里插入图片描述

下面贴一张我的SQL图表例子:

在这里插入图片描述

四、SQL工具类封装

SQL工具类,我使用的是一个单例模式
提供一个静态类对象,一个私有构造器,以及一个获取类对象的静态方法。这样就可以避免每次操作数据库去new一个对象了,至始至终都是一个对象在操作。

using GamePlantForm.Dao;
using GamePlantForm.Entity;
using GamePlantForm.Utils;
using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GamePlantForm.DataAccess
{
    public class GameDataAccess
    {
        // 使用单例模式
        private static GameDataAccess instance;

        private GameDataAccess() { }

        public static GameDataAccess GetInstance()
        {
            return instance ?? (instance = new GameDataAccess());
        }

        SqlConnection conn;
        SqlCommand comm;
        SqlDataAdapter adapter;

        /// <summary>
        /// 数据库资源释放
        /// </summary>
        private void Dispose()
        {
            if (adapter != null)
            {
                adapter.Dispose();
                adapter = null;
            }
            if (comm != null)
            {
                comm.Dispose();
                comm = null;
            }
            if (conn != null)
            {
                conn.Close();
                conn.Dispose();
                conn = null;
            }
        }

        /// <summary>
        /// 数据库链接
        /// </summary>
        private bool DBConnection()
        {
            // 
            string connStr = "Data Source=.\\SQLEXPRESS;database=game_plantform;uid=sa;pwd=123456";
            if (conn == null)
            {
                conn = new SqlConnection(connStr);
            }
            try
            {
                conn.Open();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
}

五、高德地图天气API的使用

这个的话,重点在于自己找到对应的API接口文档,然后发送请求,用几个实体类对接一些想要的数据即可。我这里只放一下自己写的发送请求的代码。

tips:注意,一定使用自己申请的密钥哇

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using GamePlantForm.Entity;

namespace GamePlantForm.Utils
{
    // 自定义天气接口工具类
    internal class WeatherRobin
    {
        private readonly HttpClient _httpClient;

        public WeatherRobin()
        {
            _httpClient = new HttpClient();
        }

       
        // 150200
        public async void GetWeatherAsync(string cityName,Label labprovince,Label labcity, Label labadcode, Label labweather,
           Label labtemperature, Label labwinddirection, Label labwindpower, Label labhumidity, Label labreporttime)
        {
            var response = await _httpClient.GetAsync("https://restapi.amap.com/v3/weather/weatherInfo?city="+cityName+"&key=自己的天气密钥");
            var content = await response.Content.ReadAsStringAsync();

            // 1. 将获取到的json转换为数组
            RootObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject> (content);

            // 2. 将获取到的数据,填充到传递过来的实体类对象中
            labprovince.Text += ":"+ obj.lives[0].province;
            labcity.Text += ":" + obj.lives[0].city;
            labadcode.Text += ":" + obj.lives[0].adcode;
            labweather.Text += ":" + obj.lives[0].weather;
            labtemperature.Text += ":" + obj.lives[0].temperature+"℃";
            labwinddirection.Text += ":" + obj.lives[0].winddirection;
            labwindpower.Text += ":" + obj.lives[0].windpower+"级";
            labhumidity.Text += ":" + obj.lives[0].humidity;
            labreporttime.Text += ":" + obj.lives[0].reporttime;
        }

    }
}

数据库设计部分

在这里插入图片描述
ER图之间的关系,有点偷懒了,不想画啦QAQ,这个SQL资源需要的可以找我拿

完整代码资源

完整代码,可以私信找我发,也可以通过这篇文章的绑定资源去下载。

tips:本人只是个又菜又爱分享的小白,如果这篇文章可以帮助到你,帮我点个👍,哈哈哈!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新哔哩哔哩邮箱绑定接口签名JS逆向分析

本章教程主要逆向分析 哔哩哔哩邮箱绑定接口biliCSRF 和mid 参数。 教程仅供学习参考,请勿滥用,由此带来的法律责任需由自己承担。 目录 一、接口参数分析 二、签名加密代码 三、滑块验证码 一

LabVIEW应用开发——控件的使用(四)

接上文&#xff0c;这篇介绍时间控件。 LabVIEW应用开发——控件的使用&#xff08;三&#xff09; 1、时间控件Time Stamp control 在日常软件开发场景中&#xff0c;时间也是一种常用的控件&#xff0c;用于表达当前时间的显示、对下设置时间、时间同步等等场景。LabVIEW专门…

Redis主从模式(一)----搭建主从结构并演示

目录 一, 主从模式 1.1 单个Redis服务器可能存在的问题 1.2 单点问题 1.3 什么是主从模式 概念 图示 二, 演示Redis的主从复制 2.1 Redis-server进程 2.2 建立复制 1. 首先将redis.conf配置文件复制一份并修改daemonize 为 yes 2.修改配置文件中的端口号 3. 分别在…

力扣每日一题63:不同路径||

题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物…

RK3568平台开发系列讲解(应用篇)串口应用编程之串口介绍

🚀返回专栏总目录 文章目录 一、串口介绍1.1、数据传输方式1.2、数据格式1.3、波特率1.4、硬件流控制和软件流控制1.5、错误检测1.6、串口编程二、串口设备节点介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 串口设备是嵌入式开发中最常用的外设之一,通过串口…

2023年信息科学与工程学院学生科协第一次前端培训

目录 一、前端是什么&#xff1f;前端能做什么&#xff1f;前端需要做什么&#xff1f;现阶段如何理解前端 二、前端学习路线html是什么&#xff1f;css是什么&#xff1f;什么是jshtml、css以及js关系掌握三种语言之后的学习路线 三、HTML基础语法标题段落文本换行文本标签图像…

协程和 C++ Boost库的Coroutine2

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 协程和 C Boost库的Coroutine2 摘要为什么不是boost.coroutine&#xff1f; 线程与协程为什么不介绍C20标准的协程C协程与golang的goroutine 二、使用步骤1.引入库2.核心类单…

作为程序员,很多时候容易急眼,如何缓解?

程序员在工作中面临着高压和快节奏的环境&#xff0c;容易因为紧张的工作节奏、复杂的技术问题或与团队的沟通问题而感到焦虑和急躁。下面提供一些策略来帮助缓解这种情况&#xff1a; 1. 定时休息 遵循“番茄工作法”或其他时间管理技术&#xff0c;每工作25分钟后休息5分钟&…

“第四十九天” 机组

各个硬件的工作原理&#xff1a; 主存储器包括&#xff1a;存储体、MAR、MDR&#xff1b; MAR&#xff1a;存储地址寄存器 &#xff0c;MAR的位数反映存储单元的个数&#xff1b; MDR &#xff1a; 存储数据存储器&#xff0c;MDR位数等于存储字长&#xff1b; 数据在存储体…

【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决

编译时出现的错误&#xff1a; mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 Makefile:161: recipe for target ‘all’ failed mingw32-make: *** [all] Error 2解决方法&#xff1a; 根据贴吧老哥的解答&#xff0c;发现是mingw版本有问题导…

合并有序链表C++递归

题目描述 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 解题思路 我们这里使用递归的思路来解题&#xff1a; 首先我们要分析题目的子问题在哪&#xff0c;对于这个问题我们先思考如何将两个只有一个节点的有序单链表合并&#xff1a; ①我们可以先判断哪一个…

DCU上如何运行大模型以及用到的docker命令

第一步&#xff1a;需要连接到官方(https://developer.hpccube.com/)提供的vpn 第二步&#xff1a;通过termius进入到项目 第三步&#xff1a;遇到问题 1.docker空间太小了&#xff0c;得换地方&#xff1a;参考这个centos设置docker 目录_mob64ca12f73101的技术博客_51CTO博…

寻找特殊年号

系列文章目录 进阶的卡莎C_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(C…

正点原子嵌入式linux驱动开发——Linux INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了input框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、坐标等…

python二次开发Solidworks:读取样条曲线数据

目录 1、草图段对象 2、VBA代码分析 3、python代码实现 样条曲线&#xff08;spline curve&#xff09;是数学术语&#xff0c;是一种特殊的参数曲线&#xff0c;由一组控制点通过曲线拟合的方式生成。样条一词源于船舶建造中的一种临时性辅助支架&#xff0c;后来被引入计算…

基于卷的磁盘扫描算法设计

1、设计目的 常规情况下&#xff0c;当我们扫描计算机的硬盘时&#xff0c; 通常会使用诸如FindFirstFile/FindNextFile(Windows)&#xff0c;或者opendir/readdir(Linux)遍历扫描的目录。 一般情形下&#xff0c;由于文件数量相对较少&#xff0c;文件夹层次低&#xff0c;扫…

Hafnium简介和构建

安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…

MSVCR100.dll丢失修复方法,MSVCR100.dll丢失的解决方法

今天我要和大家分享的是&#xff1a;msvcr100.dll丢失的6种解决方法。 首先&#xff0c;让我们来了解一下msvcr100.dll丢失的原因。msvcr100.dll是Microsoft Visual C 2010的一个组件&#xff0c;它包含了许多运行库文件&#xff0c;这些文件是许多应用程序所必需的。当msvcr1…

TouchGFX界面开发 | 图像控件应用示例

图像控件应用示例 TouchGFX中的图像会绘制关联图像文件中的像素数据。 使用图像文件前&#xff0c;必须将其导入到项目中。TouchGFX Designer内置了五种类型的图像部件&#xff1a; 固定图像&#xff1a;图像大小是由关联的图像文件定义的&#xff0c;不能在运行时改动。若要将…

物联网AI MicroPython传感器学习 之 GPS户外定位模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 HT2828Z3G5L是一款高性能的面向车载组合导航领域的定位G-MOUSE&#xff0c;系统包含同时支持北斗和GPS的高性能卫星接收机芯片。具备全方位功能&#xff0c;能满足专业定位的严格要求。体积小巧…