-
2021-12-15 00:52:43
1>创建一个Hero类特征name(英雄名字),hp(血量),mp(魔法值), physicsAttack(物理攻击力),magicAttack(魔法攻击力)
2>创建一个BattleControl战斗管理类,该类有两个字段分别为List ours(存储己方阵营中五个英雄)和List enemy(存储对方五个英雄)类型,分别创建五个英雄和五个敌人分别添加到对应List泛型列表中。添加int类型字段round 记录战斗开始到结束总的回合数。注:英雄名字自定义,血量200 魔法值100 攻击力自定义。
3>模拟回合制游戏逻辑,初始化完毕后首先己方攻击,每次攻击随机从对方阵营筛选一个敌人进行攻击,
a)每次造成的伤害为物理攻击和魔法攻击的叠加值,如果没有魔法值那么伤害值只是物理攻击力即可。
b)每次魔法攻击之后需要减去相应的魔法值,比如魔法攻击力为20,那么魔法值也需要消耗20个点。
c)攻击的同时输出信息格式:小一攻击了小二,小二剩余血量为80。
d)己方所有英雄攻击完毕之后,敌人攻击,攻击流程同上。
4>当某一个敌人或者己方英雄死亡后将死亡角色从对应List泛型列表中移除,某一个阵营全部死亡,游戏结束,开始结算,显示获胜方。显示总的回合数。
代码如下:class Hero{ //英雄类 private string name; //英雄名字 private int hp; //血量 private int mp; //魔法值 private int physicsAttack; //物理攻击力 private int magicAttack; //魔法攻击力 public Hero(string name,int hp,int mp,int pA,int mA){ this.name=name;this.hp=hp;this.mp=mp;this.physicsAttack=pA;this.magicAttack=mA; } //set and get method: public void setName(string name){ this.name = name; } public string getName(){ return this.name; } public void setHp(int hp){ this.hp = hp; } public int getHp(){ return this.hp; } public void setMp(int mp){ this.mp = mp; } public int getMp(){ return this.mp; } public void setPa(int pa){ this.physicsAttack = pa; } public int getPa(){ return this.physicsAttack; } public void setMa(int ma){ this.magicAttack = ma; } public int getMa(){ return this.magicAttack; } //judge hero whether liveing public bool isLive(){ if(this.hp <= 0){ return false; } return true; } } class BattleControl{ //战斗管理类 private List<Hero> ours; //存储己方阵营中五个英雄 private List<Hero> enemy; //(存储对方五个英雄)类型 public BattleControl(){ this.ours = new List<Hero>(); this.enemy = new List<Hero>(); } //set get method: public void setOurs(List<Hero> ours){ this.ours = ours; } public void setEnemy(List<Hero> enemy){ this.enemy = enemy; } public List<Hero> getOurs(){ return this.ours; } public List<Hero> getEnemy(){ return this.enemy; } public void addOurs(Hero h){ this.ours.Add(h); } public void addEnemy(Hero h){ this.enemy.Add(h); } //待改进:liveOurs和liveEnemy可修改为一个方法进行判断。。。 //有一个英雄活着则返回为true public bool liveOurs(){ //traverse heros int record = 0; foreach (Hero h in (this.ours)){ if(h.isLive()){ record++; return true; } } if(0 == record) return false; return true; } public bool liveEnemy(){ //traverse heros int record = 0; foreach (Hero h in (this.enemy)){ if(h.isLive()){ record++; return true; } } if(0 == record) return false; return true; } } class Test{ static void war(Hero a,Hero b){ //a 和 b 开始打斗 b.setHp(b.getHp()-a.getPa()); //b.hp = b.hp - a.physicsAttack; b.setMp(b.getMp()-a.getMa()); //b.mp = b.mp - a.magicAttack; a.setMp(a.getMp()-a.getMa());//a.mp = a.mp - a.magicAttack; Console.WriteLine(a.getName()+"攻击了"+b.getName()+","+b.getName()+"剩余血量为"+b.getHp()); } static int RandomNum(int len){ Random rd = new Random(); int random = rd.Next(len); return random; } static void Main(){ //new some heros: Hero h1 = new Hero("Sheldon",200,100,40,20); Hero h2 = new Hero("Leonard",200,100,30,15); Hero h3 = new Hero("Howard",200,100,20,14); Hero h4 = new Hero("Raj",200,100,10,13); Hero h5 = new Hero("Han",200,100,5,12); Hero h6 = new Hero("Penny",200,100,40,30); Hero h7 = new Hero("Bernadette",200,100,10,19); Hero h8 = new Hero("Amy",200,100,10,16); Hero h9 = new Hero("Max",200,100,45,10); Hero h10 = new Hero("Caroline",200,100,25,7); BattleControl bc = new BattleControl(); bc.addOurs(h1); bc.addOurs(h2); bc.addOurs(h3); bc.addOurs(h4); bc.addOurs(h5); bc.addEnemy(h6); bc.addEnemy(h7); bc.addEnemy(h8); bc.addEnemy(h9); bc.addEnemy(h10); //begin war //己方开始对战 int round = 0; //记录战斗开始到结束总的回合数 int flag = 1; //己方为1,敌人为0 while(true){ if(1 == flag) { int enemy_people = 0; //算一下敌人活着的人数,用于随机敌人的抽取 foreach (Hero tmp in (bc.getEnemy())){ enemy_people++; } int ours_people = 0; foreach (Hero tmp in (bc.getOurs())){ ours_people++; } //随机抽取一个敌人,使用RandomNum(ours_people);函数 List<Hero> enemy_list = bc.getEnemy(); Hero random_enemy = enemy_list[RandomNum(enemy_people)]; int record = 0; foreach (Hero h_ours in (bc.getOurs())){ record++; //让己方的每一个英雄轮流攻打敌人 war(h_ours,random_enemy); if(random_enemy.getHp() < 0 ){ //若进此判断,证明random_enemy这个英雄应该被remove bc.getEnemy().Remove(random_enemy); if(!(bc.liveEnemy())){ break; } if(1 == enemy_people){ foreach (Hero tmp in (bc.getEnemy())){ if(tmp.isLive()){ random_enemy = tmp; } } //random_enemy = enemy_list[0]; } else if(enemy_people > 1){ random_enemy = enemy_list[RandomNum(enemy_people-1)]; } else{ break; } } } } //break; if(-1 == flag) { int enemy_people = 0; foreach (Hero tmp in (bc.getEnemy())){ enemy_people++; } int ours_people = 0; foreach (Hero tmp in (bc.getOurs())){ ours_people++; } List<Hero> ours_list = bc.getOurs(); Hero random_ours = ours_list[RandomNum(ours_people)]; int record = 0; foreach (Hero h_enemy in (bc.getEnemy())){ record++; war(h_enemy,random_ours); if(random_ours.getHp() < 0 ){ bc.getOurs().Remove(random_ours); if(!(bc.liveOurs())){ break; } if(1 == ours_people){ foreach (Hero tmp in (bc.getOurs())){ if(tmp.isLive()){ random_ours = tmp; } } } else{ random_ours = ours_list[RandomNum(ours_people-1)]; } } } } flag = -(flag); //Console.WriteLine("flag = "+flag); round++; //当其中一方全部死亡时,跳出while loop if( !(bc.liveOurs()) || !(bc.liveEnemy()) ){ break; } } if( bc.liveOurs() && (!(bc.liveEnemy() ))){ Console.WriteLine("Ours is Successful! "); } else if( bc.liveEnemy() && (!(bc.liveOurs() ))){ Console.WriteLine("Enemy is Successful! "); } else { Console.WriteLine("Equal! "); } Console.WriteLine("Sum Round = "+round); } }
使用dotnet run命令运行程序
运行结果截图:
更多相关内容 -
C#大作业学生管理系统.zip
2021-06-03 13:22:47大二菜鸟做的很普通的学生管理系统 -
C#大作业.zip
2019-07-24 09:56:15sql2008 vs2010 建表语句word文档里有 ... (2)图书管理:包括添加新的图书信息、修改图书信息、查询图书信息、删除图书信息。 (3)读者管理:包括借书证信息变更、借书证挂失与解除、注销借书证。... -
C#大作业源码及课程报告(十五子游戏)
2019-04-22 11:34:49全是自己写的一个十五子游戏,里面有源代码,可执行文件、课程报告 -
Librarian:小学期C#大作业
2021-07-17 22:35:27#c#小学期大作业 2015-7-20 图书管理系统 使用.net图形界面,sql server数据库 使用前请将data文件夹中的数据库文件附加到SQL Server (本系统为2012版实现)中。 然后直接双击 我的图书管理系统.sln 打开(由VS2013... -
C#大作业——图书管理系统(完整版)
2017-06-07 21:10:45这个是一个完整的C#程序 一个图书管理系统包括图书查询,出版社管理,管理员管理,借阅管理等等,C#实训做得一点一点敲出来的,所以这个需要点积分,莫怪莫怪。数据库用的Access,登录账号14110506015 密码123456 ... -
C#Winform大作业合集
2021-02-23 20:05:43C#Winform大作业合集:住宿管理系统,游戏商人系统,音乐系统,学生管理系统需求,学生管理系统,学生个人信息管理,学生出入信息管理系统,学生成绩管理系统,宿舍入住系统,图书管理系统1,图书管理系统,图书馆... -
银行管理系统 C#大作业 完整功能+报告
2022-05-28 20:11:07下载本资源后,如需提交成期末大作业 只需修改帮助中的小组成员名,可在数据库中进行修改,这个网上教程随便一搜就可以查到,跟着做一遍就可以修改 本篇资源也提供完整课程设计报告,自行添加小组成员名即可 课程... -
C#大作业学生选课系统
2019-02-15 12:30:25visual studio 2017 mysql 2018 角色:管理员、学生 功能:登录、学生选课、管理员排课、培养计划excel导入、教师学生管理、学生选课时段设置、学分限制、课程表、选课结果管理等 采用MVVM模式,即Model-View-... -
C#课程设计-C#大作业基于ASP.NET+SQL实现的学生信息管理系统源码.zip
2022-06-15 06:49:00C#课程设计-C#大作业基于ASP.NET+SQL实现的学生信息管理系统源码 内附使用说明和数据库文件,新手也可自己操作,高分必看 基于C#的学生管理信息系统,ASP.NET+SQL Server+Layui,包含sql文件 本系统前后端不分离 ... -
C#数据库大作业(学生信息管理系统).zip
2021-12-23 19:34:38免费的,开源的,C#数据库大作业(学生信息管理系统),可能还有未知bug还请各位指正,谢谢,如果可以关注一波就更好了 -
C#大作业四次作业---w界面奇奇怪怪的w
2021-01-21 21:00:04俺的大作业! -
C#课程设计-C#大作业基于ASP.NET技术的动漫管理系统源码(老司机驾驶舱).zip
2022-06-15 17:01:31C#课程设计-C#大作业基于ASP.NET技术的动漫管理系统源码(老司机驾驶舱)。 编写本应用的主要目的是通过.NET技术实践了三层开发的基本思想: 通过ORM框架实现数据访问层,并将数据库操作服务封装为DAO层; 通过razor... -
C#课程设计-C#大作业基于Windows窗体的学校教务管理系统源码(开发文档+数据库文件).zip
2022-06-15 06:57:30C#课程设计-C#大作业基于Windows窗体的学校教务管理系统源码。功能描述 本系统包括两类用户:学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息;开设课程、查询课程... -
C#大作业员工考勤系统
2022-02-13 09:02:28包含源代码与综合实验说明书 -
C#大作业-个人记账系统
2022-02-13 08:55:52包含综合实验设计说明书与源代码 -
C#大作业_仿真资源管理器
2019-11-14 17:26:11C#作业 Winform做一个仿真资源管理器 用到TreeView、ListView 实现得非常简单,完成了后退,前进,返回上一级文件,搜索的功能,仅适合C#新手做作业参考 -
C#大作业(音乐播放器)
2019-12-31 18:31:17C# 简易版的音乐播放器,应对大作业绝对够,注释十分全面,调试到位,本人亲写,耗时3小时,各种控件等的都注释的很清晰,希望大家下载观看,用来学习或者提交大作业都是很好的 -
银行管理系统C#大作业
2022-05-22 21:22:54要求:创建WPF应用程序,完成银行业务管理综合实例。 1、功能模块: 职员管理功的设计与实现 2、功能模块: 职员工资调整的设计与实现 3、功能模块: 取款功能的设计与实现 4、功能模块: 存款查询功能的设计与实现... -
C#大作业——学生信息管理系统
2022-06-02 20:50:32C# WinForm和数据库结合操作 获取数据框的值 新增数据(连接数据库+执行SQL语句) 工具类——DBhelp封装 优化新增数据 二、多表操作 1:为什么执行多表操作 2:解决方案 3:操作数据 三、登录操作 四:菜单操作 1:...目录
gitee项目地址(觉得有用的道友star一下,谢谢)
一、数据库操作
建立数据库结构
1:新建一个数据库
1:打开 数据库管理软件 navicat/SQLoya
2:创建连接
3:选择连接右键新建数据库
4:展开数据库
5:右键新建表2:表中数据
唯一的ID:对这个表的标识 类似身份证 唯一。
id:一般我们都会让它作为主键(非空、自增)3:填充表中数据
新建表的时候: 每个字段都有一个类型
我们填充数据的时候:要根据类型填充数据
int:整数 如:1、2、3、…
varchar:字符串(必须指定长度) 如:‘呆呆’、‘西门吹雪’、…表结构展示
对数据的基本操作(添加 修改 删除 查询)
现在表中添加数据,然后我们展示列表并查询
1:新增
语法:
INSEST INTO + 表名 (字段名1,字段名2,字段3...) VALUES(列表1,列表2,...)
返回值:受影响的行(执行增删改的时候,都会返回受影响的数据)新增一个学生 由于sid自增 我们每次添加数据不需要添加主键;因为sid 会自动添加。
INSERT INTO student (sname, sage) VALUES("周芷若", 19)
新增多条数据
INSERT INTO student (sname, sage) VALUES('周一', 18),('周二', 19),('周三', 20)
2:修改
语法:
UPDATE + 表名 set 列名 = '新的数据' where 条件
把id为1的人名字 改成张三
update student set sname='张三' where sid=1
把周一的名字 改成 周五
update student set sname='周日' where sname='周一'
3:删除
语法:
DELETE from 表名 + WHERE 条件
删除学号为1的学生
DELETE FROM student WHERE sid = 1
在真正的开发中,删除并不是物理删除 而是逻辑删除(即用一个变量表示是否被删除)
4:查询 单表、多表的查询
语法:
SELECT <要查询的字段 sage/sid/全部(*)> from + 表名 where 条件
查询所有的学生信息(表中所有列)
SELECT * FROM student
查询学生年龄 和 姓名
SELECT sname, sage FROM student
条件查询 查询出来年龄是18 的人的名称
SELECT sname FROM student WHERE sage=18
多个条件 查询年龄是18 而且 姓名是周二的人的所有信息
SELECT * FROM student WHERE sage=18 AND sname='周二'
模糊查询 查询所有名字里带周
SELECT * FROM student WHERE sname LIKE '%周%'
为什么需要创建关联表?
当我们执行班级操作时,如果我们把班级放在学生表中可能会操作不了。
比如:三个2020班级的学生,查询到数据重复,再比如新增2025班级,但是这个时候还没有学生在2025班级,无法操作学生表怎么办。这个时候我们可以考虑:使用关联表,新建一个班级表。
C# WinForm和数据库结合操作
获取数据框的值
// 根据组件的属性name获取 输入框(TextBox)里面的数据 // this:当前窗口使用 name:属性名 Text:文本 string sname = this.sname.Text; string sage = this.sage.Text;
新增数据(连接数据库+执行SQL语句)
private void button1_Click(object sender, EventArgs e) { // 根据组件的属性name获取 输入框(TextBox)里面的数据 // this:当前窗口使用 name:属性名 Text:文本 string sname = this.sname.Text; string sage = this.sage.Text; // 连接数据库的操作 // 1: 声明一个数据源 目的:找到我的收据库 /* * server:服务 localhost/127.0.0.1(本地) * port:端口号 MySQL数据库的端口号就是3306 所以契合 * database:数据库 声明我要用哪个数据库 * uid:数据库用户名 * pwd:数据库的密码 */ string url = "server=127.0.0.1; port=3306;database=csharp;uid=root;pwd=root"; // 2:创建 链接 // 注意 : 我们链接数据库的时候需要引用 mysql.data.dll MySqlConnection con = new MySqlConnection(url); // 3: 打开数据库 con.Open(); // MessageBox.Show("打开数据库"); //4: 声明一个sql // 既然 数据库已经打开了 我是不是可以对数据库进行一些操作 // 注意:SQL字符串需要用引号括着 string sql = string.Format("INSERT INTO student (sname,sage) VALUES('{0}', {1})", sname, sage); // 5:创建一个操作 sql的对象(MySqlCommand) MySqlCommand com = new MySqlCommand(sql, con); // 6: 执行结束之后 返回一个结果 整数 int // ExecuteNonQuery: 执行增删改的 新增 修改 删除 int i= com.ExecuteNonQuery(); if (i > 0) { //类似于js中的console.log()提示框 MessageBox.Show("新增成功"); } else { MessageBox.Show("失败"); } }
工具类——DBhelp封装
private static String connStr = "server=localhost;database=csharp;uid=root;pwd=root;charset=utf8;sslmode=none"; //声明链接 public static MySqlConnection GetConn() { MySqlConnection conn = new MySqlConnection(connStr);// if (conn.State == ConnectionState.Closed) conn.Open();//判断是否关闭 打开链接 return conn;//返回链接 } public static void CloseAll(MySqlConnection conn) { if (conn == null) return; if (conn.State == ConnectionState.Open || conn.State == ConnectionState.Connecting) //判断 conn.Close();//关闭链接 } public static int ExecuteNonQuery(string sql) // 增删改 封装 返回受影响的行 { MySqlConnection conn = null; int result; //提前设置一个返回值 try { conn = GetConn();//获取链接 MySqlCommand cmd = new MySqlCommand(sql, conn); result = cmd.ExecuteNonQuery();//执行sql 并返回受影响的行的个数 } finally { CloseAll(conn); } return result; } public static MySqlDataReader executeQuery(string sql) //查询 { MySqlDataReader res = null; MySqlConnection conn = null; try { MySqlConnection conn1 = GetConn(); MySqlCommand cmd = new MySqlCommand(sql, conn1); res = cmd.ExecuteReader(); } finally { CloseAll(conn); } return res; }
优化新增数据(通过工具类)
private void button1_Click(object sender, EventArgs e) { string sname = this.sname.Text; string sage = this.sage.Text; string sql = string.Format("INSERT INTO student (sname,sage) VALUES('{0}', {1})", sname, sage); int i = DBhelp.ExecuteNonQuery(sql); if (i > 0) { MessageBox.Show("新增成功"); } else { MessageBox.Show("失败"); } }
二、多表操作
1:为什么执行多表操作
如图所示:我进行班级操作的时候,此时是没办法操作,周一、周三两人退学,那么2020这个班级就不复存在了。无法操作班级2020。
2:解决方案(创建关联表,操作多表数据)
3:操作数据
多表操作一般情况下只使用查询操作
多表操作:as(起别名) 此时有问题 没有班级的学生(即gid为NULL)难道 不配被查询嘛?
SELECT * FROM student AS a, grade AS b WHERE a.gid = b.gid
高级多表查询:INNER JOIN 内连接 LEFT JOIN 左连接(以左表为主表查询 如果右表没有与之匹配的数据就用null来代替)
SELECT * FROM student a LEFT JOIN grade b ON a.gid = b.gid
三、登录操作
// 重置按钮:清空输入框里面的值 this.textBox1.Text = ""; this.textBox2.Text = ""; this.radioButton1.Checked = true; this.radioButton2.Checked = false; // 点击登录 string password = null; if (radioButton1.Checked == true) { // string.Format格式化字符串 string sql = string.Format(@"SELECT password FROM student WHERE username='{0}'", textBox1.Text); // 执行sql 返回一个结果集 MySqlDataReader res = DBhelp.executeQuery(sql); // 一行一行 往下读 while (res.Read()) { password = res["password"].ToString(); } if (password.Equals(textBox2.Text)) { MessageBox.Show("登录成功"); } else { MessageBox.Show("账号密码错误"); } } else { string sql = string.Format(@"SELECT password FROM teacher WHERE username='{0}'", textBox1.Text); MySqlDataReader res = DBhelp.executeQuery(sql); while (res.Read()) { password = res["password"].ToString(); } if (password.Equals(textBox2.Text)) { MessageBox.Show("登录成功"); } else { MessageBox.Show("账号密码失败"); } }
四:菜单操作
1:显示菜单
// 创建 学生菜单的实例 StudentMenu stu = new StudentMenu(); // 这个是展示窗口 stu.Show(); // 展示窗体之后,把前一个打开的窗体关闭 this.Hide();
2:ListView控件的使用
选择编辑行
修改ListView框的属性
五:回显数据
string gid = null; //班级号 StuList s = null; //已经打开就不再new了 private void AddStudent_Load(object sender, EventArgs e) { string sql = string.Format(@"SELECT * FROM grade"); MySqlDataReader res = DBhelp.executeQuery(sql); while (res.Read()) { string gname = res["gname"].ToString(); this.comboBox1.Items.Add(gname); } // 设置下拉框初始值 comboBox1.Items.Insert(0, "请选择"); this.comboBox1.SelectedIndex = 0; } private void button2_Click(object sender, EventArgs e) { string sql = string.Format(@"insert into student (sname, sage, gid, username) values('{0}', {1}, {2}, '{3}')", textBox1.Text, textBox2.Text, gid, textBox4.Text); int i = DBhelp.ExecuteNonQuery(sql); if (i > 0) { if (s == null) { s = new StuList(); s.Show(); } else { s.Reload(); } DialogResult dialogResult = MessageBox.Show("新增成功,是否需要继续新增", "新增提示", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation); if (dialogResult == DialogResult.Yes) { this.TopMost = true; } else if (dialogResult == DialogResult.No) { this.Hide(); } } else { MessageBox.Show("新增失败"); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { //获取gid string sql1 = string.Format(@"SELECT * FROM grade where gname = '{0}'", comboBox1.Text); MySqlDataReader res1 = DBhelp.executeQuery(sql1); while (res1.Read()) { gid = res1["gid"].ToString(); } }
六、修改删除数据
双击图中的事件:
private void listView1_SelectedIndexChanged(object sender, EventArgs e) { //判断有没有选中数据,选中后回显数据 if (this.listView1.SelectedItems.Count > 0) { // 拿到选中数据 索引值从0开始:因为每次选中一行,所有索引值为0 ListViewItem lis = this.listView1.SelectedItems[0]; string sid = lis.Tag.ToString(); string sname = lis.Text; // 获取子菜单 string sage = lis.SubItems[1].Text; string gname = lis.SubItems[2].Text; string username = lis.SubItems[3].Text; //把拿到的数据赋值在修改框中 textBox1.Text = sname; textBox2.Text = sage; textBox3.Text = gname; textBox4.Text = username; } }
七、页面之间的传值
-
C#大作业:点餐及账单管理系统
2022-01-07 21:50:3712.26-1.2 c#大作业 点餐系统(老板和用户两个系统) - 阿萍萍萍 - 博客园 (cnblogs.com) 登录注册界面 员工不可注册,员工可注册。若是两次密码不一致、账号输入为空、账号已有都会进行相应的对话框提醒。 ...完成过程中遇到的认为比较难的问题记录,包括解决方案和查找资料的来源:
12.26-1.2 c#大作业 点餐系统(老板和用户两个系统) - 阿萍萍萍 - 博客园 (cnblogs.com)
登录注册界面
员工不可注册,员工可注册。若是两次密码不一致、账号输入为空、账号已有都会进行相应的对话框提醒。
用户界面
点餐
在下侧区域中可以进行菜单和购物车的切换,不用再新开一个购物车的窗口
此外添加了随机摇摇的功能
购物记录
我有建议
员工界面
账单
菜品管理
左侧显示菜单的数据库内容,点击某一行右侧会出现内容详情,增删改查(查找是依据菜品名称),若进行操作成功或不查询不存在菜品会进行提醒。
信息管理
还存在的问题:
1.点餐界面的查询偶尔可以用一次但是第二次就不能变了,偶尔用不了
2.点餐界面点击数据表内容,num列的时候别的不能显示内容
3.没有设置加购数量
4.虽然已经设置过了,但是随即摇摇后显示出来的结果的num与选中文本框的数值不对应,虽然都是随机的
5.购物记录和账单查看的price不对,只能显示**,且SQL的求和还有问题
6.问题记录里部分不影响运行的遗留问题
-
C#大作业-vs2013-windows客户端
2017-09-01 17:36:48C#大作业-vs2013-windows客户端-与数据库交互-实现简单的增删改查功能-附带实验报告文档;C#大作业-vs2013-windows客户端-与数据库交互-实现简单的增删改查功能-附带实验报告文档; -
【C#大作业】你画我猜——设计文档
2022-04-22 00:02:101 系统功能说明 该系统采用C/S架构,是一种可以联机进行你画我猜的游戏程序,玩家登录后,可选择进出房间,聊天,画图,猜图等功能。 玩家首先用不可重名的用户名登录,之后会进入房间大厅,在大厅里玩家可以自由...设计文档
1 系统功能说明
该系统采用C/S架构,是一种可以联机进行你画我猜的游戏程序,玩家登录后,可选择进出房间,聊天,画图,猜图等功能。
玩家首先用不可重名的用户名登录,之后会进入房间大厅,在大厅里玩家可以自由选择想进入的房间,也可以在大厅与其他玩家进行即时聊天。
进入房间后,聊天窗口会提示玩家进出房间的消息并刷新玩家列表。第一个进入房间的玩家,会默认成为画题的一方,系统会给其作画题目;之后进入的玩家都是猜画的一方,仅能知晓题目的字数。
玩家均有用户列表,退出房间,即时聊天功能。画家额外拥有刷新题目,五种不同颜色画笔以及擦除的作画功能。猜画玩家专享答题窗口,将猜测的答案发送出去后,系统会提示其正误。只要有一名玩家猜中,此回合游戏就结束,系统将对每个玩家进行弹窗通告某个用户猜对了,并且猜对的玩家成为画题人。若作画玩家中途退出,将任选一名玩家为新的作画人。
2 运行环境说明
编译环境:visual studio 2019;
采用TCP模式,C/S架构,服务端使用WCF服务库,客户端使用WPF应用(.NET Framework);
系统实现多台计算机联机画板和联机通信。
3 系统概要设计
3.1 系统总体功能设计
用户登录:
用户名不能为空,不能重复; 大厅有四个游戏房间,房间下面有对应的房间信息(房间号和、房间人数),玩家可随意进入;大厅聊天:
用户user发送消息送到服务器,服务器遍历在线玩家列表发送给所有玩家;
房间内聊天、房间内猜题:用户user发送消息到服务器,服务端遍历该房间内玩家列表将消息发送给所有玩家;墨迹的发送:
画板新增墨迹之后对墨迹进行打包转化成string类型发送到服务端,服务端发送给该房间内所有玩家,然后进行转化,添加到画板上;题目的刷新:
画题人点击刷新按钮,服务端会读取题库随机返回一个题目,同时对房间内所有玩家题目部分进行相应的更新;猜题:
猜题人猜题,服务端返回相应的提示(正确或者错误),如果正确,所有用户都会收到该用户猜对的信息,猜对的玩家成为新的画题人,其余玩家猜题,画板清空,题目刷新。玩家退出房间:
如果是画题人退出房间,在剩余的猜题人中选取一个成为画题人并更新其面板,清空墨迹信息。房间用户收到退出提示,大厅房间信息更新;退出系统:
如果玩家在游戏房间内退出系统,先执行退出房间,再执行退出系统,大厅消息栏提示用户退出。3.2 系统接口设计
##服务端实现的接口: [OperationContract(IsOneWay = true)] void Login(string userName); //登录系统 [OperationContract(IsOneWay = true)] void Logout(string userName); //登出系统 [OperationContract(IsOneWay = true)] void Talk(string userName, string message); //大厅聊天 [OperationContract(IsOneWay = true)] void InRoom(string username, string roomname); //进入游戏房间 [OperationContract(IsOneWay = true)] void Room_Talk(string userName, string message); //房间内聊天 [OperationContract(IsOneWay = true)] void sendink(string username, string ink); //传送笔迹 [OperationContract(IsOneWay = true)] void Guess_talk(string username, string message); //猜题框消息 [OperationContract(IsOneWay = true)] void Gusee_win(string username); //猜测正确 [OperationContract(IsOneWay = true)] void change_hua(string username); //改变画题人 [OperationContract(IsOneWay = true)] void Refersh_Timu(string username); //刷新题目 [OperationContract(IsOneWay = true)] void RoomOut(string username); //用户退出房间 客户端实现的接口: [OperationContract(IsOneWay = true)] void ShowLogin(string loginUserName, int[] roomcount); //显示新用户登录游戏,进入大厅 [OperationContract(IsOneWay = true)] void ShowLogout(string userName); //显示用户退出游戏 [OperationContract(IsOneWay = true)] void ShowTalk(string userName, string message); //在大厅发消息显示消息内容 [OperationContract(IsOneWay = true)] void InitRoomUsersInfo(string RoomUsersInfo, string ink, bool hua_or_cai, string timu); //初始化房间玩家列表 [OperationContract(IsOneWay = true)] void ShowInRoom(string username); //显示用户进入房间 [OperationContract(IsOneWay = true)] void ShowOutRoom(string userName); //显示用户退出房间 [OperationContract(IsOneWay = true)] void Showlabel(string labelname, int roomusercount); //大厅界面显示四个房间的人数 [OperationContract(IsOneWay = true)] void Show_Room_Talk(string userName, string message); //显示在房间里聊天的消息 [OperationContract(IsOneWay = true)] void Show_Room_Talk_error(string message); //显示在房间里聊天的消息 [OperationContract(IsOneWay = true)] void Show_Guess_Talk(string userName, string message, string daan); //显示猜测聊天框中的聊天消息 [OperationContract(IsOneWay = true)] void Showink(string ink); //显示墨迹信息 [OperationContract(IsOneWay = true)] void Show_Guess_win(string username); //显示用户猜中 [OperationContract(IsOneWay = true)] void Show_Refersh_Timu(string username, string Timu); //刷新题目后,在各个玩家界面显示 [OperationContract(IsOneWay = true)] void Show_Cannot_login();//提示用户不能登录 [OperationContract(IsOneWay = true)] void InitNewchutiren(string timu); //初始化新的出题人界面 [OperationContract(IsOneWay = true)] void change_hua_or_cai(bool hua, string username); //改变画题人和猜题人
4 系统详细设计
4.1 登录界面模块设计
4.1.1 模块描述
用户可以使用不同的用户名称进入游戏,若用户昵称已存在,则不能进入游戏。登录成功后“开始游戏”按钮变成不可点击状态,同时登录界面隐藏,大厅界面出现。
4.1.2 模块UI
图4-1 玩家登录界面
4.1.3 模块类设计
要实现登陆,首先需要用户名,登录成功与登录失败时控件的显示以及提示的消息
4.2 大厅界面模块设计
4.2.1 模块描述
游戏大厅有四个游戏房间,房间下方显示房间信息(房间号、实时房间人数),玩家可以在游戏大厅任意选择一个游戏房间开始游戏;
右边是聊天界面,玩家可以在这里与其他在线玩家进行即时聊天。
4.2.2 模块UI
图4.2 玩家进入大厅,右边有即时聊天窗口,玩家可任人选房间进入游戏
4.2.3 模块类设计
A. 大厅房间的实时显示
B. 大厅的即时聊天窗口的提示及互动
C. 用户点击房间并进入房间的按钮事件
D. 初始化新进房间的用户界面
E. 用户在大厅退出游戏及其提示
4.3 游戏房间模块设计
4.3.1 模块描述
房间的主要功能:玩家列表的显示、画板的实现、题库的实现、猜测聊天窗口和房间聊天窗口的交互实现。
4.3.2 模块UI
图4.3-1第一个进入房间的玩家默认作为画家,有画笔和擦除,刷新题目,即时聊天,退出房间等功能
图4.3.2 后来的玩家作为猜画人,能退出房间,即时聊天,有猜题专栏
4.3.3 模块类设计
A. 玩家列表
string[] users = RoomUsersInfo.Split('、'); this.userlist.Items.Clear(); for (int i = 0; i < users.Length; i++) { this.userlist.Items.Add(users[i]); }
B. 房间聊天的交互式实现
C. 猜测聊天框的实现
D. 笔刷墨迹信息的交互实现
E. 题库的设计原理及实现
5 功能运行效果
5.1 登录
图5-1-1 登录注册界面
5.2 大厅
图5-2-1 玩家进入大厅通告,大厅聊天
图5-2-1 大厅玩家退出通知
5.3 进入房间
图5-3-1 第一个玩家进入房间,画笔及擦除功能,换题功能,聊天功能,退出功能
图5-3-2 后来的玩家为猜题玩家,有专享的答题窗口
5.4 玩家画图
图5.4-1画家作画
图5.4-2画家擦除
图5.4-3画家换题,并清空画布
5.5 猜题
图5.5-1 玩家猜题错误
图5.5-2 玩家猜中
图5.5-3其他玩家界面显示有玩家猜中
图5.5-4 猜中人当画家
图5.5-5 原画家退出,系统随机选一人当画家
-
C#大作业讲课稿.doc
2020-04-17 22:42:41C#大作业 .NET开发技术基础 大作业 院 系 电子信息工程学院 专业班级 计算机科学与技术0902 学生姓名 无痕 学号 2009441643 成绩 年 月 日 作业内容一 题目2某公司有不同类型的员工经理秘书普通雇员会计每天早上830... -
c#大作业之航空订票管理系统.docx
2022-06-29 22:02:32c#大作业之航空订票管理系统 -
C#大作业 扫雷多目标制作
2019-01-01 15:34:091.设计Form1窗体模板,添加两个botton,两个label,一个panel,和menustrip组件。一个Botton背景添加贴图,另一个设为标视处雷,一个label记分数,另一个label记录时间,在menustrip加上ToolStripMenuItem游戏和... -
C#大作业理财小狗
2016-12-30 16:18:19软件工程专业实践课最终程序,包括报告和数据库 -
C#大作业-通讯录管理系统
2021-01-12 20:02:50C#大作业-通讯录管理系统 前言 学校本来开设的课程是《面向对象程序设计》,一开始老师老老实实上C++,临近期末了布置一个大作业用于期末考试,让我们做一个带界面的通讯录管理系统,我本想着用QT的,毕竟QT做界面... -
北大C#大作业-简易版泡泡堂
2018-10-17 13:56:02#北大C#课程大作业——简易版泡泡堂# 两位玩家,三种道具:宝箱,增加同时放置的炸弹个数;威力药水:增加炸弹爆炸波及的范围;加速器:加速移动。 玩家一通过控制↑、↓、←、→键进行上下左右移动,space键放置... -
c#期末大作业
2015-06-17 18:17:37c#期末大作业