课程设计五子棋设计

2024-09-26

课程设计五子棋设计(共8篇)

课程设计五子棋设计 篇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

1 主要传统算法

1.1 博弈树

传统的算法是采用博弈树法来设计程序。以甲乙两人下棋为例,甲有很多种落子方式,乙也有多种应对走法,如果把所有的走法列出来,自然就构成了一棵树,即为搜索树,也称博弈树。树的根结点为先手的第一步走法,下面的走法构成了树的子结点,直至棋局结束。显然,假如棋盘足够大,子结点数会以几何级数上升,而我们的任务是从这些子结点中寻找一个对己方最有利的结点,从而得到棋局的最佳走法,自然这是一个指数复杂度的过程,费时低效,无法搜索到最终结果(除了棋局结束),通常只能达到一个有限的深度,在有限的范围内来判断走法的好坏,得到一个局部最优解。[2,3]因此,有必要做一些调整改进,以提高算法的效率和质量。

1.2 极大极小算法

极大极小搜索算法就是在博弈树在寻找最优解的一个过程,这主要是一个对各个子结点进行比较取舍的过程,定义一个估值函数F(n)来分别计算各个终结点的分值,通过双方的分值来对棋局形势进行分析判断。还是以甲乙两人下棋为例,甲为max,乙为min。当甲走棋时,自然在博弈树中找最大点的走法,轮到乙时,则寻找最小点的走法,如此反复,这就是一个极大极小搜索过程,以此来寻找对机器的最佳走法。其中估值函数通常是为了评价棋型的状态,根据实现定义的一个棋局估值表,对双方的棋局形态进行计算,根据得到的估值来判断应该采用的走法。棋局估值表是根据当前的棋局形势,定义一个分值来反映其优势程度,来对整个棋局形势进行评价。[3,4]估值表通常如下,还可以根据棋型进行进一步的细分:

一般来说,我们采用的是15×15的棋盘,棋盘的每一条线称为一路,包括行、列和斜线,4个方向,其中行列有30路,两条对角线共有58路,整个棋盘的路数为88路。考虑到五子棋必须要五子相连才可以获胜,这样对于斜线,可以减少8路,即有效的棋盘路数为72路。对于每一路来说,第i路的估分为E(i)=Ec(i)-Ep(i),其中Ec(i)为计算机的i路估分,Ep(i)为玩家的i路估分。棋局整个形势的估值情况通过对各路估分的累加进行判断,即估值函数:

1.3 αβ剪枝

αβ剪枝算法简单的来说,就是在搜索过程中减少一定的冗余现象,如已经找到极大值,执行该走法就可以获胜,则无须再往下进行搜索比较,此过程即为剪枝。对于极大的MAX结点,称为α剪枝;反之为β剪枝。具体规则可以简单描述如下:

1)α剪枝:对于极大值层结点的α值如果不小于它的任一祖先极小值层结点的β值,即α(后续层)≥β(祖先层),则可中止该极大值层中这个MAX节点以下的搜索过程,这个MAX节点最终的倒推值就确定为这个α值。

2)β剪枝:对于极小值结点层的β值如果不大于它任一祖先极大值层结点的α值,即α(祖先层)≥β(后续层),则可中止对该极小值层中这个MIN节点以下结点的搜索,这个MIN节点最终的倒推值就确定为这个β值。[2]

αβ剪枝可以进一步进行改进,在走棋过程中,在中心先下的一方往往有一定的优势,双方的搏斗纠缠都是在争夺最佳位置,可以考虑从中心往外螺旋进行扩展搜索;另外由于防守的需要,落子的位置通常也是在彼此下子的附近,因此可以优先考虑在这些位置进行搜索,也就是对落子位置进行排序预先搜索,更进一步的缩减冗余现象,进而提高搜索效率和行棋质量。[5]

2 改进传统算法

传统算法最大的一个缺点还是在于它的指数复杂度问题,虽然通过剪枝、优化搜索位置等方法减少了冗余,提高了一定的搜索效率,但都无法解决搜索深度增加带来的呈几何级数增加的巨大计算量问题。[4]在进一步的实验中发现,搜索超过7层以后,程序响应速度明显变慢,到9层会出现1-2s的间隔期。因此,通过研究五子棋的规律和特点,结合实际经验,可以对程序作一些预定的调整措施,从而提高算法的执行效率和对弈能力。

2.1 缩减搜索范围

对于15x15的棋盘,每一种走法都有上百种可能,如果对每种走法都进行计算估值,则无疑大大增加了计算量,降低了算法的效率和质量。根据规则和实际经验,我们知道只要考虑以棋子为中心的邻近区域皆可,比如不大于4的距离通常为该子的有效范围,同理我们还可以在对方的落子范围进行判断估值。这样可以缩减搜索范围,同时提高算法的效率和走法的实用性。

2.2 置换表搜索

前面我们讨论了利用αβ剪枝来处理冗余结点,对于已经搜索过的结点,我们可以通过设置一张Hash表记录该结点,这样在后续的搜索过程中,可以对这些点的记录进行查询如先前有过记录则直接调用,免于重新搜索,从而避免出现重复操作,加快搜索速度。该方法通常称为置换表(Transposition Table)。

2.3 建立棋谱库

该方法广泛应用在象棋程序设计中,五子棋远比象棋简单,该方法也更为有效实用。通过在数据库中存储一些开局“定式”手法和经典棋局,开局阶段,程序使用开局库,一旦发现相同棋局,则直接调用该走法,无须再次搜索,同时建立数据库来存储失败案例不断进行调整对策。该方法可以极大的提高程序的智能化,只是增加了额外的系统开销。另外对于棋谱的匹配和存储也是关键问题。蒋加伏等人提出的利用Apriori算法提取方法,较为有效实用。[4]

2.4 合理设置搜索深度

理论上来说,为了寻找最优解,最好是对完整博弈树进行完全搜索,但实际中是不可行的,无论是从时间上还是从系统资源上。在后面实际程序设计中,最大使用了9层搜索策略,默认为5层,当然也可以根据不同机器配置加以调整,以达到最大效率。

3 实例分析

在WindowsXP操作系统下,利用上述算法思想,采用C#编程实现一个实现人机对战的五子棋程序。通过实验分析比较,程序的智能化和质量效果较为理想。当计算机执黑时,基本上每次都能获胜,且步骤、时间较短;当玩家执黑先行,计算机获胜比率也较高,具有很好的智能性。右图1,图2是棋局实例。

4 结束语

本文介绍了一个智能五子棋的主要算法思想和实现技术,利用剪枝和极大极小树搜索博弈树,作出了一些改进措施,寻求最佳下棋位置,从而提高了智能博弈的质量。进行优化以后,五子棋程序的智能水平和搜索效率有了明显的提升。本文所讨论的算法思想和设计过程也为其他棋类游戏(如象棋和围棋等)提供了一定的参考价值。此外,五子棋的国际规则较为复杂,加入了禁手判负、三手交换等规则限制黑手先行优势,可以在进一步的工作中考虑实现。

摘要:机器博弈是人工智能的一个重要研究分支,该文通过设计一个五子棋智能博奕程序,采用传统的博弈树算法,利用剪枝和极大极小树搜索最佳位置,从而实现人机智能博弈。并对现有算法存在的问题进行探究改进,最后给出程序实例,结果表明效果较为理想。

关键词:五子棋,智能,博弈,估值函数

参考文献

[1]蔡自兴.人工智能及其应用[M].北京:清华大学出版社,1999:2-12.

[2]朱全民,陈松乔.五子棋算法的研究与思考[J].计算技术与自动化,2006(02):75-78.

[3]董红安,蒋秀英.智能五子棋博弈程序的核心算法[J].枣庄学院学报,2005(2):61-65.

[4]蒋加伏,陈蔼祥,唐贤英.基于知识推理的博弈树搜索算法[J].计算机工程与应用,2004(1):74-76.

课程设计五子棋设计 篇3

一、采用项目教学法的必要性

1.传统的教学模式不适宜程序设计课程的教学

在程序设计课程教学中,传统的教学模式学生只是被动地接受,在具体的编程及上机操作时,往往出现无从下手、错误百出、不会调试等情况。长此以往,会使学生认为程序设计课程十分深奥、可望而不可及,最终会导致学生对课程产生厌倦的思想,即使学习完课程,学生的程序设计思路也非常狭窄,解决实际问题的能力较差,不利于学生学习兴趣的培养以及学生思维能力、创新能力、独立分析问题和解决问题能力的提高。

2.项目教学法符合建构主义学习理论的要求,能有效提高程序设计能力

建构主义(constructivism)最早由著名的瑞士心理学家皮亚杰(J. Piaget)提出。建构主义学习理论认为,知识不是通过教师传授得到的,而是学生在一定的情景下,借助他人(包括教师和同学)的帮助,利用必要的学习资料,通过意义建构的方式而获得。

項目教学法是师生通过共同实施一个完整的项目工作而进行的教学活动。通过选取工程项目来创设情境,通过协作学习的方式开展学习,通过完成工程项目来达到意义建构。它突破了传统的教学模式,通过解决学生身边的一些现实问题来实现学生对知识的掌握,大大提高了学生学习的积极性和主动性。项目教学法符合建构主义学习理论的要求,可使学生的动手能力、解决实际问题的能力有很大的提高。这种方法不但适合职业学校的计算机程序设计课程教学,尤其适用于学生水平参差、学生自控能力比较薄弱、课程的应用性比较强的教学。

二、项目教学法的实施过程

1.情境设置

创设学生当前所学习的内容与现实情况基本接近的情境,即项目的选取,是项目学习法的关键。选取项目要以教学的内容为依据,可大可小,既要包含基本的教学知识点,又能调动学生解决问题的积极性,让学生既能运用学过的知识,又可以创造发挥。选项目时可以先选简单和典型,便于学生对知识的迁移;然后再选有一定难度的,可促使学生学习和运用新的知识、技能,解决过去从未遇到过的实际问题。例如学习数组时,笔者选取的学生成绩处理项目中,有成绩的输入、输出、求总分、求平均分、求最高分、排序等。这样贴近实际,学生比较熟悉,容易调动学生解决问题的积极性。

2.操作示范

围绕当前学习的知识点,以便满足学生“知识迁移”的要求,选择合适的小项目,并示范完成项目的过程。笔者选择成绩输入这个小项目,示范用数组来实现该模块的功能。

3.独立探索

让学生独立思考,对知识点进行理解,消化成绩输入这个示范项目,为解决练习项目打下基础。

4.分组并确定各小组的项目

小组通过研究讨论,并在教师的指导下,将成绩的输出、求总分、求平均分、求最高分、排序等划分好的小项目分配给各小组。

5.协作学习

各小组开展交流、讨论,组员分工协作,调试运行,完成项目。采取分组协作学习的方式时,每组人数应适中,在组员的个性、能力方面应采取互补方式搭配好,设立各小组项目经理,协调组内成员分工,有利于同学之间互相学习。

6.学习评价

学生学习的效果直接由完成工程项目的情况来衡量,包括教师评价、学习小组评价和自评三部分。分三级来考核:第一级是由教师对小组完成项目情况进行评定:能否共同协作,实现预定功能;程序的优化;是否具有创新意识。第二级是由各小组成员根据各组员对本小组贡献的情况进行互评,组员的参与意识如何。第三级是由学生本人进行自评,是否在原有基础上有所提高。综合三级评定情况来确定每一名学生的学习成绩。

三、项目教学法存在的问题

在利用项目教学法进行教学的过程中,运作难度较传统教学模式增大,对教师综合素质提出了更高的要求。一是对项目的选取要求高,既要简单、典型又要有一定难度。二是在教学过程中教师的地位是经常变化的。教师应当做好对各项目的评估总结,在评估中要指出问题的所在及解决的方法,要总结比较各组的特点,引导他们学习别人的长处来改进和提高自己的设计,使学生的各种能力在评估中得到提高。教师应当发挥好协助作用,让学生根据自身行为的信息来实现自我反馈。

校本课程-五子连珠社简介 篇4

“连珠”,俗名“五子棋”,在人们印象中,这是最简单的、人人都会的。但是事实上,“连珠”作为中华民族的传统文化之一,却并没有那么简单。

“连珠”,起源于四千多年前的尧帝时期,稍早于围棋。魏晋时期,传播至高丽、日本,随后传至世界各地。韩国人称之为“情侣棋”、欧洲人称之为“绅士棋”、日本人称之为“中老年棋”、美国人称之为“商业棋”。

1988年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟。如今,“连珠”更成为“世界智力运动会”的正式比赛项目之一,与桥牌、国际象棋、围棋、国际跳棋、中国象棋并列为六大比赛项目。

课程设计五子棋设计 篇5

功能:假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息。试设计一选修课程系统。

分步实施:

1、初步完成总体设计,搭好框架,确定人机对话界面,确定函数个数;

2、建立一个文件,将每条记录信息写入文件中并能显示于屏幕上

3、完成上述添加、查找(课程编号、课程名称、课程性质等)、修改等功能。

4、进一步要求:学生选修课程(可选项)

要求:

1、用C语言实现程序设计;

2、利用结构体数组实现信息的数据结构设计;

3、系统的各个功能模块要求用函数的形式实现;

4、界面友好(良好的人机交互),程序加必要的注释。

课程设计实验报告要求:

1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分。

《机械设计课程设计》总结 篇6

一、课程设计目的

《机械设计基础课程设计》是《机械设计基础》课程的的最后一个重要教学环节,也是学生第一次较全面的设计能力训练。其基本目的是:

1.培养理论联系实际的设计思想,训练综合运用机械设计和有关先修课程的理论,结合生产实际分析和解决工程实际问题的能力,巩固、加深和扩展有关机械设计方面的知识;

2.通过制定设计方案合理选择传动机构和零件类型,正确计算零件工作能力、确定尺寸和选择材料,以及较全面的考虑制造工艺、使用和维护等要求,进行结构设计,达到了解和掌握机械零件、机械传动装置的设计过程和方法;

3.进行设计基本技能的训练。例如计算、绘图、熟悉和运用设计资料(手册、图册、标准和规范等)以及使用经验数据、进行经验估算和处理数据的能力。在本课程设计鼓励采用计算机绘图。

二、课程设计内容

为了达到上述目的,在课程设计中,针对布置题目学生要完成的设计内容有:

1.电动机的选择及运动参数的计算; 2.V带的传动设计; 3.齿轮传动的设计; 4.轴的设计(低速轴); 5.滚动轴承的选择及验算(低速轴); 6.键的选择计算及强度校核(低速轴); 7.联轴器的选择(低速轴); 8.润滑油及润滑方式的选择; 9.绘制零件的工作图和装配图(1)绘制零件的工作图轴的零件图

(2)减速器的装配图零件的工作图包括:(1)尺寸的标注;(2)公差;(3)精度;(4)技术要求。装配图包括:(1)尺寸标注(2)技术特性(3)零件编号(4)编写零件明细表、标题栏。

10.编写设计说明书

三、要求

作为指导教师,为了使学生能顺利地完成所布置的任务,在设计过程中要加以指导。首先让学生做减速器的装拆试验,形象地认识减速器。在设计过程,轴的结构设计和减速器的外形尺寸的确定对于学生来说是难点,针对这一难点要上一次辅导课。另外,每天来指导学生设计、计算、绘图,以便及时发现问题和解决问题。

要求每位学生在设计过程中,充分发挥自己的独立工作能力及创造能力,对每个问题都应进行分析、比较,并提出自己的见解,反对盲从,杜绝抄袭。在设计过程中必须做到:1)随时复习教科书、听课笔记及习题。2)及时了解有关资料,做好准备工作,充分发挥自己的主观能动性和创造性。3)认真计算和制图,保证计算正确和图纸质量。4)按预定计划循序完成任务。

四、评分原则

课程设计中,最终的图纸及说明书并不能完全反映学生的真实水平,同学的工作能力也不能在图纸及说明书中得到完全的反映,因此,对同学的评分,特别要注意抓两头:一头抓平时,一头抓答辩.课程设计成绩根据平时出勤和设计图纸、说明书、创新能力和答辩情况综合按百分制制评定。

五、存在问题

在课程设计过程中,发现学生主要存在以下问题:1)学习态度不够认真,或虽认真但因基础差等原因,不能按时完成进度计划;2)独立工作能力差,设计时不能或不进行独立思考,教师指一步才作一步,或参照其他同学的设计进行“照猫画虎”式的进行;3)设计中有错误,有知其然不知其所以然的现象;4)图纸质量较差,特别是尺寸标注,出现问题较多,表达不清楚;说明书内容不够完整、工整,有个别原则性错误和若干一般性错误;5)答辩中不能很好的回答提问,回答中有个别原则性错误和若于非原则性错误。

六、结果分析

参加本次课程设计1个班,大部分同学能按老师要求完成每一阶段的任务,设计图纸、说明书和最后的答辩中满足要求。参加本次课程设计共有50名同学,其中优2人,良26人,中20人,及格2人,不及格0人。基本反映了学生的学习情况。

七、经验及教训

课程设计五子棋设计 篇7

关键词:教学设计,五子棋,项目教学

0 引言

在Java语言程序设计课程的教学过程中,仅仅通过简单的案例讲解相关知识点是远远不够的,简单枯燥的案例只能让学生了解到基本的语法和用法,却不能激发他们的学习兴趣。让他们具备运用知识的能力。指导学生开发完成一些简单的小游戏项目则非常有利于调动他们学习的积极性,使之在实践中熟练掌握相关知识,从而真正提高他们的动手能力。开发控制五子棋游戏是一个初学者学习Java语言非常好的实践项目。它的游戏流程较为简单,涉及知识点较多,非常适合教师在课堂上讲解并指导学生编程实践。

1 教学设计思路

1.1 教学主要内容

通过对五子棋玩法规则的分析,设计游戏步骤与运行过程,最终编程实现游戏。涉及的具体知识点包括:类的定义、构造方法的使用、方法的调用、数组的应用、控制台输入、正则表达式、基本类型包装类的用法、循环的使用等。

1.2 教学目标与重难点

教学目标包括:了解软件开发的基本步骤(分析、设计、编码、调试);树立模块化程序设计的思想;掌握Java基本语法知识并学会熟练应用。教学的重点在于帮助学生建立软件工程的思想进行程序设计开发;教学的难点在于项目设计思路的分析和知识点的灵活应用。

1.3 教学策略与方法

由于授课对象为初步掌握了解Java基本语法知识的学生,因此在五子棋项目教学上应当采用由浅入深,逐步引导,任务驱动,教师分析讲授总体思路,学生具体设计实现的策略,运用讲授法、演示法、任务驱动法来组织实施教学。

2 教学实施过程

2.1 项目思考分析

五子棋是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。分析得出以下关键信息:黑白棋代表不同玩家、棋盘由若干行列构成、棋子下在行列交叉点上、获胜规则为先形成连续同色五子的一方。根据以上分析考虑设置一个二维数组来代表棋盘,设置两个整型成员变量代表一步棋所对应的坐标,每下一步棋都需要判断玩家是否获胜。具体成员变量定义如下。

int size=20;//棋盘尺寸

String[][]board;//棋盘

int x,y;//一步棋的横、纵坐标

int steps;//步数计数

2.2 步骤分析讲解

游戏的基本流程如图1所示。初始化游戏的步骤包括初始化棋盘二维字符数组和控制台打印棋盘信息;判断游戏结束的条件是有玩家获胜(需要从横向、纵向、正斜线、反斜线4个方向判断输赢)或棋盘下满棋子未分出输赢;下一步棋的步骤包括判断棋子位置的合法性,设定棋子和步数,打印落子后的棋盘信息。其中判断棋子位置的合法性又分为3个子步骤:输入格式合法性判断,输入坐标大小合法性判断,输入坐标位置是否已被占用的判断。

2.3 关键代码演示

控制台输入合法坐标的获取是项目中一个技术难点,需要用到正则表达式等相关技术进行处理。假定严格要求玩家输入坐标的格式为“x,y”,其中x,y值的范围在1到size之间,并对输入字符串进行分解得到相应坐标值。代码示例如下:

每当玩家下一步棋后判断其是否获胜的算法思路是循环遍历整个棋盘,以每一个与当前玩家颜色相同的棋子为起点,分别判断从左到右、从上到下、从左上到右下、从右上到左下4个方向是否符合赢的条件,只要有一个符合要求则判断其获胜。代码示例如下:

2.4 指导编码实践

在项目分析与步骤讲解并演示完成关键部分代码后,则将任务布置给学生自己动手完成。在指导学生编码的过程中,首先要强调必须养成良好的代码书写习惯,命名使用有意义的单词并采用驼峰标识,还要多写注释便于他人阅读理解;其次在调试过程中注意观察报错信息,要善于利用工具进行错误跟踪分析;另外还需要指导学生注意站在用户的角度看问题,虽然控制台游戏界面比较简单,但还是应该尽量美化界面,多给提示信息,让用户获得好的体验效果。比如在打印棋盘时可以将行列号输出,便于用户观察等。

2.5 启发拓展学习

学生完成项目后还可以进一步指导启发学生拓展学习,如:判断玩家获胜的算法是否可以优化(学习运用更高效的算法);目前是单机对战游戏可否考虑改写成网络对战游戏(学习Java网络编程知识);目前是控制台游戏能否改写成用户界面更友好的图形程序(学习Java图形界面编程)等。这些问题的提出可以驱动学生更深入的学习运用相关知识。

3 结语

通过多个班级的教学实践,笔者发现五子棋游戏项目教学非常有利于调动Java语言初学者的学习积极性。很多学生反映启发式任务驱动项目教学使他们从孤立片面的知识点学习自然地转换到综合全面的技能运用,既在宏观上建立了软件工程的思想,又在细节上磨练学生使用程序设计的技巧。开发完成五子棋项目使得学生掌握应当如何具体运用所学的知识实现设计目标,极大地增强了自信心和进一步学习的动力,教学效果有着非常明显的提升。

参考文献

[1]郝中超.运用项目教学法实施编程语言教学的教学设计过程[J].希望月报,2007(10):52-53.

[2]李刚.疯狂Java讲义[M].北京:电子工业出版社,2014.

服装设计项目课程教学环节设计 篇8

【关键词】服装设计 教学设计

服装设计项目课程整合了服装设计、结构设计、工艺设计与制作、面辅料选择等课程的内容,把企业工作任务转化为教学任务,通过实际应用来学习知识点,培养学生知识的综合应用能力,培养学生的团队协作精神和集体完成项目的意识,强化学生的动手能力,有效提高学生的专业技能,以达到零距离上岗的目的。

1.“项目课程教学”的推出

“项目课程教学”就是以任务驱动为目的的项目化教学。本课程重视学生在校学习与实际工作的一致性,有针对性的采取了工学交替、项目导向、任务驱动等行动导向的教学模式。在教学大纲中放入项目课程教学环节,选择合适的企业开展合作,承接企业的产品开发任务,在教学中由学生完成开发任务。项目课程的教学过程,按照企业的设计流程来做,根据企业的设计风格和品牌定位要求,让学生直接进入实际操作,由各个课程的教师交叉授课和指导,共同评价。

2.社会用人需求分析

社会用人单位对毕业生的反馈意见中,集中反映了以下问题:1)综合能力薄弱。2)敬业精神较差。3)团队协作能力方面不够。其中团队协作能力差的表现尤为突出,表现为不懂得与人合作交往,集体凝聚力不够,主动参与活动意识不够。很多学生从主观意识上并不是轻视这方面能力发展,而是在我们的传统教育中缺少这方面的教育和培养,使得学生重视个体发展而轻视合作,缺乏与他人团结协作的主动性。

3.前期教学现状分析

服装设计课传统的教学模式是,先向学生介绍服装设计原理,再进行市场调研,绘制效果图,三四门关联的课程往往独立授课,缺乏综合训练过程。在以往的教学过程,未曾安排企业相关的教学内容,和生产实际结合不够紧密。综合能力的训练只是在毕业设计过程中加以实施,没有接触企业的产品设计流程,缺少感性认识。

专业没有进行过以团队为工作对象的教学项目的实施,毕业设计是每个人根据毕业任务进行,由学生个体完成,缺少团队精神的培养的途径。

服装设计项目课程把前期的专业课程以项目课的形式进行综合训练,以工作任务为驱动,联合企业进行产品开发方案设计,在实践教学理念、实践体系、实践教学的内容、方法和手段改革进行理论和实践探索,在学生作品评价体系方面进行改革和实践并逐步把学生成果推向市场。

4.项目课的教学环节

1)对服装设计项目进行全方位的课程方案设计

内容包括课程大纲、课程能力、知识目标、内容设计、能力训练目标项目设计,以及作业设计和考核方案等进行设计。

2)项目内容选择

我们以缺乏设计力量的中小型企业为服务对象,进行校企合作,签订横向合作项目合同。由企业提供面辅料和产品开发要求,由课程教师团队实施合作项目。在大三第五学期,选择企业产品开发项目进行课程教学,完成了美欣达北京订货会产品设计与制作,湖州电视台主持人服装设计与制作,湖州青青果服饰有限公司2013年产品开发方案,湖州宝帛服饰有限公司2011年款式开发设计等项目。

3)教学过程的组织

(1)人员组织:将学生分成4人一组,设立小组长、设计总监、技术总监、市场经理四个岗位,由学生竞争上岗。每个人拿出自己的专业特长,充分显示自己的组织才能,竞选合适的岗位。由辅导老师团队进行考核打分录用。在一定程度上模拟企业招聘员工的形式,在一定程度上锻炼了学生的自我表达和自我推荐能力。

(2)项目内容落实任务下达:教师将该任务分成若干个主题,由小组来选择主题进行设计。

(3)市场调研阶段:调研2013年春夏流行趋势发布内容,调研相似童装品牌3~4个,内容包括产品概况、市场定位、设计风格特征、色彩款式面料特征、店面陈列特点等各个方面内容,让学生掌握市场调研的方式方法和进行的过程,锻炼学生资料整理总结的能力。

(4)设计阶段:根据企业要求和老师的主题表现,根据自己对该品牌的解读,进行款式设计,要求每人设计20款,由小组的设计总监把关,统一自己成员的款式风格。选择其中40款和老师沟通修改。在和企业沟通,选择款式进行制作。该环节锻炼学生的设计能力和品牌驾驭能力,还有个人服从团队的精神。

(5)打樣和制作环节:由技术总监牵头,带领大家进行样板设计,遇到具体问题由负责人在课堂上向老师提出,商讨解决办法。也可以小组之间互相帮助解决问题,碰到这种情况老师可以适当给予表扬和加分。样板由指导老师确认后进行工艺制作,并由市场经理按照国家标准进行产品验收。

5.项目课的意义

1)解决了以往学校和生产实践相脱离的矛盾

深化工学结合内容,以企业的实际设计项目为目标进行课程设计,为企业提供技术服务。本项目由企业提供面辅料,确定设计范围后,由老师带领学生进行产品设计,最后由企业来选择评价。

2)加强了学生专业综合应用能力训练

以往的教学课程中,每个科目都是单独开设,缺乏综合训练的过程。本次成果围绕服装设计师职业能力目标,从服装设计师的专业能力养成出发,按照服装设计的基本流程来组织课程教学。培养学生的款式设计创新与系列拓展能力,注重结构设计与工艺制作能力的培养,强化设计的创新意识。

3)解决了学生作品缺少行业生产实际评价的矛盾

学生的学习评价采取过程评价和结果评价相结合的评价方式,重点评价学生对设计资讯的收集分析与应用能力,重视设计理念的形成、设计的实现(样衣的制作)过程,培养动手能力。

4)营造了工作环境

上一篇:客服的个人年终总结下一篇:检测机构工作总结