[五星]程序开发一个石头剪刀布的人机对战程序
-
- 帖子: 5
- 注册时间: 2011-07-08 17:59
Re: [五星]程序开发一个石头剪刀布的人机对战程序
人工智能的话有不同的各种算法啊...
各种启发思路...
要说简单的话很简单,
但是要说困难也很困难啊
各种启发思路...
要说简单的话很简单,
但是要说困难也很困难啊
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
-
- 帖子: 624
- 注册时间: 2007-07-14 17:04
Re: [五星]程序开发一个石头剪刀布的人机对战程序
这个有意思,收藏,研习
- liu滔
- 帖子: 7212
- 注册时间: 2010-10-09 23:01
Re: [五星]程序开发一个石头剪刀布的人机对战程序
呵呵,我来贡献一个Common Lisp版本的,尽管没什么人工智能的成份在里面
[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]
算法很简单,就是记录每一次用户的出拳,然后增加次数,当电脑要出拳时,就先在已知的数据中查找次数最多的一种
拳,然后找出相应的克星就行了,挺白痴的
[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]
算法很简单,就是记录每一次用户的出拳,然后增加次数,当电脑要出拳时,就先在已知的数据中查找次数最多的一种
拳,然后找出相应的克星就行了,挺白痴的
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
Re: [五星]程序开发一个石头剪刀布的人机对战程序
改一下,虽然智能差了一点,但基本没bug了。。。
[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]
[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: [五星]程序开发一个石头剪刀布的人机对战程序
俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
Re: [五星]程序开发一个石头剪刀布的人机对战程序
C语言王道。。。liu滔 写了:俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧
浮生七十今三十,从此凄惶未可知
- liu滔
- 帖子: 7212
- 注册时间: 2010-10-09 23:01
Re: [五星]程序开发一个石头剪刀布的人机对战程序
其实我也觉得,因为我也是会C语言的月下叹逍遥 写了:C语言王道。。。liu滔 写了:俺的可是人工智能领域的当家语言哦,大家好好欣赏一下伟大的Lisp语言的奇特的表达方式吧
学会了C语言和掌握了Lisp,那么就可以从机器的角度和抽象的角度看待程序了~~~
- dryland718
- 帖子: 287
- 注册时间: 2011-08-17 12:54
Re: [五星]程序开发一个石头剪刀布的人机对战程序
纯c行不行。。
- liu滔
- 帖子: 7212
- 注册时间: 2010-10-09 23:01
Re: [五星]程序开发一个石头剪刀布的人机对战程序
当然行啊,不限编程语言啊,而且上面就有纯C啦~~~dryland718 写了:纯c行不行。。
- 月下叹逍遥
- 论坛版主
- 帖子: 33994
- 注册时间: 2010-10-07 14:23
- 系统: Archdows10
- 来自: 某系某星某洲某国某省某市
- 联系:
- liu滔
- 帖子: 7212
- 注册时间: 2010-10-09 23:01
Re: [五星]程序开发一个石头剪刀布的人机对战程序
瞧南瓜乐的,说到自己了月下叹逍遥 写了:liu滔 写了:当然行啊,不限编程语言啊,而且上面就有纯C啦~~~dryland718 写了:纯c行不行。。
- oneleaf
- 论坛管理员
- 帖子: 10448
- 注册时间: 2005-03-27 0:06
- 系统: Ubuntu 12.04
Re: [五星]程序开发一个石头剪刀布的人机对战程序
有个参数可以考虑进去,就是输赢状态,当上一把的输赢状态不同时,人的决策也会不一样。
如果可以根据目前输赢状态和次数加上习惯来计算下一把的概率,就最好了。
如果可以根据目前输赢状态和次数加上习惯来计算下一把的概率,就最好了。
- prettysnail
- 帖子: 198
- 注册时间: 2007-03-07 9:35
Re: [五星]程序开发一个石头剪刀布的人机对战程序
这个很有意思,空了加上去试试。oneleaf 写了:有个参数可以考虑进去,就是输赢状态,当上一把的输赢状态不同时,人的决策也会不一样。
如果可以根据目前输赢状态和次数加上习惯来计算下一把的概率,就最好了。