C语言游戏2-五子棋(人机对战)
- 格式:pdf
- 大小:942.69 KB
- 文档页数:20
//Java编程:五子棋游戏源代码import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;/**main方法创建了ChessFrame类的一个实例对象(cf),*并启动屏幕显示显示该实例对象。
**/public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}/**类ChessFrame主要功能是创建五子棋游戏主窗体和菜单**/class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"20x15","30x20","40x30"};private String[] strmode={"人机对弈","人人对弈"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;//构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(20,15);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", "棋盘","模式", null, "退出"}, this));JMenu lookMenu =new JMenu("视图");mbar.add(makeMenu(lookMenu,new Object[] {"Metal","Motif","Windows"},this));JMenu helpMenu = new JMenu("帮助");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}//构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}//构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}//构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 20+50 , h * 20+100 );if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 1){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}else{System.out.println("\u81EA\u5B9A\u4E49");}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("Windows"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("Motif"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" ); SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("20x15")){this.width=20;this.height=15;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("30x20")){this.width=30;this.height=20;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("40x30")){this.width=40;this.height=30;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对弈")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对弈")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(this, "五子棋游戏测试版本", "关于", 0);if(arg.equals("退出"))System.exit(0);}}/**类ChessModel实现了整个五子棋程序算法的核心*/class ChessModel {//棋盘的宽度、高度、棋盘的模式(如20×15)private int width,height,modeChess;//棋盘方格的横向、纵向坐标private int x=0,y=0;//棋盘方格的横向、纵向坐标所对应的棋子颜色,//数组arrMapShow只有3个值:1,2,3,-5,//其中1代表该棋盘方格上下的棋子为黑子,//2代表该棋盘方格上下的棋子为白子,//3代表为该棋盘方格上没有棋子,//-5代表该棋盘方格不能够下棋子private int[][] arrMapShow;//交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(20, 15, modeChess);}if(modeChess == 2){PanelInit(30, 20, modeChess);}if(modeChess == 3){PanelInit(40, 30, modeChess);}}//按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -5;}}}//获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}//设置交换棋手的标识符public void setisOdd(boolean isodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}//获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}//获取棋盘宽度public int getWidth(){return this.width;}//获取棋盘高度public int getHeight(){return this.height;}//获取棋盘模式public int getModeChess(){return this.modeChess;}//获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}//判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}//判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}//在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}//计算机走棋/**说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,*最后得出棋子数最大值的坐标,下子**/public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){if(!chessExist(i,j)){//算法判断是否下子max_white=checkMax(i,j,2);//判断白子的最大值max_black=checkMax(i,j,1);//判断黑子的最大值max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}//记录电脑下子后的横向坐标public void setX(int x){this.x=x;}//记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}//获取电脑下子的横向坐标public int getX(){return this.x;}//获取电脑下子的纵向坐标public int getY(){return this.y;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;//judge rightfor(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge leftx_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;//judge upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge downy_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge left_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge right_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge right_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge left_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}//判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;//判断右边for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断左边x_temp1=x_temp;for(int i=1;i<6;i++){if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断上方x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断下方y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断左上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断右下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width) break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断右上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断左下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}//赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了,好厉害!","win",RMATION_MESSAGE);}//输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了,请重新开始!","lost",RMATION_MESSAGE);}}/**类MainPanel主要完成如下功能:*1、构建一个面板,在该面板上画上棋盘;*2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)**/class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{private int width,height;//棋盘的宽度和高度private ChessModel cm;//根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}//根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}//根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),//然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}//根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;//画棋盘if(i!=width && j!=height){g.setColor(Color.white);g.drawRect(x,y,20,20);}//画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}//画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}//响应鼠标的点击事件,根据鼠标的点击来下棋,//根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]);repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}//判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}//响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}class ChessWindowEvent extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0);}ChessWindowEvent(){}}。
C语⾔可以开发哪些项⽬?C语⾔是我们⼤多数⼈的编程⼊门语⾔,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,⽐如:不知道C语⾔可以开发哪些项⽬,可以应⽤在哪些实际的开发中……,这些迷茫也导致了我们在学习的过程中不知道如何学、学什么,所以,总结这个列表,希望对C语⾔初学者可以有所帮助~C语⾔可以做什么?从最简单的、最熟悉的说起吧,毕竟我们在学校学习的时候,⽼师⼏乎都会让我们去开发:⼀、C语⾔可以实现⼀些常见的应⽤以下⼏个⼏乎是我们学习C语⾔到⼀定阶段之后必开发的⼀个⼩项⽬了,简单。
1、项⽬⽤C语⾔做⼀个简单的计算器,进⾏加、减、乘、除操作。
2、项⽬使⽤ C 语⾔完成⼀个简单的通讯录。
会涉及到结构体、数组、链表等重要概念。
3、项⽬实现客户端和服务端编程,服务端使⽤epoll机制,⾼并发必备,⽀持多客户聊天室聊天;客户端使⽤epoll和fork,⽗进程与⼦进程通过pipe通信。
4、使⽤ C 语⾔完成⼀个简单的⽇历功能。
输⼊相应的年/⽉即可看到当⽉的⽇历。
⼆、C语⾔可以开发游戏当然C语⾔也可以开发⼀些⼩游戏,有趣的同时也掌握了相应的知识点。
5、使⽤ C 语⾔完成⼀个2048游戏。
6、使⽤ C 语⾔来实现⼀个字符版 Flappy Bird7、使⽤ C 语⾔完成⼀个简单的扫雷游戏。
8、使⽤C语⾔实现五⼦棋游戏。
三、 C语⾔可以开发的其他应⽤如果你以为C语⾔只能开发上⾯介绍的⼩游戏以及⼀些⽿熟能详的应⽤呢,那么就⼤错特错了,因为C语⾔还可以开发很多东西,如下:9、⽤C语⾔实现⼀个简易的WEB服务器,并能⽀持动态解析PHP程序。
主要涉及到的技术有:Linux Socket编程,HTTP协议(只实现GET请求),Fast-CGI协议。
10、项⽬⽤C语⾔实现ping命令。
通过项⽬可以更深⼊地理解TCP/IP协议,掌握C语⾔进⾏⽹络编程的技巧⽅法。
11、项⽬通过原⽣套接字的⽅式,监听所有本地主机收发的数据链路层帧结构,然后解析数据包的类型,并记录到⽇志⽂件。
毕业论文(设计)题目五子棋游戏的设计与实现毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
c语言游戏编程课程设计一、课程目标知识目标:1. 理解C语言的基本语法,掌握变量、数据类型、运算符等基础概念;2. 学会使用C语言进行流程控制,包括条件语句和循环语句;3. 掌握C语言数组、函数和指针的基本应用;4. 了解C语言中结构体和文件操作的基础知识;5. 学习C语言中与游戏编程相关的图形库和事件处理机制。
技能目标:1. 能够运用C语言编写简单的游戏程序,如“贪吃蛇”、“五子棋”等;2. 学会分析游戏需求,设计合理的程序结构和算法;3. 掌握基本的程序调试和错误处理方法,提高解决问题的能力;4. 能够与团队成员协作完成一个简单的C语言游戏项目。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发创造力和想象力;2. 培养学生的团队协作精神,提高沟通与协作能力;3. 培养学生面对问题积极求解的态度,提高自信心和自主学习能力;4. 引导学生关注游戏编程与社会实际问题的联系,培养社会责任感。
课程性质:本课程为实践性较强的课程,旨在通过C语言游戏编程,使学生掌握编程基础知识和技能,同时培养学生的团队合作能力和创新意识。
学生特点:学生具备一定的计算机操作能力,对编程有一定兴趣,但可能缺乏实际编程经验。
教学要求:教师需关注学生的个体差异,提供个性化指导,注重理论与实践相结合,使学生在实践中掌握编程技能,提高解决问题的能力。
同时,关注学生的情感态度价值观的培养,引导他们健康成长。
二、教学内容1. C语言基础语法:变量、数据类型、运算符、表达式和语句;2. 流程控制:条件语句(if-else)、循环语句(for、while、do-while);3. 函数:函数定义、调用、传参,递归函数;4. 数组:一维数组、二维数组,数组操作;5. 指针:指针的概念、指针与数组、指针与函数;6. 结构体:结构体的定义、初始化、访问和操作;7. 文件操作:文件的打开、读取、写入和关闭;8. 图形库和事件处理:了解C语言中常用的图形库(如SDL、Allegro等),学习事件处理机制;9. 游戏编程实例:贪吃蛇、五子棋等;10. 团队项目:设计与开发一个简单的C语言游戏项目。
详解C语⾔中index()函数和rindex()函数的⽤法C语⾔index()函数:查找字符串并返回⾸次出现的位置相关函数:rindex, srechr, strrchr头⽂件:#include <string.h>定义函数:char * index(const char *s, int c);函数说明:index()⽤来找出参数s 字符串中第⼀个出现的参数c 地址,然后将该字符出现的地址返回。
字符串结束字符(NULL)也视为字符串⼀部分。
返回值:如果找到指定的字符则返回该字符所在地址,否则返回0.范例#include <string.h>main(){char *s = "0123456789012345678901234567890";char *p;p = index(s, '5');printf("%s\n", p);}执⾏结果:5.68E+25C语⾔rindex()函数:查找字符串并返回最后⼀次出现的位置头⽂件:#include <string.h>定义函数:char * rindex(const char *s, int c);函数说明:rindex()⽤来找出参数s 字符串中最后⼀个出现的参数c 地址,然后将该字符出现的地址返回。
字符串结束字符(NULL)也视为字符串⼀部分。
返回值:如果找到指定的字符则返回该字符所在的地址,否则返回0。
范例#include <string.h>main(){char *s = "0123456789012345678901234567890";char *p;p = rindex(s, '5');printf("%s\n", p);}执⾏结果:567890。
基于STM32的人机对战五子棋系统设计
王梦寻;戴家兴;施武斌;杨鑫;钱林皓玮;薛晶晶
【期刊名称】《工业控制计算机》
【年(卷),期】2023(36)1
【摘要】采用STM32单片机作为系统的主处理器,同时连接显示屏显示出15×15的棋盘,可以触摸屏幕下棋。
同时选择最直观的贪心算法,该算法可以概述为当人下完一步后,单片机会进行搜索合适落子的点,并计算每个落子得到的分数,选出最适合落子(得分最高)的点作为后一步。
经过实验证明,该五子棋人机对战系统具有操作简便、反应灵敏、界面显示清晰等特点。
【总页数】3页(P151-152)
【作者】王梦寻;戴家兴;施武斌;杨鑫;钱林皓玮;薛晶晶
【作者单位】绍兴文理学院机械与电气工程学院
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于MicroBlaze嵌入式平台的蓝牙五子棋对战游戏系统设计
2.基于STM32的无人机避障系统设计
3.基于STM32的四旋翼无人机控制系统设计
4.基于STM32的搬运机器人机械系统设计
5.基于STM32的集成化复合式无人机飞控系统设计
因版权原因,仅展示原文概要,查看原文内容请购买。
武汉工业学院毕业设计(论文)任务书及指导书二、指导书1.设计方法和思路:对于本系统的研究方法,通过查阅资料以及指导老师师寻求帮助等方法解决技术上的问题,具体逻辑上的一些东西需要自己仔细思考,并动手实现。
具体步骤为:第一步,熟悉五子棋游戏规则,对系统做可行行分析,同时结合本次毕业设计的相关要求进行系统的分析与概要设计;第二步,简要概述系统的配置,并且对系统进行详细设计,实现相关解决问题的算法;第三步,运用以前所学的知识,选择C语言在Linux环境下调用curses库进行开发,进行软件编码,实现其各项基本功能;第四,系统开发完毕后,进行调试、运行和代码优化;第六步,对前期的学习和工作进行全面的思考、分析、归纳和总结,完成本论文的撰写工作。
2.设计的重点和难点:本课题的重点和难点,包含了五子棋程序的棋盘初始化、游戏规则、胜负判断方法。
重难点在于如何判断双方棋子中哪一方取得胜利,以及人机对战的交互。
3. 检索关键字:关键词:Linux 游戏人机对弈五子棋Key words: Linux Games Human chess Gobang4.所学相关知识:包括C程序设计的基本知识。
Linux系统的基本知识。
Linux C编程的相关知识。
和软件设计相关的知识点的掌握和了解。
5. 毕业设计(论文)进度:6. 毕业设计说明书的撰写要领与格式、答辩准备:按《武汉工业学院毕业设计(论文)学生工作手册》要求。
答辩之前,各位学生应拟好答辩提纲,简捷清晰地阐述课题背景和意义、总体思路、机构方案选定依据、技术难点及措施、创新点以及存在的问题。
7. 主要参考文献[1] 尹业安白燕著.C语言程序设计.长沙:国防科技大学出版社,2012.[2] 胡鸣著.网络编程技术.北京:科技出版社,2012.[3] 严蔚敏吴伟民著.数据结构(C语言版).北京:清华大学出版社,2008.[4] 庞丽萍著.操作系统原理(第四版).武汉:华中科技大学出版社,2010.[5] 谢希仁著.计算机网络原理(第5版).北京:电子工业出版社,2010.[6] (美)W.Richard Stevenson著.范建华...[等]译.TCP/IP协议详解. 北京:机械工业出版社,2012.[7] (美)W.Richard Stevenson Stephen A.Rago著.尤晋元...[等]译. UNIX环境高级编程.北京:人民邮电出版社,2012.[8] 孙建忠著.计算机专业英语.北京:中国水利水电出版社2001.[9] Dhamdhere D M 著.系统程序设计和操作系统(影印版).北京:清华大学出版社,2012.[10] 谭浩强著.C语言程序设计(第三版).北京:清华大学出版社2012.[11] (美)S巴斯著.朱洪...[等]译.计算机算法:设计和分析引论.上海:复旦大学出版。
C++课程设计--五子棋游戏课程设计说明书五子棋游戏The Game of Gobang学院名称:机械工程学院专业班级:测控10xx 学生姓名:江x 指导教师姓名:张xx 指导教师职称:副教授2012年6月目录第一章需求分析 (7)1.1系统概述 (7)1.1.1概述: (7)1.2系统运行环境 (7)1.2.1运行环境 (7)1.3功能需求描述 (7)1.3.1功能需求 (7)第二章总体设计 (8)2.1开发与设计的总体思想 (8)2.1.1总体设计思路 (8)2.1.2屏幕的组成 (9)2.1.3形状的组成 (9)2.1.4形状的统一 (10)第三章概要设计 (10)3.1系统流程图 (10)3.2 软件功能模块 (12)3.3 系统功能模块 (13)第四章详细设计 (13)4.1.界面的设计 (13)4.1.1总体界面的设计 (13)4.1.2界面棋子的设计 (13)4.2.显示界面的准备 (15)4.2.1在窗体类中添加存放黑白棋两维数组和背景棋盘、黑棋、白棋位图对象 (15)4.2.2 在窗体构造函数中初始化wb,装入棋盘、黑棋、白棋位图 (15)4.3. 显示棋盘和棋子代码 (15)4.4. 轮流下子代码 (16)4.5. 判断输赢 (19)4.5.1判断是否白棋胜代码 (19)4.5.2判断是否黑棋胜代码 (20)4.5.3判断是否平局代码 (21)4.6. 悔棋 (21)4.7. 重新开始 (22)4.8. 背景音乐 (23)4.9. 保存读取游戏文件 (23)4.9.1保存文件: (24)4.9.2读取文件: (25)第五章测试分析 (26)结论和心得体会 (27)致谢 (28)参考文献: (29)课程设计任务书一、课程设计目的课程设计是工科各专业的主要实践性教学环节之一,是围绕一门主要基础课或专业课,运用所学课程的知识,结合实际应用设计而进行的一次综合分析设计能力的训练。
课程设计旨在培养学生在本课程范围内,初步掌握解决实际应用问题时所应具有的查阅资料、综合运用所学知识的能力,为课程设计及今后从事专业工作打下基础。
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
怎样和电脑下五子棋
如果你不想在线玩五子棋,网络上有五子棋单机版程序下载,下载安装后可以人机对走,也可以双人对弈;下面是有怎样和电脑下五子棋方法,欢迎参阅。
登录百度如软件中心,搜索欢乐五子棋,点击下载,进行安装。
这是棋盘布局,有纵横各15条线,纵横交错,总共有225个交叉点,这是落字的地方。
上面有菜单,底下还有悔棋和音乐工具。
单击选项可以选择先手,后手,人机还是双人走法。
此外还可以单击难度设置难度等级。
单击游戏,选择新游戏开始下棋。
黑棋一着不慎,马上就要输了,赶紧点右下角的悔棋按钮,赖皮一次吧。
人机对弈很无聊,来点音乐吧,点击喇叭按钮可播放音乐。
怎么样,你学会使用该软件了吗?。
五子棋游戏文档一.游戏规则1.游戏人数2人2.第一局游戏先进入准备状态的玩家持黑棋,第二局持棋颜色互换,如一人中途或游戏结束后离开游戏,则剩重新判断3.棋盘大小为15*154.五连方向横,斜,竖5.在棋盘中双方均不能形成五连为和棋(判断棋盘上双方在剩余空间是否能够形成五连,如不能判为和棋,此和棋为系统强制)二.特殊规定(不建议添加,用户量极少,对于一般用户来说规则过于复杂)1.三手可交换:棋盘上第3手棋之后,即黑棋在下第2手棋之后白棋第2手之前,如感觉黑方棋形不利于白方,白方可以交换,即执白棋一方变为执黑棋一方2.五手两打:黑棋在下关键的第5手棋时,必须下两步棋,让白方在这两步棋中任选一步,然后再继续游戏三.禁手规则1.禁手是指在黑棋行棋过程中不能在一步时形成两个活三或活四,或长冲(长冲即6连)2.黑棋方在形成五连形成禁手,此时因形成五连禁手失效,黑棋方胜利3.禁手是对局中被判为负的行棋手段,白棋无禁手4.黑棋可以以冲四活三的行棋取胜5.当黑棋方形成任意禁手时,直接判负四.左软键游戏操作选项及其功能1.认输:向对方发送认输请求,对方同意后判发起方认输,对方不同意游戏继续进行2.悔棋:向对方发送悔棋请求,对方同意后恢复到发起方上一步棋,对方不同意游戏继续进行3.和棋:向对方发送和棋请求,对方同意后此局为和棋,对方不同意游戏继续进行五.思考时间规则1.正常计时:每位用户有10分钟的思考时间,倒数进行,走棋方思考时另一方思考时间暂停,当走棋方完成走棋另一方开始扣除思考时间,先用完思考时间的一方判负2.读秒:每步棋思考时间为30秒,倒数进行,用户在规定时间内未走棋直接判负六.游戏分区1.非游戏币普通区:无限制条件任意用户均可进入,占所有房间比例最多,4成2.非游戏币高手区:LV10以上用户才可进入,占所有房间比例中,2成3.游戏币专区:拥有一定数量的游戏币用户才可进入,占所有房间比例中,2成4.高倍游戏币专区:拥有一定数量的游戏币用户才可进入,占所有房间比例低,1成5.禁手特殊规则区(假如添加特殊规则):启用禁手规则以及特殊规则,任意用户均可进入,占所有房间比例低,1成(如不做特殊规则,该区只包含禁手房)七.房间分类1.普通区1.1.普通房:无任何限制条件任意用户均可进入2.高手区2.1.高手房:无特殊规则限制,最低级房间为10级房,按等级划分每5级或10级一阶梯,具体等级跨度待定3.游戏币专区3.1.游戏币房:无特殊规则限制,无等级要求限制,用户必须持有至少进行一局所需要的游戏币,具体数额待定4.高倍游戏币房间(具体倍数待定)4.1.2倍房:无特殊规则限制,无等级要求限制,输赢游戏币得失*2,用户必须持有至少进行一局所需要的游戏币,具体房间数待定4.2.3倍房:无特殊规则限制,无等级要求限制,输赢游戏币得失*3,用户必须持有至少进行一局所需要的游戏币,具体房间数待定4.3.5倍房:无特殊规则限制,无等级要求限制,输赢游戏币得失*5,用户必须持有至少进行一局所需要的游戏币,具体房间数待定4.4.10倍房:无特殊规则限制,无等级要求限制,输赢游戏币得失*10,用户必须持有至少进行一局所需要的游戏币,具体房间数待定5.禁手特殊规则区(如不做特殊规则,该区只包含禁手房)5.1.禁手房:采用禁手规则,任意用户均可进入,输赢得失无变化,房间比例高5.2.五手两打房:采用禁手规则;五手两打规则,任意用户均可进入,输赢得失无变化,房间比例低5.3.三手交换;五手两打房:采用禁手规则;三手交换;五手两打规则,任意用户均可进入,输赢得失无变化,房间比例低八.禁手规则补充1.三三禁手:黑方一步落下同时形成两个活三,为三三禁手2.四四禁手:黑方一步落下同时形成两个活四,为四四禁手3.长连禁手:黑方超过五个子连在一起注:黑棋只有四三可以走,即冲四活三。
南京理工大学毕业设计说明书(论文)作者: 李国防准考证号:014910253063教学点: 南京信息职业技术学院专业: 电子工程专业题目: 五子棋对弈系统设计徐小平副教授指导者:(姓名) (专业技术职务)评阅者:(姓名) (专业技术职务)2012年 05 月毕业设计说明书(论文)中文摘要毕业设计说明书(论文)外文摘要本科毕业设计说明书(论文)第I共I页目次1引言 (1)2五子棋概述 (2)2.1五子棋背景及规则 (2)2.2开发工具下图形界面函数的介绍 (2)3设计思想 (4)3.1总体模版的设计 (4)3.2五子棋程序框架总图 (4)4模块介绍 (5)4.1初始化模块 (5)4.2接收处理信息模块 (8)4.3走棋控制模块 (9)5数据测试 (15)6 对人工智能对弈模式的设想 (17)6.1棋型的定义 (17)6.2棋型价值的定义及计算 (19)结论 (21)致谢 (22)参考文献 (23)附录(源程序) (24)1 引言随着人工智能的发展,越来越多的软件游戏应运而生,伴随着其庞大功能的同时,给出了各种越来越多的规则限制,更多的局限于游戏的竞技能力,逐步忽略了其原始为大众所追捧的趣味性,简单性。
因此,富有各种规则的棋类游戏渐渐淡出,而让我们迷恋追捧的却是那些简简单单,无太多章法,却趣味十足的软件游戏,如:“愤怒地小鸟”、“汤姆猫”等。
而本文则摆脱了棋类游戏的各种附带限制,将传统的五子棋游戏,通过DOXBOX系统给大家展示,将规则交给玩家,可塑性强。
与此同时,本文尽管基于TC工具来实现,但却别开生面,遗弃了复杂模糊的字符界面,完全体现了图形库函数的应用,呈现了简洁、大方的图形界面。
在论文的进展过程中,首先遇到的最大的难题就是对于图形库函数的认知不够全面,一些细致的东西,没抓到点的要求,从而导致程序一次次的编译失败。
在经过多次研究,比对和尝试后,最终才得以成功。
其次,因在win7下无法实现win-tc的全屏显示,多次失败后选择更换XP系统来完成,最后论文的书写过程中,因为全屏后无法剪切图片,而导致无法顺利完成论文,后经查询,确定用DOXBOX来实现,才得以成功完成。
帮助系统内含系统提供的帮助文档,本程序可以直接运行,通过点击察看左侧的标题可以查到所有相关内容的说明,有的还有例子。
本帮助系统还具有关键字关联查询的功能,您可以在editplus里面通过简单的设置实现,具体方法如下:选tools->Configure User Tools...中选Add Tool->program然后Menu text随便填(如fcc_help)command选择fc2help.exe全路径名argument里选$(CurWord)这样您就可以在编写脚本的时候,如果想查帮助只要把光标移到需要查询的单词上,然后按你刚才设置的自定义工具的热键(比如ctrl+2),帮助系统就可以直接跳到该关键词处。
调试跟踪工具可以显示FancyBox运行过程中的调试信息和错误信息,并可以显示对应的源程序。
具体使用方法,就是在运行自己写的程序前,先运行跟踪调试器,再正常运行自己的程序,这样程序中的信息和错误就会送到这个调试器的窗口中。
信息是按照执行顺序输出的,如果出现错误信息会用红颜色字体显示,并给出相应原因。
你只要双击红色信息,工具就会调用editplus编辑器来打开相应文件并定位在出错误的代码行上,十分方便。
本工具可以自动随着鼠标移到窗口上而调整窗口尺寸,还具备半透明显示的效果(win2000以上),而且可以用户自由的选择是否打开这些功能和效果。
Fcc语言概述--------------------------------------------------------------------------------一种解释型程序语言类似basic和javascript语言,fcc是一种解释执行的语言,运行时由FancyBox系统内核中的脚本运行器解释运行。
由于运行时采用预编译模式,所以执行速度还比较理想。
是一种面向对象的语言fcc是一种面向对象语言,它的语法比较接近C++,比较适合爱好者学习使用。
井字棋(⼈机对战版)游戏介绍井字棋,英⽂名叫Tic-Tac-Toe,是⼀种在3*3格⼦上进⾏的连珠游戏,和五⼦棋类似。
然后由分别代表O和X的两个游戏者轮流在格⼦⾥留下标记(⼀般来说先⼿者为X),任意三个标记形成⼀条直线(包括⾏、列、对⾓线、反对⾓线),则为获胜。
解决策略重点在于电脑⽅如何下棋,我们采取估计棋局每个位置的权重,⾸先要对棋局进⾏分类。
---3个为空,重要性最低,权值设置为1 //视为暂时不管---2个空1个对⽅,重要性次低,权值为10 //⼀下三个区别不⼤,可⽐较随意的设置----1个空格1个对⽅1个⼰⽅,重要⾏较低,权值50 ----2个空格1个⼰⽅,重要性较⾼,权值为100---1个空格2个对⽅,重要性次⾼,权值500 //不堵住会输---1个空格2个⼰⽅,重要性最⾼,权值1000 //可以直接赢注意⼏点:1、权值之间的间距可以设⼤⼀点2、对每个空位置,权值等于⾏权值+列权值+对⾓线权值+反对⾓线权值,这4中权值都可以⽤上⾯的估算,但不做改进会出bug考虑如下情况:(1,3)-->(3,1)-->(1,1)-->(2,1)电脑就输了---->--->-->-->⼈获胜关键在于第⼆步,应该选择⼀个⾮⾓的位置,原因在于此时右上⾓位置的权值⼤于中上位置,分析权值的来源右上⾓时,10+10+100(对⾓线⼰⽅),⽽中上时,10+100(⾏⼰⽅),所以同样是2空1⼰⽅时,⼰⽅位于⾏或列的权重应⼤于⼰⽅位于对⾓线。
所以按⾏或列计算时,2空1⼰⽅的权值可改为200代码实现1 #include<stdio.h>2 #include<Windows.h>34const int ROW = 3;5const int COL = 3;6int chessboard[ROW][COL];7int score[ROW][COL];89void Initmap();10void Showmap(); //打印棋局11bool isWin(); //判断是否有⼀⽅获胜12bool isFull(); //判断棋盘是否为满13void PcPlay(); //电脑下棋14void HumanPlay(); //⼈下棋1516int main()17{18 Initmap();19 Showmap();20while ((!isFull()) && (!isWin()))21 {22 HumanPlay();23 system("cls");24 Showmap();25if (isWin())26break;2728 Sleep(500); //模拟实际过程,让电脑慢点,hh29 PcPlay();34if (isFull())35 printf("\n\n平局\n");3637 system("pause");38return0;39}4041void Initmap()42{43for (int i = 0; i < ROW; i++)44for (int j = 0; j < COL; j++)45 chessboard[i][j] = 1;46}4748void Showmap()49{50for (int i = 0; i < ROW; i++)51 {52for (int j = 0; j < COL; j++)53 {54if (chessboard[i][j] == 1) //"1"代表空55 printf("□");56if (chessboard[i][j] == 2) //"2"代表⼈57 printf("■");58if (chessboard[i][j] == 5) //"5"代表电脑59 printf("●");60 }61 printf("\n");62 }63}6465bool isWin()66{67int sum = 0;68for (int i = 0; i < ROW; i++) //对每⾏判断是否获胜 69 {70for (int j = 0; j < COL; j++)71 sum += chessboard[i][j];7273if (sum == 6)74 {75 printf("⼈获胜!\n");76return true;77 }78if (sum == 15)79 {80 printf("电脑获胜!\n");81return true;82 }83 sum = 0;84 }8586for (int j = 0; j < ROW; j++) //对每列判断是否获胜 87 {88for (int i = 0; i < COL; i++)89 sum += chessboard[i][j];9091if (sum == 6)92 {93 printf("⼈获胜!\n");94return true;95 }96if (sum == 15)97 {98 printf("电脑获胜!\n");99return true;100 }105 sum += chessboard[i][i];106if (sum == 6)107 {108 printf("⼈获胜!\n");109return true;110 }111if (sum == 15)112 {113 printf("电脑获胜!\n");114return true;115 }116117 sum = 0;118for (int i = 0; i < ROW; i++) //对反对⾓线判断是否获胜119 sum += chessboard[i][2 - i];120if (sum == 6)121 {122 printf("⼈获胜!\n");123return true;124 }125if (sum == 15)126 {127 printf("电脑获胜!\n");128return true;129 }130131return false;132}133134bool isFull()135{136for (int i = 0; i < ROW; i++)137for (int j = 0; j < COL; j++)138if (chessboard[i][j] == 1)139return false;140return true;141}142143void HumanPlay()144{145int x, y;146 printf("请输⼊棋⼦的横坐标X:");147 scanf_s("%d", &x);148 printf("请输⼊棋⼦的纵坐标Y:");149 scanf_s("%d", &y);150151while (x < 1 || x>3 || y < 1 || y>3)152 {153 printf("\n请正确输⼊!\n");154 printf("x,y均属于1~3\n\n");155156 printf("请输⼊棋⼦的横坐标X:");157 scanf_s("%d", &x);158 printf("请输⼊棋⼦的纵坐标Y:");159 scanf_s("%d", &y);160 }161162while (chessboard[3 - y][x - 1] != 1)163 {164 printf("\n\n该位置已被占⽤!\n");165 printf("请选择正确的位置\n\n");166 Sleep(1000);167168 printf("\n请输⼊棋⼦的横坐标X:");169 scanf_s("%d", &x);170 printf("请输⼊棋⼦的纵坐标Y:");171 scanf_s("%d", &y);176177void PcPlay()178{179int sum = 0;180for (int i = 0; i < ROW; i++)181for (int j = 0; j < COL; j++)182 score[i][j] = 0;183184// 对每⾏进⾏分数统计185for (int i = 0; i < ROW; i++)186 {187for (int j = 0; j < COL; j++)188 sum += chessboard[i][j];189190switch (sum)191 {192case3: //1+1+1;重要性:最低;权重:1193for (int k = 0; k < COL; k++)194 {195if (chessboard[i][k] == 1)196 score[i][k] += 1;197 }198break;199case4: //1+1+2;重要性:次低;权重:10 200for (int k = 0; k < COL; k++)201 {202if (chessboard[i][k] == 1)203 score[i][k] += 10;204 }205break;206case8: //1+2+5;重要性:较低,权值50207for (int k = 0; k < COL; k++)208 {209if (chessboard[i][k] == 1)210 score[i][k] += 50;211 }212break;213case7: //1+1+5;重要性:较⾼;权重:200 214for (int k = 0; k < COL; k++)215 {216if (chessboard[i][k] == 1)217 score[i][k] += 200; //把⾏列的重要性⽐对⾓线⾼218 }219break;220case5: //1+2+2;重要性:次⾼;权重:500 221for (int k = 0; k < COL; k++)222 {223if (chessboard[i][k] == 1)224 score[i][k] += 500;225 }226break;227case11: //1+5+5;重要性:最⾼;权重:1000 228for (int k = 0; k < COL; k++)229 {230if (chessboard[i][k] == 1)231 score[i][k] += 1000;232 }233break;234 }235 sum = 0;236 }237238// 对每列进⾏分数统计239for (int j = 0; j < COL; j++)240 {241for (int i = 0; i < ROW; i++)242 sum += chessboard[i][j];247for (int k = 0; k < COL; k++)248 {249if (chessboard[k][j] == 1)250 score[k][j] += 1;251 }252break;253case4:254for (int k = 0; k < COL; k++)255 {256if (chessboard[k][j] == 1)257 score[k][j] += 10;258 }259break;260case8:261for (int k = 0; k <262 COL; k++)263 {264if (chessboard[k][j] == 1)265 score[k][j] += 50;266 }267break;268case7:269for (int k = 0; k < COL; k++)270 {271if (chessboard[k][j] == 1) //1+1+5;重要性:较⾼;权重:200 272 score[k][j] += 200;273 }274break;275case5:276for (int k = 0; k < COL; k++)277 {278if (chessboard[k][j] == 1)279 score[k][j] += 500;280 }281break;282case11:283for (int k = 0; k < COL; k++)284 {285if (chessboard[k][j] == 1)286 score[k][j] += 1000;287 }288break;289 }290 sum = 0;291 }292293// 对对⾓线进⾏分数统计294for (int i = 0; i < ROW; i++)295 sum += chessboard[i][i];296switch (sum)297 {298case3:299for (int i = 0; i < COL; i++)300 {301if (chessboard[i][i] == 1)302 score[i][i] += 1;303 }304break;305case4:306for (int i = 0; i < COL; i++)307 {308if (chessboard[i][i] == 1)309 score[i][i] += 10;310 }311break;312case8:313for (int i = 0; i < COL; i++)319case7: //1+1+5;权重:100320for (int i = 0; i < COL; i++)321 {322if (chessboard[i][i] == 1)323 score[i][i] += 100;324 }325break;326case5:327for (int i = 0; i < COL; i++)328 {329if (chessboard[i][i] == 1)330 score[i][i] += 500;331 }332break;333case11:334for (int i = 0; i < COL; i++)335 {336if (chessboard[i][i] == 1)337 score[i][i] += 1000;338 }339break;340 }341342// 对反对⾓线进⾏分数统计343 sum = 0;344for (int i = 0; i < ROW; i++)345 sum += chessboard[i][2 - i];346switch (sum)347 {348case3:349for (int i = 0; i < COL; i++)350 {351if (chessboard[i][2 - i] == 1)352 score[i][2 - i] += 1;353 }354break;355case4:356for (int i = 0; i < COL; i++)357 {358if (chessboard[i][2 - i] == 1)359 score[i][2 - i] += 10;360 }361break;362case8:363for (int i = 0; i < COL; i++)364 {365if (chessboard[i][2 - i] == 1)366 score[i][2 - i] += 50;367 }368break;369case7:370for (int i = 0; i < COL; i++)371 {372if (chessboard[i][2 - i] == 1) //1+1+5;权重:100 373 score[i][2 - i] += 100;374 }375break;376case5:377for (int i = 0; i < COL; i++)378 {379if (chessboard[i][2 - i] == 1)380 score[i][2 - i] += 500;381 }382break;383case11:384for (int i = 0; i < COL; i++)390 }391392int maxRow = 0, maxCol = 0;393for (int i = 0; i < ROW; i++)394for (int j = 0; j < COL; j++)395 {396if (score[i][j] > score[maxRow][maxCol]) 397 {398 maxRow = i;399 maxCol = j;400 }401 }402 chessboard[maxRow][maxCol] = 5;403 }。
C语言程序设计报告题目: 五子棋班级: 电气Q1041班人数: 3人小组成员: 周啸天、万广富、黄山奇指导老师:桂超目录第一章课程设计的目的和要求课程设计的目的1.加深对C语言数据类型,运算,语句结构及其程序设计的基本方法理解和掌握;2.熟练掌握流程图的绘制、程序设计文档的书写;3.通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后的学习打下坚实的基础;4.熟悉C语言游戏编程,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。
课程设计的要求1、编写程序代码,调试所写程序使其能够正确运行;2、能进行基本的五子棋操作,有图形界面,能够用键盘操作;3、能够实现悔棋、存档和读档等附加功能课程设计的实验环境该课程设计在设计与实验过程中需要在windows XP系统/windows 2000以上系统中进行,程序设计要求在visual C++平台中进行,完成代码的编写、编译、调试、测试等工作。
本游戏对计算机硬件和操作系统要求极低,所以在这里只是把自己的电脑硬件参数和系统参数列下:硬件:Cpu:,内存,2GB,硬盘:320GB,操作系统:windows xp软件环境:安装VC++第二章功能描述本程序用C语言实现了五子棋游戏,能进行基本的五子棋操作。
程序能实现界面的初始化功能、下棋功能、人机智能对战功能、胜负判断功能、悔棋功能、读档及存档功能,通过键盘操作控制下棋。
(1)显示欢迎界面。
在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;(2)初始化功能。
程序初始化屏幕和棋盘,默认玩家先行。
(3)下棋操作。
利用W、S、A、D及空格键实现下棋操作,在下棋过程中能随时按ESC键退出。
(4)人机智能对战功能。
电脑根据玩家的下棋对棋盘进行智能分析,然后下棋,实现人机对弈。
(5)悔棋功能。
玩家可以有三次悔棋机会。
(6)胜负判断功能。
程序能对下棋的结果进行判断,分出胜负。
并显示获胜方。
(7)读档、存档功能。