史上最牛的JS,不是高手勿留言

iori_wen 2007-12-18 01:00:57

<html>
<head>
<script>
</script>
</head>
<body>
条件A:<INPUT type="text" name="a" size="5">
条件B:<INPUT type="text" name="b" size="5">
<br>
<br>
<button onclick="func()">开始并计算</button>
<br>
<br>
结果:<INPUT type="text" name="c">
</body>
</html>

写一个函数func(),能完成以下要求:
要求:1、点击“开始并计算”按钮在“结果”文本框中生成一个随机的四位数字,其中数字不能重复,范围0~9皆可。如:0357、5690、1234。
2、心里想一个四位数字,与“结果”文本框返回的数字做对比,找出数字和位置都正确的总数填入条件A(人工填入),数字正确但位置不正确的总数填入条件B(人工填入)。如:“结果” 文本框返回的数字为“1234”,我心里的数字为“5213”,则条件A应该填入1,条件B应该填入2。
3、填入条件后点击“开始并计算”按钮,通过算法重新得到结果,并写入“结果文本框”。
4、重复填入条件A、B并点击“开始并计算”按钮,直到“结果”文本框的内容和心里想的那个四位数字完全一样。
5、点击按钮超过11次(不包括11次),该程序便宣告失败,反之,则成功并获得CSDN得分。

如不能理解请,可参见百度:“文曲星猜数字”。
最后:如果您不能设计出程序或提出思路,请勿留言,谢谢配合。

...全文
1062 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
scotcn 2007-12-28
  • 打赏
  • 举报
回复
N年前在文曲星用Quick Basic就编过
sdwf1985 2007-12-22
  • 打赏
  • 举报
回复
搞不明白
hztgcl1986 2007-12-21
  • 打赏
  • 举报
回复

我又来了。
一直关注此帖,因为刚开始和楼主发生点小矛盾。





[img=http://profile.csdn.net/hztgcl1986/picture/1.jpg]
[/img]
iori_wen 2007-12-21
  • 打赏
  • 举报
回复
littleboys-飞龙,您的代码已测试并通过~果然还是带星的比较牛!现结贴!正确代码请参照54楼!
iori_wen 2007-12-20
  • 打赏
  • 举报
回复
风之石,你的代码我已测试,有那么点意思,起码你做了个头。但和要求还差距很远,希望你能加把劲钻研一下。
dh20156 2007-12-20
  • 打赏
  • 举报
回复
可能我理解错了,郁闷~~`````
dh20156 2007-12-20
  • 打赏
  • 举报
回复
"找出数字和位置都正确的总数填入条件A(人工填入),数字正确但位置不正确的总数填入条件B(人工填入)。如:“结果” 文本框返回的数字为“1234”,我心里的数字为“5213”,则条件A应该填入1,条件B应该填入2。"

楼主这句描述的矛盾了吧?
我的例子是:
条件A填入数字和位置都正确的总数;
条件B填入数字正确但位置不正确的总数。
dh20156 2007-12-20
  • 打赏
  • 举报
回复
不知道符不符合楼主题意!


<html>
<head>
<script>
var _a = [];//位置正确的数字
var _b = [];//正确的数字
var _c = [];//错误的数字
var _d = [];//上次出现的数字
var totle = 0;//猜测次数

Array.prototype.index = function(o){
var tl = this.length;
if(tl<1) return -1;
for(var i=0;i<tl;i++){
if(this[i]==o) return i;
}
return -1;
}

Array.prototype.insertto = function(p,s){
if(this[p]==null || this[p]==undefined){
this[p] = s;
}else{
var tmpstr = this[p];
this[p] = s;
this.insert(tmpstr);
}
}

Array.prototype.insert = function(s){
var inserted = false;
for(var i=0;i<this.length;i++){
if(this[i]==null || this[i]==undefined){
this[i] = s;
inserted = true;
return;
}
}
if(!inserted) this.push(s);
}

function func(){
++totle;
if(totle>12){
alert("mission unsuccessful!");
return;
}
var oa = document.getElementsByName("a")[0];
var ob = document.getElementsByName("b")[0];
var oc = document.getElementsByName("c")[0];
var oav = oa.value;
var obv = ob.value;

function changepos(arr){
for(var i2=0;i2<arr.length;i2++){
for(var i3=1;i3<arr.length;i3++){
var tmpa = _b[arr[i2]];
var tmpb = _b[arr[i3]];
_b.splice(arr[i2],1);
_b.splice(arr[i2],0,tmpb);
_b.splice(arr[i3],1);
_b.splice(arr[i3],0,tmpa);
}
}
}

function setvalue(arr,vstr,foo){
for(var i=0;i<vstr.length;i++){
var tmpstr = vstr.substr(i,1);
if(arr.index(tmpstr)==-1) foo(arr,tmpstr);
}
}
setvalue(_a,oav,function(a,b){a[_d.index(b)]=b;if(a.join("").length==4) alert("you want:"+a+"\n run times:"+totle);return;});
setvalue(_b,oav,function(a,b){a.insertto(_d.index(b),b)});
setvalue(_b,obv,function(a,b){a.insert(b)});

function getvalue(){
var _t = [];
if(_b.length!=4){
for(var i=0;i<4;i++){
var tmpstr = parseInt(Math.random()*10);
(_t.index(tmpstr)==-1 && _b.index(tmpstr)==-1)?_t.push(tmpstr):--i;
}
}else{
var _e = [];
for(var i=0;i<4;i++){
if(_a[i]==null){
_e.push(i);
}
}
if(_e.length>2){
changepos(_e);
}else{
if(_e.length==2){
changepos(_e);
}
alert("you want:"+_b+"\n run times:"+totle);
}
_t = _b.slice(0);
}
return _t.slice(0);
}

_d = getvalue();
//_c = _b.slice(0).concat(_d.slice(0));//超时
//_c = _c.concat(_d.slice(0));//超时
oc.value = _d;
oa.value = "";
ob.value = "";
}
</script>
</head>
<body>
条件A:<INPUT type="text" name="a" size="5">
条件B:<INPUT type="text" name="b" size="5">
<br>
<br>
<button onclick="func()">开始并计算</button>
<br>
<br>
结果:<INPUT type="text" name="c">
</body>
</html>
littleboys 2007-12-20
  • 打赏
  • 举报
回复
有点小问题,修改了一下。

<html>
<body>
<FORM METHOD=POST ACTION="" name="form1">
<button onclick="return func();">开始并计算</button>
<br>
<br>
我猜:<INPUT type="text" name="c">
条件A:<INPUT type="text" name="a" size="5">
条件B:<INPUT type="text" name="b" size="5">

你的数字是:<INPUT type="text" name="d">
</FORM>

</body>
</html>
<SCRIPT LANGUAGE="JavaScript">
<!--
var total = 0;
var isValid = new Array(5040);
for(var i=0;i<isValid.length;i++)
{
isValid[i]='true';
}
var nums = new Array(5040 * 4);
var pos = 0; //5040 * 4数组中的位置
var a, b, c, d;
for (var aa = 0; aa < 10; aa++) {
for (var bb = 0; bb < 10; bb++) {
if (aa != bb)
{
for (var cc = 0; cc < 10; cc++) {
if (aa!= cc && bb!= cc)
{
for (var dd = 0; dd < 10; dd++) {
if (aa != dd && bb != dd && cc != dd)
{
nums[pos++] = aa;
nums[pos++] = bb;
nums[pos++] = cc;
nums[pos++] = dd;
}
}
}
}
}
}
}
//form1.c.value = getgetNextSeed();
function func()
{

total++
var acount =form1.a.value;
var bcount = form1.b.value;
if(total>1)
setGuessReuslt(acount, bcount);
var guestNum = getgetNextSeed();
if(guestNum==true || acount==4)
{
alert("看,我猜对了吧,服不服,哈哈哈!!!");
if(acount==4)
form1.d.value=form1.c.value;
return true;
}
else
{
form1.c.value=guestNum;
alert("第"+total+"次,我猜:"+guestNum);
}
}
function setGuessReuslt(x,y)
{
if (x == 4) {
return;
}
for (var pos = 0; pos < 5040; pos++) {
if (isValid[pos])
{
var numspos = pos * 4;
if (getMyX(pos) != x) {
isValid[pos] = false;
continue;
}
if (getMyY(pos) != y) {
isValid[pos] = false;
continue;
}
}
}
}
function getMyX(pos)
{
var myx = 0;
pos *= 4;
if (nums[pos++] == a)
myx++;
if (nums[pos++] == b)
myx++;
if (nums[pos++] == c)
myx++;
if (nums[pos++] == d)
myx++;
return myx;
}
function getMyY(pos) {
var myy = 0;
pos *= 4;
if (nums[pos] == b || nums[pos] == c || nums[pos] == d)
myy++;
if (nums[pos + 1] == a || nums[pos + 1] == c || nums[pos + 1] == d)
myy++;
if (nums[pos + 2] == a || nums[pos + 2] == b || nums[pos + 2] == d)
myy++;
if (nums[pos + 3] == a || nums[pos + 3] == b || nums[pos + 3] == c)
myy++;
return myy;
}
function getgetNextSeed()
{
var others = 0;
var pos = 0;
for (var i = 0; i < 5040; i++) {
if (isValid[i]) {
if (others > 0) {
others++;
break;
} else {
others++;
pos = i;
}
}
}

if (others == 0) {
alert("你是个赖皮狗,前面你回答错了,查查吧");
return false;
}

if (others == 1) {
var i = pos * 4;
alert("我猜这个数一定是" + nums[i++] + nums[i++] + nums[i++] + nums[i++])
form1.d.value=""+nums[i++] + nums[i++] + nums[i++] + nums[i++];
return true;
}

for (var i = 0; i < 5040; i++) {
if (isValid[i]) {
i =i*4;
a = nums[i];
b = nums[i + 1];
c = nums[i + 2];
d = nums[i + 3];
return (""+ nums[i++] + nums[i++] + nums[i++] + nums[i++]);
}
}
}
//-->
</SCRIPT>
littleboys 2007-12-20
  • 打赏
  • 举报
回复
改成javascript 实现了


改成javascript 实现了

<html>
<body>
<FORM METHOD=POST ACTION="" name="form1">
<button onclick="return func();">开始并计算</button>
<br>
<br>
我猜:<INPUT type="text" name="c">
条件A:<INPUT type="text" name="a" size="5">
条件B:<INPUT type="text" name="b" size="5">

你的数字是:<INPUT type="text" name="d">
</FORM>

</body>
</html>
<SCRIPT LANGUAGE="JavaScript">
<!--
var total = 0;
var isValid = new Array(5040);
for(var i=0;i<isValid.length;i++)
{
isValid[i]='true';
}
var nums = new Array(5040 * 4);
var pos = 0; //5040 * 4数组中的位置
var a, b, c, d;
for (var aa = 0; aa < 10; aa++) {
for (var bb = 0; bb < 10; bb++) {
if (aa != bb)
{
for (var cc = 0; cc < 10; cc++) {
if (aa!= cc && bb!= cc)
{
for (var dd = 0; dd < 10; dd++) {
if (aa != dd && bb != dd && cc != dd)
{
nums[pos++] = aa;
nums[pos++] = bb;
nums[pos++] = cc;
nums[pos++] = dd;
}
}
}
}
}
}
}
//form1.c.value = getgetNextSeed();
function func()
{

total++
var acount =form1.a.value;
var bcount = form1.b.value;
if(total>1)
setGuessReuslt(acount, bcount);
var guestNum = getgetNextSeed();
if(guestNum!=true)
{
form1.c.value=guestNum;
alert("第"+total+"次,我猜:"+guestNum);
}
else
{
alert("看,我猜对了吧,服不服,哈哈哈!!!");
return true;
}
}
function setGuessReuslt(x,y)
{
if (x == 4) {
return;
}
for (var pos = 0; pos < 5040; pos++) {
if (isValid[pos])
{
var numspos = pos * 4;
if (getMyX(pos) != x) {
isValid[pos] = false;
continue;
}
if (getMyY(pos) != y) {
isValid[pos] = false;
continue;
}
}
}
}
function getMyX(pos)
{
var myx = 0;
pos *= 4;
if (nums[pos++] == a)
myx++;
if (nums[pos++] == b)
myx++;
if (nums[pos++] == c)
myx++;
if (nums[pos++] == d)
myx++;
return myx;
}
function getMyY(pos) {
var myy = 0;
pos *= 4;
if (nums[pos] == b || nums[pos] == c || nums[pos] == d)
myy++;
if (nums[pos + 1] == a || nums[pos + 1] == c || nums[pos + 1] == d)
myy++;
if (nums[pos + 2] == a || nums[pos + 2] == b || nums[pos + 2] == d)
myy++;
if (nums[pos + 3] == a || nums[pos + 3] == b || nums[pos + 3] == c)
myy++;
return myy;
}
function getgetNextSeed()
{
var others = 0;
var pos = 0;
for (var i = 0; i < 5040; i++) {
if (isValid[i]) {
if (others > 0) {
others++;
break;
} else {
others++;
pos = i;
}
}
}

if (others == 0) {
alert("你是个赖皮狗,前面你回答错了,查查吧");
return false;
}

if (others == 1) {
var i = pos * 4;
alert("我猜这个数一定是" + nums[i++] + nums[i++] + nums[i++] + nums[i++])
form1.d.value=""+nums[i++] + nums[i++] + nums[i++] + nums[i++];
return true;
}

for (var i = 0; i < 5040; i++) {
if (isValid[i]) {
i =i*4;
a = nums[i];
b = nums[i + 1];
c = nums[i + 2];
d = nums[i + 3];
return (""+ nums[i++] + nums[i++] + nums[i++] + nums[i++]);
}
}
}
//-->
</SCRIPT>
littleboys 2007-12-20
  • 打赏
  • 举报
回复
有人用java 写的一个,应该可以的
有时间改成javascript 就应该可以了。

package com.ibm;

import java.io.BufferedReader;

//排除5040(10 * 9 * 8 * 7)种排列中的不可能的值,直到确定最后一个值解猜数字
public class Guess {

public static void main(String[] argv) throws Exception {
GuessNum gn = new GuessNum();

java.io.BufferedReader br = new BufferedReader(
new java.io.InputStreamReader(System.in, "GBK"));
int i = 1;
while (true) {
String guessSeed = gn.getNextSeed();
if (guessSeed.startsWith("我猜") || guessSeed.startsWith("你是")) {
System.out.println(guessSeed);
System.exit(0);
}

System.out.println();
System.out.println("我第" + i++ + "次猜, 这个数是" + guessSeed);
System.out.println("请你说位置及值都对的有几个?");
String s = br.readLine();
int a = Integer.parseInt(s);
if (a == 4) {
System.out.println("看,我猜对了吧,服不服,哈哈哈!!!");
System.exit(0);
}
System.out.println("请你说值对但位置不对的有几个?");
s = br.readLine();
int b = Integer.parseInt(s);
gn.setGuessReuslt(a, b);
}
}
}

class GuessNum {

boolean[] isValid; //是否有可能,为false时为不可能,true继续排除

int[] nums; //所有可能值,共5040 * 4长,每四个作一个可能值,上面的isValid记录这5040个可能性是否还有可能

int a, b, c, d; //上次猜测值,暂存

public GuessNum() {
isValid = new boolean[5040];
java.util.Arrays.fill(isValid, true); //刚开始时全有可能
nums = new int[5040 * 4];
int pos = 0; //5040 * 4数组中的位置

//初始化,把所有可能值的a, b, c, d位全按四个一组放入nums中
for (int a = 0; a < 10; a++) {
for (int b = 0; b < 10; b++) {
if (a == b)
continue;
for (int c = 0; c < 10; c++) {
if (a == c || b == c)
continue;
for (int d = 0; d < 10; d++) {
if (a == d || b == d || c == d)
continue;
nums[pos++] = a;
nums[pos++] = b;
nums[pos++] = c;
nums[pos++] = d;
}
}
}
}
}

/**
* 得到下一个猜测目标,如果没有了可能性,证明操作者前面输入错误,如果可能性只有一,立即确定
* @return
*/
public String getNextSeed() {
int others = 0;
int pos = 0;
for (int i = 0; i < 5040; i++) {
if (isValid[i]) {
if (others > 0) {
others++;
break;
} else {
others++;
pos = i;
}
}
}

if (others == 0) {
return "你是个赖皮狗,前面你回答错了,查查吧";
}

if (others == 1) {
int i = pos * 4;
return "我猜这个数一定是" + nums[i++] + nums[i++] + nums[i++] + nums[i++];
}

for (int i = 0; i < 5040; i++) {
if (isValid[i]) {
i *= 4;
a = nums[i];
b = nums[i + 1];
c = nums[i + 2];
d = nums[i + 3];
return new StringBuffer().append(nums[i++]).append(nums[i++])
.append(nums[i++]).append(nums[i++]).toString();
}
}

//理论上不可能到这一步
throw new java.lang.RuntimeException("你是个赖皮狗,前面你回答错了,查查吧");
}

//设置操作者的反馈(x 个 a, y 个 b)
public void setGuessReuslt(int x, int y) {
if (x == 4) {
return;
}
for (int pos = 0; pos < 5040; pos++) {
if (!isValid[pos])
continue;
int numspos = pos * 4;
if (getMyX(pos) != x) {
isValid[pos] = false;
continue;
}
if (getMyY(pos) != y) {
isValid[pos] = false;
continue;
}
}
}

//测试,把每个可能值都与上次猜测值比较,就会得到这个可能值与猜测值是几个a的关系
private int getMyX(int pos) {
int myx = 0;
pos *= 4;
if (nums[pos++] == a)
myx++;
if (nums[pos++] == b)
myx++;
if (nums[pos++] == c)
myx++;
if (nums[pos++] == d)
myx++;
return myx;
}

//测试,把每个可能值都与上次猜测值比较,就会得到这个可能值与猜测值是几个b的关系
private int getMyY(int pos) {
int myy = 0;
pos *= 4;
if (nums[pos] == b || nums[pos] == c || nums[pos] == d)
myy++;
if (nums[pos + 1] == a || nums[pos + 1] == c || nums[pos + 1] == d)
myy++;
if (nums[pos + 2] == a || nums[pos + 2] == b || nums[pos + 2] == d)
myy++;
if (nums[pos + 3] == a || nums[pos + 3] == b || nums[pos + 3] == c)
myy++;
return myy;
}
}

Carignano 2007-12-19
  • 打赏
  • 举报
回复
忘记说明了
t是尝试的次数
a是完全匹配
b是位置错误但是字匹配
d是生成的随机数
u是你自己去输入的

简陋了点,将就看吧
Carignano 2007-12-19
  • 打赏
  • 举报
回复


<html>
<head>
<script language='javascript'>
<!--
var n;
var t = 0;
function resetGame()
{
n = '';

var _s = ['0','1','2','3','4','5','6','7','8','9'];

for(var i=0; i<4; i++)
{
_r = Math.floor(Math.random()*_s.length);
_n = _s[_r];
n += _n;

_h = _s.toString();
_h = _h.replace(/,/gi, '');
_h = _h.replace(_n, '');
_s = _h.split('');
}

document.getElementById('d').value = n;
document.getElementById('t').value = t;

document.getElementById('g').disabled = '';
}

function gamble()
{
t ++;
document.getElementById('t').value = t;

var a = 0;
var b = 0;

var _u = document.getElementById('u').value.split('');
var _d = n.split('');
for (var i=0; i<4; i++)
{
if (n.indexOf(_u[i]) != -1)
{
b++;
if (_u[i] == _d[i]){ a++; b--; }
}

}

if (a == 4) alert('win!');

document.getElementById('a').value = a;
document.getElementById('b').value = b;

if (t == 10)
{
document.getElementById('g').disabled = 'disabled';
}
}
-->
</script>
</head>
<body>
<input id='t' type='text' size='2' value='' readonly>
<br>
<input id='a' type='text' size='2' value='' readonly>
<br>
<input id='b' type='text' size='2' value='' readonly>
<br>
<input id='d' type='text' size='18' value='' readonly>
<br>
<input id='u' type='text' size='18' value=''>
<br>
<input id='r' type='button' value='reset' onclick='javascript:resetGame();'>
<input id='g' type='button' value='gamble' onclick='javascript:gamble();' disabled>
</body>
</html>




gs6fox 2007-12-19
  • 打赏
  • 举报
回复
文曲星上面的猜数游戏嘛,以前写过
dh20156 2007-12-19
  • 打赏
  • 举报
回复
如果一次出了多个正确的数字,该如何填写如A、B框?按什么规则?
michael200801 2007-12-19
  • 打赏
  • 举报
回复
up
iwillrockyou 2007-12-19
  • 打赏
  • 举报
回复
留名。。。
Uncle_higo 2007-12-19
  • 打赏
  • 举报
回复
36楼的c++代码 我编译通过 而且管用
CoffeeBubble 2007-12-19
  • 打赏
  • 举报
回复
看见个飞碟飞过.消失了.
zaokong 2007-12-19
  • 打赏
  • 举报
回复
鉴于你知错就改的态度,我支持一下.....厄..半下吧,完毕!
加载更多回复(36)

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧