雪雨星风 发布留言 2008-6-17 08:58
魔兽密保卡效果,精通数组的大虾请进!
我想做一个类似魔兽密保卡的系统:密保卡如下
但我的数组学的不好,哪位高人帮忙解决下
所要效果如下
登录账号时随即生成6个字母 比如 AEBDHF
那吗需要用户从密保卡上找到对应的数字填入才能验证成功登录
验证是先找行再找列 AEBDHF 对应的数字为115432
A B C D E F G H I J K L M N
A 11 12 13 14 15 16 17 18 19 20 21 22 23 24
B 25 26 27 28 29 30 31 32 33 34 35 36 37 38
C 39 40 41 42 43 44 45 46 47 48 49 50 51 52
D 53 54 55 56 57 58 59 60 61 62 63 64 65 66
E 11 12 13 14 15 16 17 18 19 20 21 22 23 24
F 25 26 27 28 29 30 31 32 33 34 35 36 37 38
G 39 40 41 42 43 44 45 46 47 48 49 50 51 52
H 53 54 55 56 57 58 59 60 61 62 63 64 65 66
我想应该是用二维数组吧
很紧急 高手帮忙 小弟不甚感激
雪雨星风 发布留言 2008-6-17 10:19
我说的有哪点不清楚吗?有问题提出来 我现在急需解决
雪雨星风 发布留言 2008-6-17 11:59
[em04]摆脱 高手们指点一下
hebingbing 发布留言 2008-6-17 12:32
验证是先找行再找列 AEBDHF 对应的数字为115432
是怎么找的,我怎么还没有看出来名堂……
雪雨星风 发布留言 2008-6-17 12:55
最上面不是有一行字母吗
左边也有列字母
要想找到唯一的数字必须根据横坐标和纵坐标找交叉点吧
产生的字母是先根据横坐标(也就是行)和纵坐标(也就是列)产生的
比如产生的ED 意思就是先在行上找到E再在列上找到D 他们相交的那个数就是要验证的数 57
hebingbing 发布留言 2008-6-17 13:01
哦,那样的话就比较好找了啊……
比如一个数组a,则第一行就是a[0,0]--a[0,26]然后一次类推……
比如要找DE,D是第四个,E是第五个,则要的数组就是a[3,4]……
雪雨星风 发布留言 2008-6-17 15:05
是啊 但是如何判断?[em04]
hebingbing 发布留言 2008-6-17 15:07
那你就事先将数组赋值啊,然后判断是否输入相等啊……
雪雨星风 发布留言 2008-6-17 15:22
public void shuzu()
{
string[,] myArray;
myArray = new string[ ,] { {"Z","A","B","C","D","E","F","G","H","I"},
{"A","11","32","33","54","55","76","77","98","99"},
{"B","12","31","34","53","56","75","78","97","01"},
{"C","13","30","35","52","57","74","79","96","02"},
{"D","14","29","36","51","58","73","80","95","03"},
{"E","15","28","37","50","59","72","81","94","04"},
{"F","16","27","38","49","60","71","82","93","05"},
{"G","17","26","39","48","61","70","83","92","06"},
{"H","18","25","40","47","62","69","84","91","07"},
{"I","19","24","41","46","63","68","85","90","08"},
{"J","20","23","42","45","64","67","86","89","09"},
{"K","21","22","43","44","65","66","87","88","10"}};
try
{
for (int x = 0; x < 12;x++)
{
for (int y = 0; y <10; y++)
{
Response.Write(myArray[x, y] + " ");
}
Response.Write("
");
}
}
catch(Exception ex)
{
Response.Write(ex.Message);
}
Random rdm = new Random();
for (int i = 0; i < 3; i++)
{
Response.Write("在验证码中产生的结果:" + myArray[rdm.Next(1, 12), rdm.Next(1, 10)]);
Response.Write("
");
}
//字母索引行
for (int j = 0; j < 10; j++)
{
Response.Write("列:" + myArray[0, j] + " ");
}
//字母索引列
Response.Write("
");
for (int j = 0; j < 12; j++)
{
Response.Write("行:" + myArray[j, 0] + " ");
}
}
雪雨星风 发布留言 2008-6-17 15:23
你运行下看看 最终结果显示出来了 但是它对应的字母组取不到[em10]
hebingbing 发布留言 2008-6-17 18:18
那ABCD这些字母干什么啊,数组中不要保存这些字母,但是在网页中显示重来就可以了嘛……
冰彩虹 发布留言 2008-6-17 19:57
遇到什么问题?
雪雨星风 发布留言 2008-6-18 08:59
//问题描述
//有时间正确 有时间取不到随即数 有时间数组索引超出范围 竟然能取到z 我实在看不出来 请高手帮助
//
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections; //动态数组命名空间
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
yanzheng();
Response.Write("
"); //30秒后自动刷新页面
}
protected void tijiao_Click(object sender, EventArgs e)
{
try
{
if (this.shuru.Text == "")
{
Response.Write("");
}
else
{
if (this.shuru.Text == Session["yzm"].ToString())
{
this.jieguo.Text = "你终于成功了";
}
else
{
this.jieguo.Text = "你失败了";
}
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
//通过二维数组产生验证码
public void yanzheng()
{
string[,] myArray; // 创建数组
myArray = new string[,] { {"Z","A","B","C","D","E","F","G","H","I"}, //填充数组
{"A","11","32","33","54","55","76","77","98","99"},
{"B","12","31","34","53","56","75","78","97","01"},
{"C","13","30","35","52","57","74","79","96","02"},
{"D","14","29","36","51","58","73","80","95","03"},
{"E","15","28","37","50","59","72","81","94","04"},
{"F","16","27","38","49","60","71","82","93","05"},
{"G","17","26","39","48","61","70","83","92","06"},
{"H","18","25","40","47","62","69","84","91","07"},
{"I","19","24","41","46","63","68","85","90","08"},
{"J","20","23","42","45","64","67","86","89","09"},
{"K","21","22","43","44","65","66","87","88","10"}};
try
{
for (int x = 0; x < 12; x++) //输出数组 (方便测试)
{
for (int y = 0; y < 10; y++)
{
Response.Write(myArray[x, y] + " ");
}
Response.Write("
");
}
//输出字母索引行
for (int j = 0; j < 10; j++)
{
Response.Write("列:" + myArray[0, j] + " ");
}
//字输出母索引列
Response.Write("
");
for (int j = 0; j < 12; j++)
{
Response.Write("行:" + myArray[j, 0] + " ");
}
Random rdm = new Random(); // 实例化一个生成器
for (int x = 0; x < 12; x++)
{
for (int y = 0; y < 10; y++)
{
if (myArray[x, y] == myArray[rdm.Next(1, 12), rdm.Next(1, 10)])
{
Response.Write(myArray[x, 0]); //测试输出用
Response.Write(myArray[0, y]);
Response.Write("
");
Response.Write(x);
Response.Write(y);
Response.Write("
");
Response.Write(myArray[y, x]);
Session["lie"] = myArray[x, 0]; // 产生行字母
Session["hang"] = myArray[0, y]; //产生列字母
Session["yzm"] = myArray[y, x]; //产生行和列坐标交叉点的数字
}
}
Response.Write("
");
}
Response.Write("
");
this.xianshi.Text = Session["lie"].ToString();
this.xianshi.Text += Session["hang"].ToString(); //给显示验证码的label赋值
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
191638141 发布留言 2008-6-18 11:29
实例化生成器内错误
为什么把myArray[rdm.Next(1, 12), rdm.Next(1, 10)]这就写在循环内?
每循环一次变化一次 怎么比较啊?
雪雨星风 发布留言 2008-6-18 13:30
只要能产生字母可以验证成功
只是有时会出现取不到值 和 超出范围[em04] [em04]
191638141 发布留言 2008-6-18 16:54
让再说一次吗?
没取到值原因:
你每循环一次 随机产生一次 当循环几次还没取到值,这时随机数随到你前面循环的位置 你能取到值?比如 你循环X-2次 Y-3次 当随机产生为myarry[1,],myarry[1,..] ...或者myarry[2,1],...myarryp[2,2]你能取到相等值吗?
超出范围原因:
当你X循环9次以上,Y循环随便循环几次的时候 你的myarry[y,x]能不超出范围.
行和列的数目又不是相等的..
ps:不要一味的个人主义 好的建议就要先考虑再做判断 不要浪费大家的所谓的无意义的时间.
页: [1]