[五星]程序开发一个石头剪刀布的人机对战程序

除了美化之外,还可以来尝试挑战一下任务
凹凸曼的马甲
帖子: 5
注册时间: 2011-07-08 17:59

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#31

帖子 凹凸曼的马甲 » 2011-10-20 21:05

人工智能的话有不同的各种算法啊...
各种启发思路...
要说简单的话很简单,
但是要说困难也很困难啊
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#32

帖子 月下叹逍遥 » 2011-10-20 21:12

果然VS2010的结果和gcc一样,看来还是要重新设计一下算法。。。
浮生七十今三十,从此凄惶未可知
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#33

帖子 月下叹逍遥 » 2011-10-21 11:11

好吧,估计是加权的算法有问题。。。
浮生七十今三十,从此凄惶未可知
ubuntu606
帖子: 624
注册时间: 2007-07-14 17:04

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#34

帖子 ubuntu606 » 2011-10-21 11:43

这个有意思,收藏,研习
头像
liu滔
帖子: 7212
注册时间: 2010-10-09 23:01

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#35

帖子 liu滔 » 2011-10-21 19:27

呵呵,我来贡献一个Common Lisp版本的,尽管没什么人工智能的成份在里面 :em06

[lisp]
(defparameter *policy-probability*
'(("石头" . 0)
("剪刀" . 0)
("布" . 0)))

(defun find-max (alist)
(if (null alist)
(error "这是个空表,你耍我啊?")
(if (null (cdr alist))
(car alist)
(let ((head (car alist))
(tail (find-max (cdr alist))))
(if (> (cdr head)
(cdr tail))
head
tail)))))

(defun computer-policy ()
(car (rassoc (car (find-max *policy-probability*))
*judge-table* :test #'string=)))

(defparameter *judge-table*
'(("石头" . "剪刀")
("剪刀" . "布")
("布" . "石头")))

(defun judge (user computer)
(incf (cdr (assoc user *policy-probability* :test #'string=)))
(cond ((equal computer (cdr (assoc user *judge-table* :test #'string=)))
"你赢了")
((equal user (cdr (assoc computer *judge-table* :test #'string=)))
"你输了")
(t
"双方平手")))

(defun start ()
(format t "请输入你的决定,我保证电脑没有作弊:")
(force-output)
(let ((user (read-line)))
(if (not (member user '("石头" "剪刀" "布") :test #'string=))
(progn
(format t "你丫的不好好出拳,给我认真点!~%")
(start)
(return-from start))
(let ((computer (computer-policy)))
(format t "~A对~A,~A~%" user computer
(judge user computer)))))
(format t "继续玩不?(是/否)~%")
(force-output)
(if (string= "是" (read-line))
(start)))
[/lisp]

算法很简单,就是记录每一次用户的出拳,然后增加次数,当电脑要出拳时,就先在已知的数据中查找次数最多的一种

拳,然后找出相应的克星就行了,挺白痴的 :em02
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#36

帖子 月下叹逍遥 » 2011-10-21 21:25

改一下,虽然智能差了一点,但基本没bug了。。。 :em03
[c]#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void main()
{
srand((unsigned)time(NULL));
int xx[3][3]={{0,-1,1},{1,0,-1},{-1,1,0}};
int p,c,n=3,x1=1,x2=1,x3=1,k;
float l=0.0,t;
printf("1,剪子;2,包袱;3,锤;0,退出:\n");
do
{
printf("请输入你的结果:");
scanf("%d",&p);
c=rand()%3+1;
t=c/3.0;
if(t<(1.0*x1/n))
c=3;
else
{
if(t>(1.0*(x2+x1)/n))
c=2;
else
c=1;
}
switch(p)
{
case 0:break;
case 1:k=xx[c-1][p-1];x1++;n++;break;
case 2:k=xx[c-1][p-1];x2++;n++;break;
case 3:k=xx[c-1][p-1];x3++;n++;break;
default:
printf("输入有误,请重新输入:\n");break;
}
switch(k)
{
case 1:printf("你赢了!\n"),l++;break;
case -1:printf("你输了!\n");break;
case 0:printf("平局!\n");break;
}
}while(p!=0);
printf("一共进行了%d场比赛,胜率为:%f.\n",n,l/n);
}[/c]
浮生七十今三十,从此凄惶未可知
头像
liu滔
帖子: 7212
注册时间: 2010-10-09 23:01

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#37

帖子 liu滔 » 2011-10-21 21:45

俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧 :em09
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#38

帖子 月下叹逍遥 » 2011-10-21 21:48

liu滔 写了:俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧 :em09
C语言王道。。。
浮生七十今三十,从此凄惶未可知
头像
liu滔
帖子: 7212
注册时间: 2010-10-09 23:01

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#39

帖子 liu滔 » 2011-10-21 23:07

月下叹逍遥 写了:
liu滔 写了:俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧 :em09
C语言王道。。。
其实我也觉得,因为我也是会C语言的 :em09

学会了C语言和掌握了Lisp,那么就可以从机器的角度和抽象的角度看待程序了~~~
头像
dryland718
帖子: 287
注册时间: 2011-08-17 12:54

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#40

帖子 dryland718 » 2011-10-22 21:38

纯c行不行。。
头像
liu滔
帖子: 7212
注册时间: 2010-10-09 23:01

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#41

帖子 liu滔 » 2011-10-22 22:10

dryland718 写了:纯c行不行。。
当然行啊,不限编程语言啊,而且上面就有纯C啦~~~ :em09
头像
月下叹逍遥
论坛版主
帖子: 33994
注册时间: 2010-10-07 14:23
系统: Archdows10
来自: 某系某星某洲某国某省某市
联系:

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#42

帖子 月下叹逍遥 » 2011-10-22 22:11

liu滔 写了:
dryland718 写了:纯c行不行。。
当然行啊,不限编程语言啊,而且上面就有纯C啦~~~ :em09
浮生七十今三十,从此凄惶未可知
头像
liu滔
帖子: 7212
注册时间: 2010-10-09 23:01

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#43

帖子 liu滔 » 2011-10-22 22:23

月下叹逍遥 写了:
liu滔 写了:
dryland718 写了:纯c行不行。。
当然行啊,不限编程语言啊,而且上面就有纯C啦~~~ :em09
瞧南瓜乐的,说到自己了 :em04
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#44

帖子 oneleaf » 2011-10-24 10:33

有个参数可以考虑进去,就是输赢状态,当上一把的输赢状态不同时,人的决策也会不一样。
如果可以根据目前输赢状态和次数加上习惯来计算下一把的概率,就最好了。
头像
prettysnail
帖子: 198
注册时间: 2007-03-07 9:35

Re: [五星]程序开发一个石头剪刀布的人机对战程序

#45

帖子 prettysnail » 2011-10-31 10:34

oneleaf 写了:有个参数可以考虑进去,就是输赢状态,当上一把的输赢状态不同时,人的决策也会不一样。
如果可以根据目前输赢状态和次数加上习惯来计算下一把的概率,就最好了。
这个很有意思,空了加上去试试。 :em11
回复