五子棋的课程设计(通用6篇)
篇1:五子棋的课程设计
《Java语言程序设计》
课程设计报告
学 院: 信息科学技术学院 班 级: 软件技术2班 姓 名: 王更新 学 号: 1108900505 指导教师: 郭韶升 课设时间: 2014-03-17 至2014-03-26
二O一四 年 三月 二十六 日
目 录
一、设计要求…………………………………………....2
二、设计步骤…………………………………………....2 2.1程序流程图………………………….…………...2 2.2程序的功能分配……………………….………...3
三、设计正文…………………………………………....6 3.1创建棋盘类……………………………………….6 3.2判断输赢功能实现……………………………….9 3.3测试结果……………………………………….....9
四、心得体会…………………………………………...12
五、参考文献…………………………………………...12 附录(源代码)……………………………………….13
一、课程设计要求
设计一个15╳15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能: 1.选择落子的先后顺序 2.重置棋盘 3.刷新重新开始 4.退出提示
并且规定退出者判为负,但退出过程中要有提示。以防不小心点错了。最后判断某一方是否为五子连珠。
实现一个简单的多用户五子棋的游戏程序,包括如下两个界面(1)选择对弈桌(执黑、执白)。
(2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负);
二、设计步骤
2.1程序流程图
2.2 程序的功能分配
a.棋盘的绘制
public void draw_qipan(Graphics G)//画棋盘 15*15{
G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);
G.setColor(Color.black);
for(int i=1;i<16;i++){
G.drawLine(20,20*i,300,20*i);
G.drawLine(20*i,20,20*i,300);
} } b.添加按钮
Button b1=new Button(“开始”);Button b2=new Button(“重置游戏”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);public void init(){
ckbHB[0]=new Checkbox(“执白”,ckgHB,false);
ckbHB[1]=new Checkbox(“执黑”,ckgHB,false);
ckbHB[2]=new Checkbox(“观看”,ckgHB, false);}
c.鼠标棋子的触发事件
public void mouseClicked(MouseEvent e){
Graphics g=getGraphics();
int x1,y1;
x1=e.getX();
y1=e.getY();
if(e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){
return;
}
if(x1%20>10){
x1+=10;
}
if(y1%20>10){ y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);}
d.按钮的触发事件
public void actionPerformed(ActionEvent e){
Graphics g=getGraphics();
if(e.getSource()==b1){
Game_start();
}
else{
Game_re();
}
if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+“输了!”);
intGame_Start=0;
}
e.判断落子的位置及画出相应的黑白棋子 public void set_Qizi(int x,int y)//落子{
if(intGame_Start==0)//判断游戏未开始{
return;
}
if(intGame_Body[x/20][y/20]!=0){
return;
}
Graphics g=getGraphics();
if(color_Qizi==1)//判断黑子还是白子{
g.setColor(Color.black);
color_Qizi=0;
}
else{
g.setColor(Color.white);
color_Qizi=1;
}
g.fillOval(x-10,y-10,20,20);
intGame_Body[x/20][y/20]=color_Qizi+1;}
f.判断胜负
if(Game_win_1(x/20,y/20))//判断输赢1{
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;
}
if(Game_win_2(x/20,y/20))//判断输赢2{
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;} if(Game_win_3(x/20,y/20))//判断输赢3{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);intGame_Start=0;} if(Game_win_4(x/20,y/20))//判断输赢4{ lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;} }
三、设计正文
3.1创建棋盘类
Public class WcyChess extends Applet ActionListener,MouseListener,MouseMotionListener,ItemListener{ int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子
int intGame_Start=0;//游戏开始标志 0未开始 1游戏中
int intGame_Body[][]=new int[16][16];//设置棋盘棋子状态
int m=-1;Button b1=new Button(“开始”);Button b2=new Button(“重置游戏”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);CheckboxGroup ckgHB=new CheckboxGroup();NetchatClient chat=new NetchatClient();public void init(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=new Checkbox(“执白”,ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=new Checkbox(“执黑”,ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
ckbHB[2]=new Checkbox(“观看”,ckgHB, false);
add(ckbHB[0]);
add(ckbHB[1]);
add(ckbHB[2]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,180,80,30);
lblWin.setBackground(Color.red);
lblWin.setText(“胜利者!”);//没有显示?
ckbHB[2].setBounds(440, 20,60, 30);
add(exist);
exist.setBounds(330,130,80,30);
implements
//
exist.addActionListener(this);add(chat);chat.setBounds(20, 500, 300, 300);chat.frame();chat.setVisible(true);Game_start_csh();setSize(500,600);setVisible(true);} public void itemStateChanged(ItemEvent e){ if(ckbHB[0].getState())//选择黑子还是白子{
color_Qizi=0;} else{
color_Qizi=1;} } public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e){ Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if(e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){
return;} if(x1%20>10){
x1+=10;} if(y1%20>10){
y1+=10;} x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1);} public void actionPerformed(ActionEvent e){ Graphics g=getGraphics();if(e.getSource()==b1){
Game_start();} else {
Game_re();}
} if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+“输了!”);
intGame_Start=0;} } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void paint(Graphics g){ draw_qipan(g);
3.2判断输赢功能实现
if(Game_win_1(x/20,y/20)){ //判断输赢1
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;} if(Game_win_2(x/20,y/20)){ //判断输赢2
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;}
if(Game_win_3(x/20,y/20))//判断输赢3{
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;}
if(Game_win_4(x/20,y/20))//判断输赢4{
lblWin.setText(Get_qizi_color(color_Qizi)+“赢了!”);
intGame_Start=0;}
3.3 测试结果
a.进入游戏界面
游戏开始的界面有三个选择项,用户可以选择相应的角色,选择 完毕后点击开始进入游戏。
b.选择角色,开始下棋
首先达到五个棋子连在一块的赢了,并在红色区域显示谁赢了!c.下完后,重新开始
下完一盘后游戏停止,点击重新开始,界面回到初始界面,选择角色继续游戏.d.游戏中点退出,自动判输
在下棋的过程当中谁中途退出,即点击退出,系统自动判断谁输
四、课程设计心得体会
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。
五、参考文献
1.吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社 2.柳西玲.许斌编著.Java语言应用开发基础.北京:清华大学出版社 3.丁振凡 Java 语言实用教程 :北京邮电大学出版社
附录(源代码)
import java.net.*;import java.io.*;import java.applet.*;import java.awt.*;import java.awt.event.*;import java.applet.Applet;import java.awt.Color;Public class wuziqi extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{ int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子 int intGame_Start=0;//游戏开始标志 0未开始 1游戏中
int intGame_Body[][]=new int[16][16];//设置棋盘棋子状态
int m=-1;Button b1=new Button(“开始”);Button b2=new Button(“重新开始”);Label lblWin=new Label(“ ”);Checkbox ckbHB[]=new Checkbox[3];Button exist = new Button(“退出”);CheckboxGroup ckgHB=new CheckboxGroup();public void init(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=new Checkbox(“执白”,ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=new Checkbox(“执黑”,ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
ckbHB[2]=new Checkbox(“观看”,ckgHB, false);
add(ckbHB[0]);
add(ckbHB[1]);
add(ckbHB[2]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,180,80,30);
lblWin.setBackground(Color.red);
e.getY()<20 || e.getY()>300){
lblWin.setText(“胜利者!”);//没有显示?
ckbHB[2].setBounds(440, 20,60, 30);add(exist);
exist.setBounds(330,130,80,30);exist.addActionListener(this);Game_start_csh();setSize(500,600);setVisible(true);}
public void itemStateChanged(ItemEvent e){ if(ckbHB[0].getState())//选择黑子还是白子 {
color_Qizi=0;} else {
color_Qizi=1;} }
public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e){ Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();
if(e.getX()<20 || e.getX()>300 ||
return;}
if(x1%20>10){
x1+=10;}
if(y1%20>10){
y1+=10;}
x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);m*=(-1)}
public void actionPerformed(ActionEvent e){ Graphics g=getGraphics();if(e.getSource()==b1){
Game_start();
} else{
// 输了!“);
赢了!”);
Game_re();}
if(e.getSource()==exist){
Game_re();
color_Qizi=m;
lblWin.setText(Get_qizi_color(color_Qizi)+“
intGame_Start=0;
}
}
public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void paint(Graphics g){ draw_qipan(g);}
public void set_Qizi(int x,int y){ //落子
if(intGame_Start==0){//判断游戏未开始
return;}
if(intGame_Body[x/20][y/20]!=0){
return;}
Graphics g=getGraphics();
if(color_Qizi==1){//判断黑子还是白子
g.setColor(Color.black);
color_Qizi=0;} else{
g.setColor(Color.white);
color_Qizi=1;}
g.fillOval(x-10,y-10,20,20);
intGame_Body[x/20][y/20]=color_Qizi+1;if(Game_win_1(x/20,y/20)){ //判断输赢1 lblWin.setText(Get_qizi_color(color_Qizi)+”
intGame_Start=0;
了!“);
赢了!”);
赢了!“);
15*15
}
if(Game_win_2(x/20,y/20)){ //判断输赢2{
lblWin.setText(Get_qizi_color(color_Qizi)+”赢
intGame_Start=0;}
if(Game_win_3(x/20,y/20)){ //判断输赢3
lblWin.setText(Get_qizi_color(color_Qizi)+“
intGame_Start=0;}
if(Game_win_4(x/20,y/20)){ //判断输赢4
lblWin.setText(Get_qizi_color(color_Qizi)+”
intGame_Start=0;} }
public String Get_qizi_color(int x){
if(x==0){
return “黑子”;} else {
return “白子”;} }
public void draw_qipan(Graphics G){ //画棋盘 G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);G.setColor(Color.black);for(int i=1;i<16;i++){
G.drawLine(20,20*i,300,20*i);
G.drawLine(20*i,20,20*i,300);} }
public void Game_start(){ //游戏开始
intGame_Start=1;
Game_btn_enable(false);
b2.setEnabled(true);} public void Game_start_csh(){//游戏开始初始化
intGame_Start=0;
Game_btn_enable(true);
b2.setEnabled(false);
ckbHB[0].setState(true);
for(int i=0;i<16;i++){
for(int j=0;j<16;j++){
intGame_Body[i][j]=0;
}
}
lblWin.setText(“");} public void Game_re(){ //重新开始游戏
repaint();
Game_start_csh();} public void Game_btn_enable(boolean e){ //设置组件状态
b1.setEnabled(e);
b2.setEnabled(e);
ckbHB[0].setEnabled(e);
ckbHB[1].setEnabled(e);} public boolean Game_win_1(int x,int y){ //横向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for(int i=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(int i=1;i<5;i++){
if(x1<1){){
t+=1;
}
else{
break;
}
}
if(t>4){
return true;
}
else{
return false;
} } public boolean Game_win_2(int x,int y){ //纵向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for(int i=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(int i=1;i<5;i++){
if(x1<1){
break;
}
if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){
t+=1;
}
break;
}
if(intGame_Body[x1-i][y1]==intGame_Body[x][y]
else{
break;
}
}
if(t>4){
return true;
}
else{
return false;
} } public boolean Game_win_3(int x,int y){ //左斜判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for(int i=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(int i=1;i<5;i++){
if(x1<1){
break;
}
if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if(t>4){
return true;
}
else{
return false;
} } public boolean Game_win_4(int x,int y){ //左斜判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for(int i=1;i<5;i++){
if(x1>15){
break;
}
if(intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for(int i=1;i<5;i++){
if(x1<1){
break;
} if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if(t>4){
return true;
}
else{
return false;
} } }
篇2:五子棋的课程设计
课题名称: 五子棋
姓名: X X 学号:114304xxxx 课题负责人名(学号): X X114304xxxx 同组成员名单(学号、角色): x x1143041325 XXX1143041036
指导教师: 张建州 评阅成绩: 评阅意见:
提交报告时间:2014年 1 月 9 日 课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
五子棋
计算机科学与技术 专业 学生 XXX 指导老师
张建州
[摘要] 人类之所以不断在进步,是因为我们人类一直不断的在思考,五子棋游戏程序的开发符合人类进步也是促进人类进步的一大动力之一。五子棋游戏程序让人们方便快捷的可以下五子棋,让人们在何时都能通过下棋来提高逻辑思维能力,同时也培养儿童的兴趣以及爱好,让孩子更加聪明。
同时,五子棋游戏程序的开发也使得五子棋这个游戏得到了广泛的推广,让世界各地的人们知道五子棋,玩上五子棋,这已经不是局限。五子棋游戏程序使得越来越多的人喜欢上了五子棋,热爱下五子棋,它是具有很好的带动性的。
关键词:五子棋
进步
思考
-1-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
目录
《人工智能导论》课程报告..................................................................................0 1 引言.....................................................................................................................3
1.1 五子棋简介...........................................................................................3 1.2 五子棋游戏的发展与现状......................................................................3 2 研究问题描述......................................................................................................4
2.1 问题定义...................................................................................................4 2.2 可行性研究...............................................................................................4 2.3 需求分析...................................................................................................5 2.4 总体设计...................................................................................................5 2.5 详细设计...................................................................................................6 2.6编码和单元测试........................................................................................6 3 人工智能技术......................................................................................................6 4 算法设计.............................................................................................................7
4.1α-β剪枝算法.............................................................................................7 4.2极大极小树................................................................................................7 4.3深度优先搜索(DFS).............................................................................8 4.4静态估值函数............................................................................................9 5 软件设计和实现..................................................................................................9
5.1 数据结构定义...........................................................................................9 5.2 程序流程图.............................................................................................17 6 性能测试...........................................................................................................18
6.1 程序执行结果.........................................................................................18 7 总结...................................................................................................................21 参考文献...............................................................................................................21
-2-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 1 引言
1.1 五子棋简介
五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。已在各个游戏平台有应用。
古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(17×17)棋盘,至南北朝时即已流行十九路(19×19)棋盘,直至1931年出现所谓五子棋专用棋盘。
1.2 五子棋游戏的发展与现状
目前,连珠这一棋类运动已迅速在国际上发展起来。外国人都十分看好这一不起眼的智力游戏,并认为五子棋不仅能提高思维、开发智力、手脑并用、修身养性 而且富含哲理,具有东方的神秘和西方的直观,是中西文化的交汇点。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称之为“情侣棋”,言下之意是情人之间下五子棋有利于增加情感的交流;欧洲人称之为“中老年棋”,表示五子棋适合中老年人的生理特点和思维方式;美洲人喜欢将五子棋称之为“商业棋”,就是说商人谈生意时可一边下棋一边谈生意,棋下完了生意也谈成了。由此可见,尽管国度不同,语言各异,但人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,增进友谊。
当前,有40多个国家和地区都在下五子棋,并有各种规模和级别的比赛。1989年8月在日本京都、1991年8月在俄罗斯联邦的莫斯科、1993年8月在瑞典、1995年8月在爱沙尼亚的塔林分别举行了第一、二、三、四届世界锦标赛。除第三届的冠军是爱沙尼亚人之外,其余三届的冠军都是日本人。五子棋 的世界锦标赛,每两年举办一次,其申国竞争也十分激烈。日本目前拥有自己的五子棋职业棋手,并且对连珠(五子棋)技术的研究也相当普遍和全面,就水平也正在日益增强。同时,五子棋的理论研究与探索也呈现蓬勃发展的势头,从1858年第一部五子棋专著问世以来,目前,全世界有2000多种五子棋的书籍及期刊,分别以日文、俄文、英文、瑞典文及中文出版发行。五子棋在我国的北京、上海、天津、云南、浙江、广东、四川、湖北、辽宁、新疆、河北等省(区)市都有很大的发展。北京多次举办了北京地区的五子棋赛,如“思曼杯”、“京空杯”、“奇奇童杯”、“北京第六届民族团结杯”和“北京第四岂民族运动会”的五子棋比赛。上海地区举办了“上文杯”五子棋大赛。云南省以及其他省市亦举办过许多五子棋比赛。所有这些赛事都越来越多地吸引了无数人的关注,表明了根植于中国的五子棋有着广泛的群众基础,-3-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 是群众喜闻乐见的体育活动。
而现在,很多很多游戏平台上面都有五子棋游戏供我们玩,任何游戏平台上面只要有棋牌类游戏的,那么它就有五子棋在里面,网络五子棋比赛,在联众,263,QQ游戏,UC里进行了10几年了可见,五子棋游戏在网络上面是非常火暴的,而且在棋牌游戏里面玩家人数排名总会占到很前面,不愧是风靡全球的棋牌游戏啊!在未来中,将会有越来越多的人关注五子棋,喜欢五子棋,那么将其变为商业化也会越来越多,而且还可以以教育孩子的方式来将其嵌套进去,或者用来做测试等等,可以说以后的五子棋游戏会是那么的精彩,那么的让人憧憬。那么对于它的游戏开发和发展也将会上升到举足轻重的地位去,它的发展会是相当之快的,就让我们拭目以待吧。研究问题描述
2.1 问题定义
问题定义的一个的关键问题是“要解决的问题是什么”,这个是这个阶段必须要明确要回答的问题。在没将问题定义好,试图准备下个阶段的任务。这明显是不成熟,甚至不可能的事。
本次系统设计中首先明确了需要解决的问题是五子棋AI算法,基本的要求是设计一款能够实现人机对战、人人对战和禁手的五子棋游戏,提供一些基本的操作如退出系统,向后悔棋等操作,重点是放在AI算法的研究。而并不是美工设计,也不是为了提供各种操作丰富的接口。主要是通过这种可视化的界面探讨AI,当然增加可玩性和美工会给系统润色不少。
上面只是很粗略的明确大概的方向,严格按照软件工程的方法这个阶段需要生产一份书面报告。需要通过对系统的实际用户访问调查,扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不精的地方,改正理解不正确的地方,最后得出一份双方都满意的文档。本系统的需求很少也很明显了。
2.2 可行性研究
这个阶段要回答的关键问题:“对于上一个阶段所确定的问题是否可行?”为了回答这个问题,我们需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。
可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。
可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。可行性研
-4-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 究以后的那些阶段将需要投入要多的人力物力。及时中止不值得投资的工程项目,可以避免更大的浪费。
根据这些基本的概念,我在技术上主要是通过相关文档资料的查找后确定可行性,凭着大学期间打下厚实的专业科基础,特别是数据结构和算法,能够在这段时间理解通透并应该有所改进,后来证明是对的。利用剩下时间也应该来说也比较充裕的。经济上暂不考虑。
下面主要从技术上进行分析:
工具: Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。所以用java来编写是一个很好的选择。
算法:在这图论搜索技术这方面,前人已有很成熟的算法。如粗糙的有深度优先算法(DFS)和广度优先算法(BFS)这两个基本的算法,关键需要解决的是能够设计出一种高效的剪枝函数,减小搜索问题的规模。目前博弈类游戏中的人工智能基本都采用极大极小值方法这对我来说是个挑战,而剪枝的则采用Alpha-Beta,通过丰富的文档资料初步了解到这些技术已经很成熟了。我们有信心能解决好这个问题。
2.3 需求分析
人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。今天的计算机程序已能够达到下各种方盘棋和国际象棋的锦标赛水平。但是,尚未解决包括人类棋手具有的但尚不能明确表达的能力。如国际象棋大师们洞察棋局的能力。另一个问题是涉及问题的原概念,在人工智能中叫做问题表示的选择,人们常能找到某种思考问题的方法,从而使求解变易而解决该问题。到目前为止,人工智能程序已能知道如何考虑它们要解决的问题,即搜索解答空间,寻找较优解答。
在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件,同时要提供人机和人人这样的功能,特别是人机部分,要考虑到不同级别的用户,电脑智能不能太低需要有一定的智能下棋功能等等。所以采用α-β剪枝法算法时就是为了达到这些目标。
2.4 总体设计
这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?”
-5-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 首先,应该考虑几种可能的解决方案。如,目标系统的一些主要功能是用计算机自动完成还是用人工完成;如果使用计算机,那么是使用批处理方式还是人机交互方式;信息存储使用传统的文件系统还是数据库„„。通常至少应该考虑下述几类可能的方案:
低成本的解决方案。系统只能完成最必要的工作,不能多做一点额处的工作。本系统的最基本要求就是能够实现必要的操作,其他额外的一些工作在后面完成
中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。
这个成本方案在完成上面的低成本方案后添加的。如增加保存棋局,美化界面,实现观看电脑与电脑之间的对战等功能。
高成本的“十全十美”的系统。这样的系统具有用户可能希望有的所有功能和特点。
结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。
2.5 详细设计
总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”
这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
2.6编码和单元测试
这个阶段的关键任务是根据以上阶段分析的软件模型,编写各个功能模块。
要注意的是程序的扩张性和可读性。以便以后软件的升级修改。同时要仔细的测试每个功能编写好的功能模块。人工智能技术
人工智能也就是所谓的AI(Artificial Intelligence),它是一门很抽象的技术,-6-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 AI程序的编写不需要依据任何既定的思考模式或者规则。尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作。我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力,而我们的所有的研究也应该围绕着这一方向。我们今天讨论的是策略类的人工智能。
策略类人工智能可以说是AI中比较复杂的一种,最常见的策略类AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。本课程设计是基于AI中α-β剪枝算法的五子棋的博弈游戏,下面让我们来具体介绍一下相关的内容。算法设计
4.1α-β剪枝算法
我们的程序主要是用α-β剪枝法实现的。其基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。具体的剪枝方法如下:
(1)对于一个与节点MIN,若能估计出其倒推值的上确界β,并且这个β值不大于 MIN的父节点(一定是或节点)的估计倒推值的下确界α,即α≥β,则就不必再扩展该 MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响 了)。这一过程称为α剪枝。
(2)对于一个或节点MAX,若能估计出其倒推值的下确界α,并且这个α值不小于 MAX的父节点(一定是与节点)的估计倒推值的上确界β,即α≥β,则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响 了)。这一过程称为β剪枝。
4.2极大极小树
目前绝大部分的博弈类游戏中的人工算法都采用这种方法。假设己方为MAX点,对方则为MIN点。如果当层的节点为奇数时那么就为MAX层,同样为偶数时就为MIN层。当在MAX层时,该层的值就应该为下一个MIN层中的最大一个的值。当在MIN层是,该层的值就应该为它子层MAX的最小的一个。通俗的说就是当轮到我方时,我们就应该选择一个最有利于我们的点,预测对方可能下的最有利他方的点(相对我方来说就是最坏的点)。这样反复计算下去就能够得到根节点的最大值,这个点也就是我们最佳下棋点。在计算这个点时可以很明显的看出这是一个不断递归的过程,到达叶子节点时根据相关
-7-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 的计算规则算出该值然后向上一层不断的返回。下图中矩形代表极大层,椭圆代表极小层。
4.3深度优先搜索(DFS)
在图论中有两个很重要的遍历的方法,一个是深度优先搜索(DFS),另外一个是广度优先搜索(BFS).这两个方法的主要区别在于下一个节点的选择。DFS首先选择它的连接节点,若它的下个节点已经全部被遍历过或者不存在的话。则向上返回到上一个节点,在遍历其他的未被访问过的点。很容易想到这要用到堆栈结构,使用一个递归来实现。而BFS则是逐个的遍历它的联接接点,将已经访问过的点放入队列中。然后再依次取出继续这个过程。
DFS遍历过程如下:
首先从A点出发访问它的领接点B,因为B的领接点C,F均未被访问过,所以B点选择C(当然也可以选择F点)作为下一个要访问的点,C点的领接点是D,F选择下个节点D,而D的邻接点只有一个E且未被访问过,就将E作为了它下个节点。这时因为E已经没有可访问的邻点,所以向上一层返回到D,发现D也已经没有可访问的点了,继续向上层返回到C,由于C的邻节点F未被访问过,那么就访问F。所以整个过程的遍历结果为:
-8-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 ABECFD。
BFS的遍历过程为ABECFD。
4.4静态估值函数
当极大极小树到达叶子节点时,需要估算一下当前盘面的值。这个就根据某个计算规则计算也即是估值函数。因为这个值是已经确定的所以称为静态。
当只有一个点时,并且相邻的无对方的棋子或者不是边界等“阻碍物” 就给他50,否则给予10。
当两个点时,并且相邻的无对方的棋子或者不是边界等“阻碍物”给予1000,若存在一方有“阻碍物”则给以100,否则给予10。
当是活三的时候给予3600,当存在一边被堵时,就给予500。否则给予10。当是活四的时候给以500000,当一边被堵时,给予50000。否则给予10 当是五连子的时候就给予最高分1000000。最后判断是否是己方的,若不是则给予负号。
静态估值函数会很严重的影响到算法的智能,所以可根据在下棋的过程中不断的做出调整,使其更加的合理。根据一些测试,这组静态估值函数能够很好的反映棋盘重要性指标。软件设计和实现
5.1 数据结构定义
本程序定义15*15的五子棋棋盘,实现算法,在算法中采用的数据结构包括:int isChessOn[][]描述当前棋盘,0表示黑子,1表示白字,2表示无子;int pre[][]用来记录棋点的x,y坐标。
由于本课程设计是基于Java语言开发的,在Java中只能用类来表示并实现所定义的数据结构。所以下面将用类来描述相应的数据结构及算法:
public class ChessPanel extends JPanel{ private ImageIcon map;
//棋盘背景位图
private ImageIcon blackchess;
//黑子位图
private ImageIcon whitechess;
//白子位图
public int isChessOn [][];
//棋局
protected boolean win = false;
// 是否已经分出胜负
protected int win_bw;
// 胜利棋色
protected int deep = 3, weight = 7;
// 搜索的深度以及广度
public int drawn_num = 110;
// 和棋步数
int chess_num = 0;
// 总落子数目
-9-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
public int[][] pre = new int[drawn_num + 1][2];
// 记录下棋点的x,y坐标
最多(drawn_num + 1)个
public int sbw = 0;
//玩家棋色黑色0,白色1
public int bw = 0;
// 当前应该下的棋色
0:黑色(默认),1:白色
// 边界值,用于速度优化
protected int x_max = 15, x_min = 0;
protected int y_max = 15, y_min = 0;
protected boolean able_flag = true;
// 是否选择禁手标志 0:无禁手
1:有禁手(默认
private int h;
//棋子长
private int w;
//棋子宽
private int insx;
//插入棋子的位置
private int insy;
private Point mousePoint;
//鼠标当前位置
private int winer;
//获胜方
private boolean humanhuman=false;
//是否是人人对弈
private int plast=0;
//走了几步了,public int BLACK_ONE;
//0表黑子
public int WHITE_ONE;
//1表白子
public int NONE_ONE;
//2表无子
public int N;
//棋盘边长
//---------搜索当前搜索状态极大值-//
//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝
//beta 祖先节点得到的当前最大最小值,用于beta 剪枝。
//step 还要搜索的步数
//return 当前搜索子树极大值
protected int findMax(int alpha, int beta, int step){
int max = alpha;
if(step == 0){
return evaluate();
}
int[][] rt = getBests(1sbw)== 1)
//电脑可取胜
return 100 *(getMark(1)+ step*1000);
isChessOn[x][y] = 11);
isChessOn[x][y] = 2;
// 还原预设边界值
x_min=temp1;
x_max=temp2;
y_min=temp3;
y_max=temp4;
if(t > max)
max = t;
//beta 剪枝
if(max >= beta)
return max;
}
return max;
}
//-----------------------搜索当前搜索状态极小值--//
//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝
//beta 祖先节点得到的当前最大最小值,用于beta 剪枝
//step 还要搜索的步数
//return 当前搜索子树极小值。
protected int findMin(int alpha, int beta, int step){
int min = beta;
if(step == 0){
return evaluate();
}
int[][] rt = getBests(sbw);
for(int i = 0;i < rt.length;i++){
int x = rt[i][0];
int y = rt[i][1];
int type = getType(x, y, sbw);
if(type == 1)
//玩家成5
return-100 *(getMark(1)+ step*1000);
// 预存当前边界值
int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;
isChessOn[x][y] = sbw;
resetMaxMin(x,y);
int t = findMax(alpha, min, stepbwf);
if(able_flag && bwf==0 &&(type_1 == 20 || type_1 == 21 || type_1 == 22))// 禁手棋位置,不记录
continue;
rt[n][0] = i;
rt[n][1] = j;
rt[n][2] = getMark(type_1)+ getMark(type_2);
n++;
-12-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
}
// 对二维数组排序
Arrays.sort(rt, new ArrComparator());
int size = weight > n? n:weight;
int[][] bests = new int[size][3];
System.arraycopy(rt, 0, bests, 0, size);
return bests;
} //----------------------------计算指定方位上的棋型-------------------//
// x,y 方向线基准一点。
//ex,ey 指定方向步进向量。
// k 棋子颜色,0:黑色,1:白色
// 该方向上的棋子数目 以及 活度
private int[] count(int x, int y, int ex, int ey, int bwf){
// 该方向没意义,返回0
if(!makesense(x, y, ex, ey, bwf))
return new int[] {0, 1};
// 正方向 以及 反方向棋子个数
int rt_1 = 1,rt_2 = 1;
// 总棋子个数
int rt = 1;
// 正方向 以及 反方向连子的活度
int ok_1 = 0,ok_2 =0;
// 总活度
int ok = 0;
// 连子中间有无空格
boolean flag_mid1 =false,flag_mid2 = false;
// 连子中间空格的位置
int flag_i1 = 1,flag_i2 = 1;
if(isChessOn[x][y]!= 2){
throw new IllegalArgumentException(“position x,y must be empty!..”);
}
int i;
// 往正方向搜索
for(i = 1;x + i * ex < 15 && x + i * ex >= 0 && y + i * ey < 15 && y + i * ey >= 0;i++){
if(isChessOn[x + i * ex][y + i * ey] == bwf)
rt_1++;
-13-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
// 位置为空,若中空标志为false,则记为中空并继续搜索
否则,break
else if(isChessOn[x + i * ex][y + i * ey] == 2){
if(!flag_mid1){
flag_mid1 = true;
flag_i1 = i;
}
else
break;
}
// 位置为对方棋子
else
break;
}
// 计算正方向活度,,// 最后一个位置不超过边界
if(x + i * ex < 15 && x + i * ex >= 0 && y + i * ey < 15 && y + i * ey >= 0){
// 最后一个位置为空位 +1活
if(isChessOn[x + i * ex][y + i * ey] == 2){
ok_1++;
// 若是在尾部检测到连续的空格而退出搜索,则不算有中空
if(rt_1 == flag_i1)
flag_mid1 = false;
// 若中空的位置在4以下 且 棋子数>=4,则这一边的4非活
if(flag_mid1 && rt_1 > 3 && flag_i1 < 4){
ok_1--;
}
}
// 最后一个位置不是空格,且搜索了2步以上,若前一个是空格, 则不算中空,且为活的边
else if(isChessOn[x + i * ex][y + i * ey]!= bwf && i >= 2)
if(isChessOn[x +(i-1)* ex][y +(i-1)* ey] == 2){
ok_1++;
flag_mid1 = false;
}
}
// 最后一个位置是边界
搜索了2步以上,且前一个是空格, 则不算中空,且为活的边
else if(i >= 2 && isChessOn[x +(i-1)* ex][y +(i-1)* ey] == 2){
-14-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
ok_1++;
flag_mid1 = false;
}
// 往反方向搜索
for(i = 1;xi * ex < 15 && yi * ey < 15;i++){
if(isChessOn[xi * ey] == bwf)
ey >= 0){
rt_2++;
else if(isChessOn[xi * ey] == 2){
if(!flag_mid2){
flag_mid2 = true;
flag_i2 = i;
}
else
break;
}
else
break;} // 计算反方向活度
if(xi * ex >= 0 && yi * if(isChessOn[xi * ey] == 2){
ok_2++;
if(rt_2 == flag_i2)
flag_mid2 = false;
if(flag_mid2 && rt_2 > 3 && flag_i2 < 4){
ok_2--;
} } else if(isChessOn[xi * ey]!= bwf && i >= 2)
if(isChessOn[x(i-1)* ey] == 2){
ok_2++;
flag_mid2 = false;
} } else if(i >= 2 && isChessOn[x(i-1)* ey] == 2){ ok_2++;flag_mid2 = false;}
课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
//------------------分析棋子类型
// 两边都没中空,直接合成
if(!flag_mid1 &&!flag_mid2){
rt = rt_1 + rt_21;
// 判断中间的纯连子数,在5以上,直接返回;为4,返回活4;
if(temp >= 5)
return new int[] {temp, 2};
if(temp == 4)
return new int[] {temp, 2};
// 先看有没死4,再看有没活3,剩下只能是死3
if(rt_1 + flag_i21 >= 4)
return new int[] {4, 1};
if(rt_1+flag_i2-1 == 3 && ok_1 > 0 || rt_2+flag_i1-1 == 3 && ok_2 > 0)
return new int[] {3, 2};
return new int[] {3, 1};
}
// 有一边有中空
else {
// 总棋子数少于5,直接合成if(rt_1 + rt_21, ok_1 + ok_2};
// 多于5,先找成5,再找活4,剩下的只能是死4
else {
if(flag_mid1 && rt_2 + flag_i11, ok_2 + 1};
if(flag_mid2 && rt_1 + flag_i21, ok_1 + 1};
if(flag_mid1 &&(rt_2 + flag_i11 == 4 && ok_1 == 1 || flag_i2 == 4))
-16-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
}
}
} return new int[] {4, 2};
return new int[] {4, 1};5.2 程序流程图
-17-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 6 性能测试
6.1 程序执行结果
1.初始界面
2.人机博弈
3.人人博弈
-18-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
4.禁手选择
5.悔棋选择
-19-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163
6.规则界面
-20-课程名称:人工智能原理及其应用 学生姓名:何兵 学生学号:1143041163 7 总结
本程序是使用α-β搜索的算法完成的一个简单的五子棋博弈游戏。虽然α-βAlpha-Beta已经尽力做到细致、全面,但由于α-β搜索存在博弈树算法中普遍存在的一个缺点¬一随着搜索层数的增加,算法的效率大大下降。所以该搜索的效率还是不怎么理想,五子棋程序的“智力”也不高。因此可以在上述程序的基础上,针对五子棋本身的特点和规律对α-β搜索算法进行优化与修正,比如用启发式搜索。还有就是虽然使用了禁手思维的算法,但是这并不能平衡先后手之间的差距,依然是“先行必胜”,这个问题还有待进一步解决。
参考文献
[1] 明日科技.Java项目案例分析.清华大学出版社
[2](美)埃克尔著 陈昊鹏 译.Java编程思想.机械工业出版社-21-
读书的好处
1、行万里路,读万卷书。
2、书山有路勤为径,学海无涯苦作舟。
3、读书破万卷,下笔如有神。
4、我所学到的任何有价值的知识都是由自学中得来的。——达尔文
5、少壮不努力,老大徒悲伤。
6、黑发不知勤学早,白首方悔读书迟。——颜真卿
7、宝剑锋从磨砺出,梅花香自苦寒来。
8、读书要三到:心到、眼到、口到
9、玉不琢、不成器,人不学、不知义。
10、一日无书,百事荒废。——陈寿
11、书是人类进步的阶梯。
12、一日不读口生,一日不写手生。
13、我扑在书上,就像饥饿的人扑在面包上。——高尔基
14、书到用时方恨少、事非经过不知难。——陆游
15、读一本好书,就如同和一个高尚的人在交谈——歌德
16、读一切好书,就是和许多高尚的人谈话。——笛卡儿
17、学习永远不晚。——高尔基
18、少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向
19、学而不思则惘,思而不学则殆。——孔子
篇3:基于java的五子棋游戏设计
本游戏是在Windows环境下完成一个简易五子棋游戏的设计。五子棋是人工智能的一个成果之一,它涉及到计算机博弈理论,棋盘表示、走法生成以及搜索算法等知识,最终实现人机对战。
二、五子棋的整体设计介绍
一个好的软件产品,首先是要有一个好的人机界面,也就是说给人的第一感觉是美好的、轻松的。接着是简单明了的操作,界面上按钮够少,令玩家容易上手。
1、人机界面的生成
背景图片的大小要适中,否则后面的一些功能无法显示出来(比如相应的按钮)在创建完成一个基本窗口后,将游戏背景图片和棋盘加载进窗口界面,并加入相应的控制按键,就得到了一个简单的棋盘。
2、按钮功能的实现
Java中的鼠标和键盘事件,使用Mouse Listener接口处理鼠标事件。鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出。
三、五子棋的AI算法
在本系统的AI算法里,当玩家下棋时,电脑优先考虑阻止玩家取得胜利,在这个过程中,电脑首先在各个方向进行搜索,寻找其中最优的位置进行下棋,以达到阻止玩家获得胜利的目的。
1、电脑智能下棋
电脑通过打擂计算最佳进攻和防守位置,代码片段如下:
2、游戏胜负的判断
电脑主要是从八个方向来判断哪一方先胜利了,这八个方向是以一个棋子为中心,向四周辐射扩散出去进行搜索判断,这八个方向分别是以该棋子为中心的右斜上、右斜下、左斜上、左斜下、列下、列上、列左和行右。每一个方向都设一个参数count i,初值为1,每判断一次,如果有相同的棋子,则count i的值增加1,如果有五个或五个以上,则该方为胜。代码片段如下:
四、结语
人工智能在计算机上实现时,有2种不同的方式。一种是采用传统的编程技术,使系统呈现智能的效果,而不考虑所用方法是否与人或动物机体所用的方法相同。这种方法叫工程学方法(Engineerin gapproach),它已在一些领域内做出了成果,如文字识别、电脑下棋等。另一种是模拟法(Modeling approach),它不仅要看效果,还要求实现方法也和人类或生物机体所用的方法相同或相类似。而我设计的五子棋游戏正是通过第一种方法实现的——工程学方法。了解这些还是远远不够的,最重要的是了解计算机博弈方面相关的搜索算法。由于我对java方面的知识了解的不多,所以也花了很多的时间在学习,可以说是边学边用了。
参考文献
[1]张孝祥.Java就业培训教程[M].北京:清华大学出版社,2003.
[2]Negnevitsky,M.人工智能智能系统指南(英文版)[M].北京:机械工业出版社,2005.
篇4:五子棋里的婚姻哲学
这次,妻子埋怨我爱网聊。说我因为网聊,连家务也懒得做。我顶撞她说,谁没做家务了?说好中午我做饭,怎么晚饭也要我做?你不就是看我聊天心里不舒服吗?就这样,争着争着就升级为吵架了。
吵架后,我的心情也不好。于是,关了电脑,躺在沙发上自个儿苦闷。真不明白,谈恋爱时,她是温柔可爱的。才刚三年,她怎么变得不可理喻了。我知道,我依旧爱着她,争吵的日子让我后怕,怕有一天会失去她。我正理不出头绪时,她拿着小提包出门了。我知道她又是回娘家了。
妻子走后,我懶得做饭。我打一个电话给“死党”,去他那里蹭饭吃。“死党”问我是不是又吵架了。我说没有,是她想妈,回娘家了。“死党”笑笑,对他妻子说:“我陪你下了三盘五子棋了,你给我们做吃的吧。我陪他也下几盘五子棋。”我说:“这么简单的游戏,你们夫妻竟然喜欢玩,我可不喜欢玩这个。”“死党”说:“简单吗?下几盘试试。”
第一局,因我心不在焉,只几下子就结束了。“死党”让我认真下,说谁输了罚酒三杯。我只好认真应对。几局下来,“死党”说:“怎么样?这棋下起来也不简单吧!你总羡慕你嫂子贤惠。其实,美满的婚姻也跟下五子棋一样,你走个子,她走个子,这样你来她往地进行心灵的碰撞,就会走出变化多端的图案;如果只是一方走子,另一方不回应,只走几个子下去就完了!你跟小静也一样,你们的问题不在于谁做家务,而是因为你跟她少了沟通,她心里责怪你冷落了她呢。她给你爱,你就得回应她的爱。只有这样,你们的爱才能持久。婚姻如下棋,你得走好每一步棋啊!吃饭以后,你去接小静吧!”
原来,五子棋里也有婚姻哲学。
(湖南宁远 柏兴武)
篇5:五子棋 校本课程纲要
校本课程纲要
一、学生情况分析
五子棋校本课程主要面向三四年级的学生开设,本学段的学生动手、动脑的能力强,兴趣高,在对弈的过程中可以激发他们的聪明机智,活跃大脑思维。
二、授课时间及对象
每周三,一课时;三四年级学生
三、课程背景
五子棋课是我校义务教育阶段对低年级学生培养爱国情感,推广体育文化知识,开发逻辑思维能力,提升心理素质的一门校本课程,通过学习必将对学生拥有自信的人生起到积极的积淀作用。五子棋能促进学生的品行、智力、审美及身心等综合素质的和谐发展。五子棋起源于我国,这有利于弘扬我国的传统民族文化,培养有理想、有道德、有文化、有纪律的社会主义公民,并对我国现代化建设能起到积极地推动作用。
四、课程目标
1、通过学习学生能掌握五子棋的历史渊源,弘扬民族文化,培养学生的爱国情感和良好的棋德意识。学会参加家庭、学校及社会上组织的各种比赛的方法和注意事项,比赛中“胜不骄败不馁”,提高学生良好的心理素质,正确认识自己,不盲目自信,提高自身抗挫折的能力,做事不自卑,适应当今时代,培养学生积极向上的竞争意识。
2、通过理论教学和实战比赛逐步提高学生的棋艺水平,因材施教,以五子棋教学为载体,努力促进每一位学生逻辑思维能力的提高,有意识的培养学生的创新能力。
3、通过学习五子棋的礼仪,养成学生良好的下棋习惯,培养学生尊重他人,愿意与他人合作和沟通的意识,为学生终身的发展奠定好的基础。培养学生体会享受下棋的乐趣,培养积极的人生体验,乐观地对待人生。
4、通过学习五子棋规则,学生能体悟到没有五子棋规则,就没有五子棋这个项目的辨证道理,“没有规矩不成方圆”,明确规则是事物存在的必要条件。
五、课程内容
第一章
五子棋简述
(一)五子棋简介
(二)五子棋的发展历史
(三)五子棋的棋具
第二章
五子棋的相关术语
(一)对棋的相关术语
(二)比赛的相关术语
(三)行棋的相关术语
第三章
五子棋的基本规则
(一)基本下法
(二)指定开局
(三)三手可交换
(四)怎么确定谁先走
(五)一局棋的胜负与和棋
六、教学要求
1、使学生掌握五子棋的历史渊源,弘扬民族文化,培养学生的爱国情感和良好的棋德意识。了解各种五子棋文化信息,比如:著名棋手及国内外一些重要的赛事等的知识,每节课用五分钟左右的时间让学生进行棋类信息发布,培养学生注意关注并搜集棋类信息的能力和习惯。学会参加家庭、学校及社会上组织的各种比赛的方法和注意事项,比赛中“胜不骄败不馁”,提高学生良好的心理素质,正确认识自己,不盲目自信,提高自身抗挫折的能力,做事不自卑,适应当今时代,培养学生积极向上的竞争意识。
2、通过理论教学和实战比赛逐步提高学生的棋艺水平,因材施教,以五子棋教学为载体,努力促进每一位学生逻辑思维能力的提高,有意识的培养学生的创新能力。了解五子棋水平的段级位知识,为水平较高的学生进一步学习深造创造条件,鼓励有兴趣的学生通过比赛和考试获取相应的段级位证书。
3、通过学习五子棋的礼仪,养成学生良好的下棋习惯,培养学生尊重他人,愿意与他人合作和沟通的意识,为学生终身的发展奠定好的基础。培养学生体会享受下棋的乐趣,培养积极的人生体验,乐观地对待人生。
4、通过学习五子棋规则,使学生体悟到没有五子棋规则,就没有五子棋这个项目的辨证道理,“没有规矩不成方圆”,明确规则是事物存在的必要条件;进而引申培养学生要遵纪守法,增强法制观念和规则意识,体会没有法律和规章制度等规则约束就没有我们人类社会的哲学思想。
七、教学进度 第一阶段
1、通过讲故事的方法,使学生了解五子棋的发展历史等相关知识。
2、了解五子棋的棋具知识和初步了解五子棋的子力知识。
3、基本学会现代连珠五子棋的规则,基本学会黑棋和白棋不同的取胜方法,并进行基本的取胜训练。
4、通过由学生自选对手比赛,使学生掌握五子棋比赛的基本方法。第二阶段
1、进一步学习五子棋的发展历史,了解中外五子棋的各种组织和著名棋手及国内外一些重要的赛事。
2、比较深入的理解五子棋的子力知识,特别是子力组合的知识。
3、比较深入地理解现代连珠五子棋的规则,较好地掌握黑棋和白棋不同的取胜方法,并进行进一步的取胜训练,提高学生棋艺水平。
4、通过擂台赛、淘汰(含附加赛)的方法进行团体和个人赛,进一步提高学生的比赛的兴趣和水平。
第三阶段
1、认识国际和我国管理五子棋的机构,学习五子棋高段位棋手的学棋精神。
2、更加深入地理解五子棋的子力组合的知识与五子棋规则的关系。
3、进一步深入地理解现代连珠五子棋的规则,较好地掌握黑棋和白棋不同的取胜方法,并通过比较多的习题解答提高学生棋艺水平,基本掌握五子棋的六种防守方法和六种进攻方法。
4、通过班际冠军对抗赛和班内升降级比赛,进一步提高学生的比赛的兴趣和水平。
八、课程评价
篇6:五子棋的课程设计
专业:计算机科学与技术(计算机工程方向)
开发工具及语言:,ubuntu12.04,QT
运行环境:linux下的QT
论文字数:1w左右
是否需要PPT:是
是否需要安装说明:是
所在城市:武汉市
所在学校:华中农业大学楚天学院
功能需求分析
系统的基本功能需求分析如下:
(1)游戏进入界面的菜单选择,有自我对战、人机对战、网络对战和退出 游戏四个选项;
(2)进入游戏之后,显示一个十三行十三列的五子棋的棋盘。棋盘旁边显 示一个菜单,菜单选项有棋局重现、继续上步、上级菜单和退出游戏,在界面上可以在棋盘落子操作和菜单操作之间进行切换,用键盘的按键来控制,棋局重现功能是在某方胜利之后才能手动操作一步步查看并回顾双方下棋的过程;继续上步可以切换回棋盘操作;上级菜单功能可以使五子棋游戏退出当前的游戏模块(自我对战、人机对战、网络对战其中的一种),回到游戏开始界面时候的菜单,进行重新选择;退出游戏是退出整个游戏界面;
(3)棋盘上显示光标,可以对光标进行移动操作,也可以在棋盘和菜单来 回切换的时候重绘和擦除;
(4)在上面棋盘将光标移动到上面对应的位置,可以落子,棋盘上将在光 标显示处出现相应的棋子,并且棋子在横纵交点处;
(5)自我对战的过程中有悔棋的功能;
(6)游戏的过程中会有提示信息,如该哪一方落子,棋盘旁边显示相应按 键对应的操作列表;
(7)可以自动判断胜负,胜利一方形成一列的五个或5个以上的棋子闪 烁数次,显示是黑方或者白方已经胜利的字样,并且停止落子的功能;
(8)能够实现三种游戏模式,自我对战、人机对战和网络对战。
非功能需求分析
非功能需求如下:
(1)在程序运行的过程中程序不能崩溃,更不能使系统出现问题,造成 灾难性的后果;
(2)希望在此项目的基础上不做改动或做很少的改动就能在其他的系统 或设备上运行;
(3)界面清晰容易看懂,方便玩家操作;
(4)游戏运行速度不能太慢,要反应及时,以免影响玩家的兴趣。
(5)程序代码必须每行都有详细注释。以上是要登记的内容。这个是例子。自己修改相关信息。一定要写的详细,开发以文档为依据。注意请把文件名换成自己的作品名,以防技术开发错误
【五子棋的课程设计】相关文章:
五子棋游戏设计与实现04-12
QT基于linux的五子棋游戏设计与实现04-13
五子棋比赛的小学作文04-25
五子棋游戏05-17
五子棋比赛06-22
五子棋教案范文06-06
五子棋比赛表04-10
下五子棋心得04-11
区域游戏五子棋05-04
五子棋大赛策划05-28