五子棋游戏程序设计

合集下载

五子棋游戏程序设计

五子棋游戏程序设计
C语言综合编程训练
C程序组成
C程序
源程序1 …… 源程序2 …… 源程序n
预编译命令
函数1
……
函数n
说明部分
执行部分
开发方法: 自上向下,逐步细化,模块化设计,结构化编码
五子棋游戏程序
一个综合实例的分析
五 子 棋 游 戏 程 序
一个综合实例的分析
一般来说,开发一个软件要经过以下步骤:
确定软件的功能
按航班号查询 按终点站查询
系统进入画面(静态或动画) 承办订票和退票业务(可选项)
参考设计题目三:学生选修课程系统设计
假定有n门课程,每门课程有课程编号,课程名称, 课程性质,总学时,授课学时,实验或上机学时, 学分,开课学期等信息,学生可按要求(如总学分 不得少于60)自由选课。试设计一选修课程系统, 使之能提供以下功能: 系统以菜单方式工作 课程信息录入功能(课程信息用文件保存)--输入 课程信息浏览功能--输出 查询功能:(至少一种查询方式)--算法
§2 Turbo C绘图
Turbo C支持的适配器和图形模式 图形库文件与图形头文件 适配器 模式 分辨率 颜色数 标识符 graphics.lib与graphics.h 0 4 CGAC0 320 200 CGA 图形显示的坐标与象素 4 CGAC1 (彩色图形 1 320 200
适配器) (0,0)
颜色控制函数

设调色板:setpalette() 设背景色:setbkcolor() 设绘图色:setcolor()
颜色值 0 1 2 3 4 5 6 7
颜色名
BLACK BLUE
颜色 颜色值 黑 蓝 绿 青 红 洋红 棕 浅灰 8 9
颜色名
DARKGRAY

基于JAVA的五子棋游戏设计

基于JAVA的五子棋游戏设计

基于JAVA的五子棋游戏设计五子棋是一种非常有趣的棋类游戏,主要目标是在棋盘上先形成五个连续的子的一方取胜。

为了设计一款基于JAVA的五子棋游戏,我们需要考虑以下几个方面:1.游戏界面设计:游戏界面需要包括一个棋盘和一些控制按钮。

可以使用Java GUI库(如Swing或JavaFX)来创建游戏界面,使用布局管理器来放置棋盘和按钮。

2.游戏规则设计:游戏规则非常简单。

两位玩家交替下棋,玩家可以在棋盘上的任意空闲位置下子。

首先形成五个连续的子的一方获胜。

可以使用二维数组来表示棋盘的状态,并在每次下子后更新数组的值。

3.游戏逻辑设计:游戏逻辑包括判断玩家下子的合法性、判断游戏是否结束以及判断获胜方等。

可以使用条件语句和循环结构来实现游戏逻辑。

下面是一种可能的五子棋游戏设计方案:```javaimport javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class GomokuGame extends JFrameprivate final int BOARD_SIZE = 15;private JButton[][] buttons;private int[][] board;private int currentPlayer;public GomokuGamsetTitle("Gomoku Game");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(600, 600);setLayout(new GridLayout(BOARD_SIZE, BOARD_SIZE));buttons = new JButton[BOARD_SIZE][BOARD_SIZE];board = new int[BOARD_SIZE][BOARD_SIZE];currentPlayer = 1;for (int i = 0; i < BOARD_SIZE; i++)for (int j = 0; j < BOARD_SIZE; j++)buttons[i][j] = new JButton(;buttons[i][j].setBackground(Color.WHITE);buttons[i][j].addActionListener(new ButtonListener(i, j));add(buttons[i][j]);}}setVisible(true);}private class ButtonListener implements ActionListener private int row;private int col;public ButtonListener(int row, int col)this.row = row;this.col = col;}public void actionPerformed(ActionEvent e)if (buttons[row][col].getBackground( == Color.WHITE)buttons[row][col].setBackground(currentPlayer == 1 ? Color.BLACK : Color.WHITE);board[row][col] = currentPlayer;if (isWinningMove(row, col))JOptionPane.showMessageDialog(null, "Player " + currentPlayer + " wins!");System.exit(0);}currentPlayer = currentPlayer == 1 ? 2 : 1;} elseJOptionPane.showMessageDialog(null, "Invalid move!");}}}private boolean isWinningMove(int row, int col)// Check horizontalint count = 0;for (int i = row - 4; i <= row + 4; i++)if (i >= 0 && i < BOARD_SIZE && board[i][col] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check verticalcount = 0;for (int j = col - 4; j <= col + 4; j++)if (j >= 0 && j < BOARD_SIZE && board[row][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check diagonal1count = 0;for (int i = row - 4, j = col - 4; i <= row + 4 && j <= col + 4; i++, j++)if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}// Check diagonal2count = 0;for (int i = row - 4, j = col + 4; i <= row + 4 && j >= col - 4; i++, j--)if (i >= 0 && i < BOARD_SIZE && j >= 0 && j < BOARD_SIZE && board[i][j] == currentPlayer)count++;if (count >= 5)return true;}} elsecount = 0;}}return false;}public static void main(String[] args)new GomokuGame(;}```以上是一种简单的基于JAVA的五子棋游戏设计方案,游戏界面使用了JFrame和JButton来创建,游戏逻辑通过按钮的点击事件来实现。

五子棋程序设计关键知识点

五子棋程序设计关键知识点

五子棋程序设计关键知识点五子棋是一种古老而受欢迎的策略性棋类游戏,对于想要开发五子棋程序的人来说,了解一些关键的程序设计知识点是非常重要的。

本文将介绍五子棋程序设计的几个关键知识点。

一、界面设计五子棋程序首先需要一个用户界面,供用户进行游戏操作。

在界面设计中,需要考虑到棋盘的大小、棋子的大小和颜色以及游戏按钮的布局等因素。

为了使界面美观和易于操作,可以使用图形界面库进行设计和实现。

二、棋盘表示在程序中,需要用数据结构来表示棋盘。

一种常用的方法是使用二维数组表示棋盘,每个元素表示一个位置,可以用数字或者字符表示该位置的状态,比如空、黑子或白子。

程序需要记录每步棋的位置,并在每一步棋后更新棋盘状态。

三、游戏逻辑五子棋的游戏逻辑非常重要。

程序需要实现落子、判断胜负、判断是否有禁手等功能。

其中,落子操作需要判断该位置是否为空,如果为空则可以落子,否则需要提示用户。

胜负判断需要判断是否存在五个连续的棋子,禁手判断需要检查是否出现三三禁手和四四禁手等特殊情况。

四、人机对战五子棋程序通常需要支持人机对战功能。

在实现人机对战时,需要设计一个合适的算法来模拟人类玩家的思考和决策过程。

常见的算法包括极大极小搜索、Alpha-Beta剪枝等,通过评估棋局局势来选择最佳的下一步落子位置。

五、网络对战现在的五子棋程序还常常支持网络对战功能,使得不同玩家可以远程对弈。

实现网络对战需要考虑到客户端和服务器的通信,可以使用Socket编程或者Web服务来实现。

在设计网络对战功能时,还需要考虑到用户认证、数据传输加密等问题。

六、人工智能为了增加游戏的趣味性和挑战性,很多五子棋程序还会加入人工智能功能。

通过机器学习和深度学习等技术,让程序具备学习和改进的能力,提高程序的下棋水平。

人工智能的实现需要大量的训练数据和算法模型,对于程序员来说是一项具有挑战性的任务。

总结:五子棋程序设计的关键知识点包括界面设计、棋盘表示、游戏逻辑、人机对战、网络对战和人工智能等。

五子棋程序设计课程设计报告书

五子棋程序设计课程设计报告书

目录1、引言 (3)1.1 编写目的 (3)1.2 读者对象 (3)1.3 软件项目概述 (3)1.4 文档概述 (4)1.5 定义 (4)1.6 参考资料 (4)2、任务概述............................................................... 错误!未定义书签。

2.1目标 (4)2.2软件的开发和运行环境 (5)2.3 用户特征 (5)2.4 假设与约束 (5)2.5 进度要求 (6)2.6验收要求 (6)3、功能需求描述与测试方案: (7)4、界面要求 (20)5、功能设计 (21)5.1类的关系描述 (21)5.2类的设计 (21)6、使用指南 (23)7、总结 (23)8、附录 (24)1、引言1.1 编写目的本文档为用户和软件设计者提供一个交流的平台。

在其中包含了用户所要求完成的功能,软件设计师实现的初步设想并最终实现的代码。

同时,为用户提供了使用的约束条件、使用手册,方便用户更好的使用本软件。

1.2 读者对象本文档的读者是最终验收者(教员和辅导员)。

1.3 软件项目概述●项目名称:五子棋游戏●简称:五子棋●项目代号:无●软件项目的大致功能和性能要求为:1)设计一个五子连珠类;2)记录游戏双方的游戏过程,允许悔棋;3)实现保存棋谱和根据棋谱复盘的功能;4)判断双方输赢,先走出五子连珠的一方胜;5)响应用户的鼠标消息,并显示棋盘信息;6)判断先下者落子时不允许走禁手。

1.4 文档概述本文档向用户和验收人员提供了一个很好的了解效果。

在文档中,有用户提出的需求(功能),有整个框架的具体描述,有每一个添加功能的具体实现代码以及测试结果。

最终具体描述了软件使用的说明。

1.5 定义五1.6 参考资料【1】《程序设计课程设计》国防科大印刷厂【2】《面向对象程序设计与Visual C++ 6.0教程》清华大学出版社【3】《Visual C++ 6.0 》人民邮电大学出版社【4】《Visual C++ 实用教程》电子工业出版社2、任务概述2.1目标用户提出需要设计出一个五子棋游戏,可以在任何的情况下都可以独立的运行。

五子棋游戏C语言

五子棋游戏C语言

五子棋游戏程序设计(C语言实现)一、设计任务与目标设计两个人对战的五子棋游戏,游戏开始界面是显示游戏的规则,然后让用户输入命令以确定游戏是否开始,如果用户确定开始,那么要显示棋盘,接下来到了最重要的几步,两个玩家交替落子,当连续五个棋子在一条直线上时,一方赢棋,游戏结束。

其中,有些问题就是平时基本的输入输出问题,例如:游戏规则,可以直接打印。

棋盘的显示也是一般的图形输出问题,但是稍微复杂一些。

需要改进的地方和达到的目标是:1、游戏的初始界面显示的是游戏规则,当玩家确定开始的时候要清除界面来显示棋盘。

2、棋盘和棋子的显示,界面(棋子和棋盘)容易分辨,这要从颜色和图形上加以区分。

3、要求一方用‘W’(上)、‘S’(下)、‘A’(左)、‘D’(右),另一方用‘↑’、‘↓’、‘←’、‘→’来移动光标,再分别用‘Z’和‘空格’键确定落子。

4、当一方走棋时,另一方的按键应该设置为无效。

5、游戏进行时打印提示信息,当一方赢棋后,要显示赢棋的字符,并询问玩家是否继续开始。

6、可以随时退出游戏或重新开始游戏。

二、方案设计与论证首先设置游戏的初始界面,采用白色背景和红色前景,这可以调用‘conio.h’库函数实现打印游戏规则。

询问玩家是不是开始游戏,通过选择Y\N来确定。

其中会遇到这样的问题:当玩家输入的不是‘Y(y)’或者‘N(n)’时应该怎么办呢?如果采用scanf函数来接收命令,这样会显示一个不满足要求的字符,于是可以用getch函数来接收命令,判断输入的字符是否为‘Y(y)’和‘N(n)’,如果是再显示出来。

为了界面的简洁,进入游戏前先清除屏幕,调用‘system()’函数来实现。

然后打印棋盘,可以把背景设置为湖蓝色,这样棋盘和棋子更容易分辨。

游戏开始后棋盘用黑色显示,这样易于区分。

具体的思路是:由于棋盘是网格状的,所以选择一个基本图形字符串‘十’,通过循环打印而构成一张大图。

接下来确定落子的位置,这需要通过改变光标的位置来实现,考虑到是在vc6.0环境下编译文件,c语言中的有些库函数并不支持,所以选择了’gotoxy()’函数并结合‘window.h’下的函数,通过键盘按键控制达到光标移动功能。

(最新版)五子棋毕业课程设计报告

(最新版)五子棋毕业课程设计报告

上海海事大学程序设计课程设计报告课程题目FIVE CHESS GAME作者姓名学号联系方式指导教师学科(专业)所在学院提交日期目录1引言 (3)1.1五子棋介绍 (3)1.2选题背景和动机 (3)1.3系统所要解决的问题 (3)2 系统框架 (5)2.1棋盘类 (6)2.1.1 主要成员变量说明: (6)2.1.2清空棋盘——Clear (6)2.1.3绘制棋子——Draw (6)2.1.4左键消息——OnLButtonUp (7)2.1.5载入棋盘 (7)2.1.6对方落子完毕——Over (7)2.1.7设置游戏模式——SetGameMode (7)2.1.8胜负的判断——Win (7)2.2游戏模式类 (8)3关键技术 (9)3.1 棋盘对话框的制作 (9)3.1.1 对话框机制 (9)3.1.3 棋子 (10)3.2 人机对弈 (10)3.2.1 难度的选择 (10)3.2.2 机器的落子判断 (11)4运行结果 (15)4.1开发环境及运行环境 (15)4.1.1开发环境 (15)4.1.2运行环境 (15)4.2运行图示 (15)4.2.1 棋盘显示 (15)4.2.2 开始的选择对话框 (16)4.2.3 主界面中的游戏难度选项 (16)4.2.4 电脑的应对 (17)5调试分析 (19)6总结 (21)参考文献 (22)1引言1.1五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。

现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。

五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。

JAVA课程设计 五子棋(内附完整代码)

JAVA课程设计 五子棋(内附完整代码)

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语言有了更深的了解。

C语言五子棋游戏程序课程设计

C语言五子棋游戏程序课程设计

C语言五子棋游戏程序课程设计C++五子棋游戏程序设计一、课设内容1. 掌握C++基本编程风格。

2. 编写程序代码,实现各个模块的功能。

3. 完成小型游戏应用系统的设计开发.4. 关键语句写注释。

5. 测试程序,写出测试报告。

6. 在实验报告写出综合设计心得。

二、实验内容在此次大作业中,我学习设计一个五子棋游戏的程序,源代码及分析如下:#include#includevoid shuchu(char a[15][15]){int x,y,i;cout<<" ";for(i=0;i<15;i++)cout<<setw(3)<<i;< p="">cout<<endl;< p="">for(x=0;x<15;x++){cout<<setw(2)<<x;< p="">for(y=0;y<15;y++)cout<<setw(3)<<a[x][y];< p="">cout<<endl;< p="">}}bool osheng(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<11;y++)if(a[x][y]=='o'&&a[x][y+1]=='o'&&a[x][y+2]=='o'&&a[x][y+ 3]=='o'&&a[x][y+4]=='o') return 1;for(x=0;x<11;x++)for(y=0;y<15;y++)if(a[x][y]=='o'&&a[x+1][y]=='o'&&a[x+2][y]=='o'&&a[x+3][ y]=='o'&&a[x+4][y]=='o') return 1;for(x=0;x<11;x++)for(y=0;y<11;y++)if(a[x][y]=='o'&&a[x+1][y+1]=='o'&&a[x+2][y+2]=='o'&&a [x+3][y+3]=='o'&&a[x+4][y+4]=='o' )return 1;for(x=15;x>4;x--)return 0;}bool xsheng(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<11;y++)if(a[x][y]=='x'&&a[x][y+1]=='x'&&a[x][y+2]=='x'&&a[x][y+ 3]=='x'&&a[x][y+4]=='x') return 1;for(x=0;x<11;x++)for(y=0;y<15;y++)if(a[x][y]=='x'&&a[x+1][y]=='x'&&a[x+2][y]=='x'&&a[x+3][ y]=='x'&&a[x+4][y]=='x') return 1;for(x=0;x<11;x++)for(y=0;y<11;y++)if(a[x][y]=='x'&&a[x+1][y+1]=='x'&&a[x+2][y+2]=='x'&&a[ x+3][y+3]=='x'&&a[x+4][y+4]=='x' )return 1;for(x=15;x>4;x--)for(y=15;y>4;y--)if(a[x][y]=='x'&&a[x+1][y-1]=='x'&&a[x+2][y-2]=='x'&&a[x+3][y-3]=='x'&&a[x-4][y+4]=='x') return 1;return 0;}bool he(char a[15][15]){int x,y;for(x=0;x<15;x++)for(y=0;y<15;y++)if(a[x][y]=='-')return 0;return 1;}void main(){int x,y,s,q;char a[15][15];for(x=0;x<15;x++)for(y=0;y<15;y++)cin>>q;if(q==1)goto two;/* elsegoto one; */two:cout<<"请选择是否进入悔棋模式:1.是;2.否\n";cin>>q;if(q==2)goto three;shuchu(a);while(1){s: while(1){cout<<"请玩家1输入下子的坐标"<<endl;< p="">cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p="">else{a[x][y]='o';break;}}shuchu(a);cout<<"是否需要悔棋?是请输入:1;否请输入:0"<<endl;< p=""> cin>>s;switch(s){case 1:a[x][y]='-';goto s;break;case 0:break;}s1: if(osheng(a)){cout<<"玩家1胜";break;}s2: while(1){cout<<"请玩家2输入下子的坐标"<<endl;< p="">cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p="">else{a[x][y]='x';break;}}shuchu(a);cout<<"是否需要悔棋?是请输入:1;否请输入:0"<<endl;< p=""> cin>>s;switch(s){case 1:a[x][y]='-';goto s2;break;case 0:break;}s3: if(xsheng(a)){cout<<"玩家2胜";if(he(a)){cout<<"平局";break;}}three: shuchu(a);while(1){while(1){cout<<"请玩家1输入下子的坐标"<<endl;< p=""> cin>>x>>y;if(a[x][y]=='o'||a[x][y]=='x')cout<<"此处已经有字,请重下"<<endl;< p=""> else{a[x][y]='o';break;}}shuchu(a);if(osheng(a)){cout<<"玩家1胜"; break;}}shuchu(a);if(xsheng(a)){cout<<"玩家2胜"; break;}if(he(a)){cout<<"平局"; break;}}}三、感想体会本实验是用C++来设计完成了五子棋游戏。

五子棋游戏详细设计

五子棋游戏详细设计

五子棋游戏‎详细设计1、窗体设计利用MFC‎ AppWi‎n zard‎生成五子棋‎游戏应用程‎序框架具体‎步骤如下:(1)执行VC程‎序,选择Fil‎e|N ew命令‎,弹出New‎对话框.单击Pro‎jects‎标签,转到Pro‎jects‎选项卡,选择MFC‎ AppWi‎z ard(exe)选项,然后在Pr‎oject‎name文‎本框中输入‎F ivec‎h ess_‎44 。

Lacat‎i on文本‎框是指项目‎的本地路径‎。

(2)单击按钮,弹出MFC‎ AppWi‎n zard‎_Step‎1对话框。

选中单选按‎钮,如图所示。

(3)单击完成按‎钮,则建立一个‎单文档应用‎框架。

2、游戏项目开‎发2.1棋盘设计‎1.在已创建的‎工程Fiv‎eches‎s_44中‎添加画棋盘‎的函数。

首先在“Fivec‎h ess_‎44.h”头文件中定‎义一个用于‎显示棋盘的‎自定义公有‎函数:void Check‎e rboa‎r d(CDC*pDC);然后在“Fivec‎h ess_‎44Vie‎w.cpp”源文件中实‎现该函数。

代码如下:void CFive‎c hess‎_44Vi‎e w::Check‎e rboa‎r d(CDC*pDC){for(int i=0;i<20;i++) //连续画20‎条竖线{pDC->MoveT‎o(i*50,0); //画笔移动到‎(i*50,0)点pDC->LineT‎o(i*50,1000); // 画笔从(i*50,0)点到(i*50,1000)点}for(i=0;i<20;i++) //连续画20‎条横线{pDC->MoveT‎o(0,i*50);pDC->LineT‎o(1000,i*50);}}2.在应用程序‎框架的On‎D raw()函数中调用‎该画棋盘函‎数,将pDC对‎象作为实参‎传递给Ch‎ecker‎b oard‎()函数,代码如下:void CFive‎c hess‎_44Vi‎e w::OnDra‎w(CDC* pDC){CFive‎c hess‎_44Do‎c* pDoc = GetDo‎c umen‎t();ASSER‎T_VAL‎I D(pDoc);// TODO: add draw code for nativ‎e data hereCheck‎e rboa‎r d(pDC); //调用自定义‎的画键盘函‎数}3.编译运行得‎到如下效果‎:一个空棋盘‎2.2放置棋子‎功能的开发‎按照规划,棋子使用鼠‎标的左键和‎右键(分别用这两‎键来表示下‎棋的双方)来进行单机‎下棋,即是当用户‎单击左键时‎,下黑色棋子‎,,用户单击右‎键时,下白色棋子‎。

《JAVA程序设计》课程设计-五子棋小游戏

《JAVA程序设计》课程设计-五子棋小游戏

《JAVA程序设计》课程设计-五子棋小游戏《JAVA程序设计》课程设计题目: 五子棋小游戏业: 信息与计算科学专学号: 070930205等姓名:指导教师: 成绩:二00九年十二月九日1.课程设计研究背景及意义五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。

发展于日本,流行于欧美。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

然则看似很简单的一个小游戏,却对我们这组刚接触JAVA编程的成员来说却是一个不错的挑战,由于水平不限不能做成和电脑进行对战,也对于和其它电脑联机对战的模式不太清楚,故做成一个自己和自己对战的五子棋来考验我们的JAVA 的技术。

2.课程设计题目描述和要求题目:五子棋小游戏游戏主要界面如下:游戏规则:1,棋子分为黑白两色,采用19×19棋盘。

2,自己和自己对战,白子和黑子交替下,直到白子或黑子一方有五粒子连在一起,最先完成五粒子连在一起的一方为胜利的一方(可以是横、竖、斜、反斜)。

3,允许悔棋,且允许一直悔到棋盘上没有棋子了,悔棋后允许恢复。

当悔棋后下子了,则不允许再恢复了。

4,有棋子的地方不允许再下棋子了5,落子后不能移动或拿掉。

7,胜利后,棋局重新开始。

主要功能:1,鼠标点棋盘上的任意一点,棋子会落入离这点最近的一个交叉点处。

2,白子和黑子交替下。

3,当下到一半时,可以保存进度。

4,关闭再打开后,可以重新读取进度再接着下。

5,允许悔棋,且允许一直悔到棋盘上没有棋子了。

6,悔棋后允许恢复。

当悔棋后下子了,则不允许再恢复了。

7,下棋的过程中,随时可以重新开始。

8,有棋子的地方不允许再下子了。

9,当悔到没有棋子的时候会弹出消息。

10,任意一方胜利后会弹出消息11,恢复的步数超过了悔棋的步数的时候会弹出消息12,当任意一方胜利后,棋局重新开始。

13,设有菜单栏,玩家可以点菜单来完成某种操作。

软件作业五子棋程序设计2

软件作业五子棋程序设计2

目录一、内容摘要二、前言三、概述3.1、C语言介绍3.2、C语言特色3.3、C语言特点3.4、C语言语法3.5、开发环境四、需求分析4.1、五子棋发展史4.2、五子棋功能说明五、设计分析5.1重点模块分析5.2流程设计六、程序代码.七、游戏调试八、总结一、内容摘要随着互联网迅速的发展,网络游戏已经成为人们普遍生活中不可或缺的一部分,它不仅能使人娱乐,也能够开发人的智力,就像下文所主要讲的五子棋游戏一样能挖掘人们聪明的才干与脑袋的机灵程度。

本游戏程序能实现两个人对阵下棋,并且程序中能自定义游戏的时间并且也能智能的判定游戏的获胜方和游戏的结束与否,实现两方进行博弈。

二、前言电脑已经深入到日常工作和生活的方方面面,比如文字处理、信息管理、辅助设计、图形图像处理、教育培训以及游戏娱乐等。

Windows系统的推出使电脑从高雅的学术殿堂走入了寻常百姓家,各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的工作。

然而,虽然现在世界上已经充满了花样繁多的各种软件,但它们依然不能满足用户的各种特殊需要,人们还不得不开发适合自己特殊需求的软件。

作为一名学生,在系统的学习了C语言之后,用它编了一些小程序。

这次课程设计,我就想将学过的C语言中的各种技术综合起来,编写一个小游戏,既对自己学过的技能进行一次检验,也能系统地将学过的知识复习巩固。

三、概述C语言是一种计算机程序设计语言。

它既具有高级语言的特点,又具有汇编语言的特点。

它由美国贝尔研究所的D.M.Ritchie于1972年推出。

1978后,C语言已先后被移植到大、中、小及微型机上。

它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。

它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画。

具体应用比如单片机以及嵌入式系统开发。

五子棋程序设计报告参考模板

五子棋程序设计报告参考模板

五子棋程序设计报告班级:姓名:学号:指导老师:2012/1/07一、课程设计题目与要求题目:网络五子棋游戏。

功能要求:该软件应包括服务器端程序和客户端程序两个部分,要求实现的功能如下。

客户端功能要求:(1)友好的用户登录界面设计;(2)登录服务器后,请求用户列表;(3)相其他用户发出邀请,做游戏;(4)当用户加入或离开时,客户端接受服务器发送的成员列表,更新用户列表;(5)当用户开始游戏或游戏结束时,服务器通知客户端用户更新该用户状态,客户端接受该消息后,更新该用户状态;(6)根据五子棋的游戏规则实现五子棋的游戏功能,包括游戏判断、画图等。

服务器端功能要求:(1)服务器接受用户注册信息,服务器最多容纳64 个成员,成员信息包括:用户名、IP 地址、端口和状态,当服务器退出时,保存用户信息;(2)当用户加入或退出,服务器向所有用户发送成员列表,通知客户端更新成员列表;(3)当用户开始游戏或者结束游戏时,服务器通知其他用户更新该用户状态,通知客户端更新成员状态;(4)和客户端一起维护游戏的进行,发送游戏信息。

二、需求分析以及模型框架1. 五子棋游戏是一历史悠久,对抗性强,技巧性高的棋类游戏。

而且我对五子棋有着独特的爱好,希望自己也可以编写出一款可以实现人机对战的五子棋游戏。

把自己的思想付给电脑,让自己有些成就感,给自己继续努力的动力。

借此次课程设计的机会,把想法变成现实。

而且五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。

它是中西文化的交流点,是古今哲理的结晶。

所以此次c++课程设计选择五子棋这个题目。

2.程序所实现的功能通过给电脑赋予人工智能,利用电脑运算速度快的特点,结合五子棋的游戏规则,给电脑设定固定的扫描方式,设定权值,使电脑能够选择最合适的落子点,然后调用加载已做好的棋盘棋子图像,最终实现简单的人机对弈。

C语言课程设计五子棋源代码_+设计报告

C语言课程设计五子棋源代码_+设计报告

C语言程序设计综合实验设计报告题目:班级;人数:小组成员:时间:目录1 课程设计报告1.1课题描述1.2需求分析1.3概要设计2源程序代码3详细设计1.课题设计报告1.1课题分析:游戏介绍:在一个18*18的方格中下棋,两个玩家,根据键盘上的上、下、左、右键及W、S、A、D来控制棋的走向,空格键及回车键表示确定棋子的落下位置,两个玩家为交替下棋,如果于其中任何一家下的五个棋子能够练成一线那么为胜者,游戏结束。

1 、五子棋是两个人之间进行的竞技活动,开始是由P1先下,把棋落在方框内,然后P2下,如此下棋直到一方在棋盘的横,竖,斜将同色的五个棋子连成一条线,则此方获胜。

游戏由玩家决定继续或结束。

1.2需求分析(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;(2)画出棋盘的大小;(3)画棋子并确定棋子的大小;(4)判断键盘输入哪个键执行操作;(5)玩家P1先落棋;(6)玩家轮流下棋;(7)判断赢家。

(8)由玩家决定是否继续新游戏。

1.3 概要设计(1)功能模块2. 主流程图五子棋游戏初始化模块下棋操作模块 判断胜负模块 帮助模块 开始 欢迎界面帮助信息画出18*18棋盘遇到的一个问题:图形一闪而过解决方法因为Win-TC 的图形驱动程序EGAVGA.BGI 文件安装路径为c:\\Win-TC\\projects int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, "c:\\tc")改为initgraph(&gdriver, &gmode, "c:\\Win-TC\\projects")2程序代码#include <bios.h>#include "stdio.h"#include "graphics.h"/*定义1号玩家的操作键键码*/ 定义数组a[X] [Y ]设置初始点设置为(240,170),调用p1move函数,调用p2move函数Enter SpaceESC 用WIN函数判断胜负 游戏结束#define W 0x1177/*上移--'W'*/#define S 0x1f73/*下移--'S'*/#define A 0x1e61/*左移--'A'*/#define D 0x2064/*右移--'D'*/#define SP 0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define UP 0x4800/*上移--方向键up*/#define DOWN 0x5000/*下移--方向键down*/#define LEFT 0x4b00/*左移--方向键left*/#define RIGHT 0x4d00/*右移--方向键right*/#define ENTER 0x1c0d/*落子--回车键Enter*/#define ESC 0x011b#define X (getx()-140)/20 /*将棋盘上光标所在点的横坐标X转化为0-18的数*/ #define Y (gety()-70)/20 /*将棋盘上光标所在点的横坐标Y转化为0-18的数*/int k,w=DETECT,gmode,j,i;int a[20][20];void p1move(); /*定义函数*/void p2move();void win();p1win();p2win();yellow();white();black();heqi();welcome();help();csz();qipang();p1turn();p2turn();p1del();p1turn()/*画左上角的白棋*/{setcolor(7);setfillstyle(1,7);circle(60,110,9);floodfill(60,110,7);}p1del() /*将左上角白棋檫去*/ {setfillstyle(1,14);floodfill(60,110,14);}p2turn() /*画右上角的黑棋*/ {setcolor(0);setfillstyle(1,0);circle(578,115,9);floodfill(578,115,0);}p2del() /*画右上角的黑棋*/ {setfillstyle(1,14);floodfill(578,115,14);}white() /*在当前位置画白棋*/ {setcolor(7);setfillstyle(1,7);circle(getx(),gety(),9); floodfill(getx(),gety(),7); }black() /*在当前位置画黑棋*/ {setcolor(0);setfillstyle(1,0);circle(getx(),gety(),9); floodfill(getx(),gety(),0); }yellow() /*补棋盘的颜色*/ {setcolor(6);setfillstyle(1,6);circle(getx(),gety(),9);floodfill(getx(),gety(),6);setcolor(15);line(getx()-9,gety(),getx()+9,gety());line(getx(),gety()+9,getx(),gety()-9);}qipang() /*画棋盘*/{ setfillstyle(1,6);bar(120,50,520,450);setfillstyle(1,14);bar(540,50,620,150);bar(20,50,100,150);for(k=0;k<19;k++){moveto(140+20*k,70);linerel(0,360);moveto(140,70+20*k);linerel(360,0);}moveto(240,170);setcolor(5);settextstyle(3,0,4);outtextxy(50,60,"P1");outtextxy(560,60,"P2");}welcome() /*欢迎界面*/{ initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ; clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"Welcome");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");delay(1000) ; /*delay(1000000000) ; delay(1000000000) ; */ }help() /*帮助界面*/{initgraph(&w ,&gmode,"c:\\Win-TC\\projects");clearviewport();setcolor(4);settextstyle(0,0,2);outtextxy(80,100,"P1 move; 'W S A D' ");outtextxy(80,120," set : space ");outtextxy(80,180,"P2 move: up down left right ");outtextxy(80,200," set: Enter");outtextxy(80,280,"Whoever is first to gather five ");/*same color pieces in a line without any different color piece among them,then he win */ outtextxy(80,300,"same color pieces in a line without");outtextxy(80,320,"any different color piece among ");outtextxy(80,340,"them, then he win.");outtextxy(80,360,"When you want to quit the game,");outtextxy(80,380,"press Esc.");outtextxy(220,440,"press any key to continue");while(bioskey(1)==0);}p1win() /*玩家1获胜界面*/{initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ;clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"P1 WIN");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(1)==0);main();}p2win() /*玩家2获胜界面*/{clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"P2 WIN");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(0)!=0) main();}heqi() /*和棋界面*/{clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"tie");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(0)!=0) main();}csz() /*将所在位置的A[X][Y]赋初值6*/{for(i=0;i<19;i++)for(j=0;j<19;j++){a[i][j]=6;}}void win() /*判断输赢*/{int sum1,sum2,sum3,sum4,sum=0,n,i,j;for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2){sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4][j+4];sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n]; if(sum1==5||sum2==5||sum3==5||sum4==5)p2win();if (sum1==0||sum2==0||sum3==0||sum4==0)p1win(); }for(i=0;i<18;i++)for(j=0;j<18;j++)sum=sum+a[i][j];if(sum<181)heqi();}void p1move() /*玩家1的移动*/{switch(bioskey(0)){case ESC: {closegraph(); exit(0);}/*如果按键为ESC就退出游戏*/case SP:/*落子*/if(a[X][Y]==6) {p1del();p2turn();a[X][Y]=0;white();win(); p2move();}else p1move();case A: /*向左移*/if(a[X][Y]==0){if(getx()==140) moveto(520,gety());moverel(-20,0);white();}else if(a[X][Y]==1){if(getx()==140) moveto(520,gety());black();moverel(-20,0);white();} else{ yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);white();} p1move();case D: /*向右移*/if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());moverel(20,0);white();}else if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());black();moverel(20,0);white();}else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);white();}p1move();case W: /*向上移*/if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}else if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);black();moverel(0,-20);white();}else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}p1move();case S: /*向下移*/if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);moverel(0,20);white();}else if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);black();moverel(0,20);white();}else { yellow();if(gety()==430) moveto(getx(),50);moverel(0,20);white(); } p1move();default: p1move();}}void p2move() /*玩家2的移动*/{switch(bioskey(0)) /*如果按键为ESC就退出游戏*/{case ESC: {closegraph(); exit(0);}case ENTER: /*落子*/if(a[X][Y]==6) {p2del();p1turn();a[X][Y]=1;black();win();p1move();}else p2move();case LEFT: /*向左移*/if(a[X][Y]==1) {if(getx()==140) moveto(520,gety());moverel(-20,0);black();}else if(a[X][Y]==0) {if(getx()==140) moveto(520,gety());if(getx()==140) moveto(500,gety());white();moverel(-20,0);black();}else { yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);black();} p2move();case RIGHT: /*向右移*/if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());moverel(20,0);black();}else if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());white();moverel(20,0);black();}else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);black();}p2move();case UP: /*向上移*/if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}else if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);white();moverel(0,-20);black();}else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}p2move();case DOWN: /*向下移*/if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);moverel(0,20);black();}else if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);white();moverel(0,20);black();}else {if(gety()==430) moveto(getx(),50); yellow();moverel(0,20);black();}p2move();default: p2move();}}main() /*主函数*/{ welcome(); /*调用欢迎界面*/help(); /*调用帮助界面*/initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ; /*清屏*/clearviewport();csz();qipang(); /*调用棋盘*/p1move(); /*调用玩家1的移动*/p2move();getch();}3详细设计1部分:以下是我负责的模块的函数,由于个人水平问题,我只负责画图部分。

五子棋程序设计

五子棋程序设计

/*加载头文件*/#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>/*编译预处理,定义按键码*/#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800/*若想在游戏中途退出, 可按Esc 键*/#define ESC 0x011b/*SPACE键表示落子*/#define SPACE 0x3920/*设置偏移量*/#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3/*定义数组大小*/#define N 19/*定义全局变量*/int status[N][N]; /*定义的数组,保存状态*/ int step_x,step_y;/*行走的坐标*/int key ; /*获取按下的键盘的键*/ int flag; /*玩家标志*//*自定义函数原型*/void DrawBoard();void DrawCircle(int x,int y,int color);void Alternation();void JudgePlayer(int x,int y);void Done();int ResultCheck(int x,int y);void WelcomeInfo();void ShowMessage();/*定义函数*//*显示欢迎信息函数*/void WelcomeInfo(){char ch ;/*移动光标到指定位置*/gotoxy(12,4);/*显示欢迎信息*/printf("Welcome you to gobang word!");gotoxy(12,6);printf("1.You can use the up,down,left and right key to move the chessman,");gotoxy(12,8);printf(" and you can press Space key to enter after you move it !");gotoxy(12,10);printf("2.You can use Esc key to exit the game too !");gotoxy(12,12);printf("3.Don not move the pieces out of the chessboard !");gotoxy(12,14);printf("DO you want to continue ?(Y/N)");ch=getchar();/*判断程序是否要继续进行*/if(ch=='n'||ch=='N')/*如果不继续进行,则推出程序*/exit(0);}/*画棋盘函数*/void DrawBoard(){int x1,x2;int y1,y2;/*设置背景色*/setbkcolor(2);/*设置线条颜色*/setcolor(1);/*设置线条风格、宽度*/setlinestyle(DOTTED_LINE,1,1);/*按照预设的偏移量开始画棋盘*/for(x1=1,y1=1,y2=18;x1<=18;x1++)line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFS ET_y)*OFFSET);for(x1=1,y1=1,x2=18;y1<=18;y1++)line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFS ET_y)*OFFSET);/*将各个点的状态设置为0*/for(x1=1;x1<=18;x1++)for(y1=1;y1<=18;y1++)status[x1][y1]=0;/*显示帮助信息*/setcolor(14);/*设置字体、大小*/settextstyle(1,0,1);outtextxy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,"Player key:");setcolor(9);settextstyle(3,0,1);outtextxy((19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,"UP--up ");outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,"DOWN--down ");outtextxy((19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,"LEFT--left");outtextxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,"RIGHT--right");outtextxy((19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,"ENTER--space");setcolor(14);settextstyle(1,0,1);outtextxy((19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,"Exit:");setcolor(9);settextstyle(3,0,1);outtextxy((19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,"ESC");}/*画圆函数*/void DrawCircle(int x,int y,int color) /*画不同颜色的棋子*/{int i,j;setcolor(color);i=20*x+80;j=20*y+60;/*以(x,y)为圆心,8为半径画圆*/circle (i,j,8);setfillstyle(SOLID_FILL,color);floodfill(i,j,color);}/*交换行棋方函数*/void Alternation(){if(flag==1)flag=2 ;elseflag=1 ;}/*对不同的行棋方画不同颜色的圆函数*/void JudgePlayer(int x,int y){if(flag==1)DrawCircle(x,y,15);if(flag==2)DrawCircle(x,y,4);}/*判断当前行棋方是否获胜函数*/int ResultCheck(int x,int y){int j,k;int n1,n2 ;while(1){/*对水平方向进行判断是否有5个同色的圆*/n1=0;n2=0;/*水平向左数*/for(j=x,k=y;j>=1;j--){if(status[j][k]==flag)n1++;elsebreak;}/*水平向右数*/for(j=x,k=y;j<=18;j++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}/*对垂直方向进行判断是否有5个同色的圆*/n1=0;n2=0;/*垂直向上数*/for(j=x,k=y;k>=1;k--){if(status[j][k]==flag)n1++;elsebreak ;}/*垂直向下数*/for(j=x,k=y;k<=18;k++){if(status[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){return(1);}/*从左上方到右下方进行判断是否有5个同色的圆*/ n1=0;n2=0;/*向左上方数*/for(j=x,k=y;(j>=1)&&(k>=1);j--,k--){if(status[j][k]==flag)n1++;elsebreak;}/*向右下方数*/for(j=x,k=y;(j<=18)&&(k<=18);j++,k++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}/*从右上方到左下方进行判断是否有5个同色的圆*/n1=0;n2=0;/*向右上方数*/for(j=x,k=y;(j<=18)&&(k>=1);j++,k--){if(status[j][k]==flag)n1++;elsebreak;}/*向左下方数*/for(j=x,k=y;(j>=1)&&(k<=18);j--,k++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}return(0);}}/*执行下棋函数*/void Done(){int i ;int j ;/*根据不同的key值进行不同的操作*/switch(key){/*如果是向左移动的*/case LEFT:/*如果下一步超出棋盘左边界则什么也不作*/if(step_x-1<0)break ;else{for(i=step_x-1,j=step_y;i>=1;i--)if(status[i][j]==0){DrawCircle(step_x,step_y,2);break ;}if(i<1)break ;step_x=i ;JudgePlayer(step_x,step_y);break ;}/*如果是向右移动的*/case RIGHT :/*如果下一步超出棋盘右边界则什么也不作*/if(step_x+1>18)break ;else{for(i=step_x+1,j=step_y;i<=18;i++)if(status[i][j]==0){/*每移动一步画一个圆,显示移动的过程*/DrawCircle(step_x,step_y,2);break ;}if(i>18)break ;step_x=i ;/*根据不同的行棋者画不同颜色的圆*/JudgePlayer(step_x,step_y);/*显示行棋一方是谁*/break ;}/*如果是向下移动的*/case DOWN :/*如果下一步超出棋盘下边界则什么也不作*/if((step_y+1)>18)break ;else{for(i=step_x,j=step_y+1;j<=18;j++)if(status[i][j]==0){DrawCircle(step_x,step_y,2);break ;}if(j>18)break ;step_y=j ;JudgePlayer(step_x,step_y);break ;}/*如果是向上移动的*/case UP :/*如果下一步超出棋盘上边界则什么也不作*/if((step_y-1)<0)break ;else{for(i=step_x,j=step_y-1;j>=1;j--)if(status[i][j]==0){DrawCircle(step_x,step_y,2);break ;}if(j<1)break ;step_y=j ;JudgePlayer(step_x,step_y);break ;}/*如果是退出键*/case ESC :break ;/*如果是确定键*/case SPACE:/*如果操作是在棋盘之内*/if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18){/*按下确定键后,如果棋子当前位置的状态为0*/if(status[step_x][step_y]==0){/*则更改棋子当前位置的状态在flag,表示是哪个行棋者行的棋*/status[step_x][step_y]=flag ;/*如果判断当前行棋者获胜*/if(ResultCheck(step_x,step_y)==1){/*以指定频率打开PC扬声器*/sound(1000);/*扬声器的发生时间,为1秒钟*/delay(1000);nosound();gotoxy(30,4);setbkcolor(BLUE);/*清除图形屏幕*/cleardevice();/*为图形输出设置当前视口*/setviewport(100,100,540,380,1);/*绿色实填充*/setfillstyle(1,2);setcolor(YELLOW);rectangle(0,0,439,279);floodfill(50,50,14);setcolor(12);settextstyle(1,0,5);/*三重笔划字体, 水平放大5倍*/outtextxy(20,20,"Congratulation !");setcolor(15);settextstyle(3,0,4);/*如果是Player1获胜,显示获胜信息*/if(flag==1){/*无衬笔划字体, 水平放大5倍*/outtextxy(20,120,"Player1 win the game !");}/*如果是Player1获胜,显示获胜信息*/if(flag==2){/*无衬笔划字体, 水平放大5倍*/outtextxy(20,120,"Player2 win the game !");}setcolor(14);settextstyle(2,0,8);getch();exit(0);}/*如果当前行棋者没有获胜,则交换行棋方*/ Alternation();/*提示行棋方是谁*/ShowMessage();break;}}elsebreak ;}}/*显示行棋方函数*/void ShowMessage(){/*轮到Player1行棋*/if(flag==1){setcolor(2);settextstyle(1,0,1);gotoxy(100,30);/*覆盖原有的字迹*/outtextxy(100,30,"It's turn to Player2 !");setcolor(12);settextstyle(1,0,1);outtextxy(100,30,"It's turn to Player1 !");}/*轮到Player2行棋*/if(flag==2){setcolor(2);settextstyle(1,0,1);/*覆盖原有的字迹*/outtextxy(100,30,"It's turn to Player1 !");setcolor(12);settextstyle(1,0,1);gotoxy(100,20);outtextxy(100,30,"It's turn to Player2 !");}}/*主函数*/int main(){int gdriver;int gmode;int errorcode;/*清空文本模式窗口*/clrscr();/*显示欢迎信息*/WelcomeInfo();gdriver=DETECT;gmode=0;/*初始化图形系统*/initgraph(&gdriver,&gmode,"");/*返回最后一次不成功的图形操作的错误代码*/errorcode=graphresult();if (errorcode!= grOk){/*根据错误代码输出错误信息串*/printf("\nNotice:Error occured when grphics initialization: %s\n",grapherrormsg(errorcode));printf("Press any key to quit!");getch();exit(1);}/*设置flag初始值,默认是Player1先行*/flag=1;/*画棋盘*/DrawBoard();ShowMessage();do{step_x=0 ;step_y=0 ;JudgePlayer(step_x-1,step_y-1);do{/*如果没有键按下,则bioskey(1)函数将返回0*/while(bioskey(1)==0);/*获取从键盘按下的键值*/key=bioskey(0);/*根据获得的键值进行下棋操作*/Done();}while(key!=SPACE&&key!=ESC);}while(key!=ESC);/*关闭图形系统*/closegraph();return 0;}。

五子棋游戏程序设计

五子棋游戏程序设计

《计算机应用基础课程设计》课程设计任务书学院名称:交通与汽车工程学院课程代码:6011339专业:年级:一、设计题目五子棋游戏程序设计二、主要内容设计一个程序能完成五子棋游戏的功能。

五子棋的规则:双方各执一色棋子,轮流下子(即将棋子放在棋盘的任一空交叉点上),直到有一方的棋子有5个排成一线(无论是横向、竖向还是斜向均可),则棋局结束,该方胜利。

三、具体要求及应提交材料(1)、设计游戏的核心算法;(2)、设计可视化的界面,设计双方所使用的两色棋子和彩色棋盘,使其得体大方、比例恰当;(3)、双方轮流用鼠标或键盘下子。

只有当鼠标单击在棋盘网格交叉点附近时才可下子,点击其它地方或已经有子的位置时不能下子,且给出相应的提示;(4)在适当的位置显示比赛结果,比赛中能随时存储当前棋局。

提交材料:1、任务书;2、课程设计说明书(打印);3、材料刻盘:程序、说明书四、主要技术路线提示首先设计合理的界面。

在用户落子时能标记出落子的位子,落子位子可对应地用一个二维数组存储,在某个位置有棋子落下时可以用对应数组元素值为1,否则为0的方式表示。

另外,每次用户落子后都应分析所在位子为基准点的水平方向、垂直方向和两个斜线方向有没有连续的五个子(即数组中有无连续的5个1)。

如有,则游戏结束,当前落子方为胜方。

主要操作界面(仅供参考)见图1图1五子棋游戏主界面五、进度安排第一周,下达课程设计任务书,根据设计要求进行VB语言知识的复习,做系统总体设计,编写程序、程序调试;第二周,程序的调试、修改、完善;撰写课程设计说明书。

六、推荐参考资料1.杨明广.王秀华. Visual Baisc程序设计教程.中国科学技术出版社,2006.11,21世纪教材;2.王秀华.余建坤. Visual Baisc程序设计上机和级考实训教程.中国科学技术出版社,2006.11,21世纪教材;3.龚沛曾. Visual Baisc程序设计简明教程(第二版).高等教育出版社,2003 4.曾强聪.新编Visual Basic程序设计教程.清华大学出版社,2004指导教师滕艳琼签名日期 2013 年 4 月 6 日系主任唐岚审核日期 2013 年 4 月 6 日。

c语言五子棋的设计和实现专业课程设计

c语言五子棋的设计和实现专业课程设计

学生课程设计汇报五子棋设计和实现一、课程设计内容该程序是经过C++编写,含有存放,调用,修改和查询学生基础信息管理系统,该程序并嵌入了五子棋游戏作为附加应用。

嵌入五子棋程序含有自动输出表格功效,并经过双人对弈实现该游戏操作,而且该程序中函数含有判定胜败方功效二、技术路线以C、c++语言为编程语言,组合不一样功效函数进行功效叠加三、设计和实现1.五子棋设计和实现:(1)首先画棋盘,用一个19*19二维数组来画棋盘。

(2)设计一个转义函数:把二维数组内容转义成符号。

(3)设计一个判定函数,分别对白黑子从横、竖、左斜、右斜四个方向判定是否连成五子,每个方向分成两部分,每个部分用一个循环来完成是否连成五子判定。

只要连成了五子,返回一个值来统计。

比如其中一个判定竖直方向代码(其它类似):for(inti=0;i<5;i++)//竖直是否连成五子判定{if(h-i-1>-1 && stone[h-i-1][l]=='o') js+=1;else break;}for(int j=0;j<5;j++){if(h+j+1<20 && stone[h+j+1][l]=='o') js+=1;else break;}if(js>=5){system("cls");return 0;}(4)接下来是主函数:主函数里面需要对输入键盘操作进行判定,上下左右分别对应不一样操作,分别把光标上下左右移动,空格键表示下子,对应sign、lasth、lastl改变(因为sign提醒该谁下子了,lasth、lastl统计下子位置)h表示悔棋,只需将lasth、lastl位置数组元素清零。

依据判定函数返回值告诉玩家谁赢了,,下棋总次数为奇数则黑棋走,偶数白棋走。

2.学生信息管理系统设计和实现该程序经过分模块进行组合编写,信息管理系统模块经过C 语言结构了学生信息结构体,而且创建了查看函数、保留函数、打开函数、颜色函数等功效函数分别完成信息管理系统存放信息、查找信息、修改信息等功效。

五子棋活动方案(精选14篇)

五子棋活动方案(精选14篇)

五子棋活动方案(精选14篇)活动方案是一种详细说明活动目标、内容、流程和资源等细节的规划和设计材料,它能够帮助我们有效地组织和实施活动。

如果你对以下的活动方案范文感兴趣,可以点击链接查看详细内容和操作步骤。

五子棋比赛活动的策划方案在五子棋的对弈中,我们可以明白许多人生的道理,可以帮助我们锻炼自身的洞察力,学会以全局观念看待问题,提高分析问题的能力。

其实古人一个非常贴切的比喻,讲人生就是一场棋。

仔细想想也是挺有寓意的。

很多时候就是在抉择时,会举棋不定。

在这竞争日趋激烈的新生代,在这知识日益重要的新纪元,在这娱乐日益需要的新时代,我们选择的每一步都是极有可能影响着我们未来的何去何从。

为了丰富和活跃校园生活,增加学生之间的友谊,丰富学校校园文化,提高我校学生身心素质,推进我校社会主义精神文明建设,增强同学的竞争意识。

1、丰富和活跃校园生活。

2、增加学生之间的友谊。

3、调动学生参加活动的积极性。

4、增强同学们的竞争意识。

5、提高我校学生身心素质,推进我校社会主义精神文明建设。

第一食堂。

大学生棋奕协会。

1、报名地点:值班处或办公室报名。

2、比赛规则:本次比赛本着公平,公正,公开的原则,以中国棋院审定的《中国五子棋竞赛规则》为依据。

3、赛程安排:a预赛:选手根据抽签进行单循环淘汰赛。

保留48位选手进入决赛。

b决赛:选手分为6组,进行小组赛,去积分高的,分出名次.七宣传工作。

(1)展板宣传:展板上可贴有该活动简介和照片,并写有本次活动相关内容。

(2)咨询点宣传:活动前一星期和活动当天可在第一、二食堂门口设置展台(12月1日—12月8日)接受学生咨询,向同学介绍该活动的相关信息。

(3)内部宣传:大力开展本部宣传,通知棋协理事务必在班级内作好宣传工作。

组织费用:30元;宣传费用:35元;奖品费用:60元;总共费用:125元。

来源:会费+赞助。

一等奖1名。

二等奖2名。

三等奖3名。

优秀奖10名。

五子棋活动方案纵横交错的棋盘似未来百变的道路,黑白分明的棋子是历经风雨的人生。

基于Android的五子棋游戏设计

基于Android的五子棋游戏设计

基于Android的五子棋游戏设计全文共四篇示例,供读者参考第一篇示例:基于Android的五子棋游戏设计一、引言五子棋,又叫“连珠”、“连五子”、“五目连珠”、“横行五子”等,是一种源自中国古老的传统棋类游戏,是中国文化中的珍品之一。

它简单易学、趣味无穷,不仅有助于智力开发,还能提高人们反应能力和计划能力。

如今,随着移动互联网的快速发展,越来越多的人更愿意在手机上玩游戏,五子棋这种棋类游戏也开始成为了许多人休闲娱乐的首选。

本文将介绍基于Android平台的五子棋游戏设计。

二、游戏规则五子棋是双方轮流在棋盘上下棋,先行者用黑子,后手用白子。

双方在纵横交错的棋盘上下子,谁先在横、竖、斜方向连成一线即可获胜,所以胜负的关键就是谁能够先形成一个五连子。

除了形成五连子以外,另一个胜利的方式就是对方无路可走,即形成了死局。

三、游戏功能设计1. 开始游戏:游戏开始时需要选择先手方(黑子)还是后手方(白子),也可以选择人机对战或者人人对战。

2. 棋盘绘制:通过绘制界面,在屏幕上绘制出五子棋的棋盘,并标明每个交叉点的坐标。

3. 下棋功能:在轮到某位玩家下棋时,通过点击对应的交叉点,将黑子或白子下在棋盘上。

4. 判定输赢:每次下完棋之后,需要判断当前局势是否有一方胜利或者形成了死局。

5. 悔棋功能:为了增加游戏的趣味性,可以添加悔棋功能,允许一方在一定步骤内悔棋一次。

6. 提示功能:为了方便玩家,可以添加提醒系统,提示玩家哪些位置是最佳下棋位置。

四、游戏架构设计1. 用户界面模块:包括开始游戏界面、下棋界面、游戏结束界面等。

2. 游戏逻辑模块:负责下棋规则的判断、输赢判定、悔棋功能实现等。

3. 数据存储与交互模块:在游戏进行中需要保存游戏状态、玩家对战记录等。

4. 人工智能模块(可选):如果添加人机对战功能,就需要设计一个人工智能模块,用于实现电脑自动下棋。

六、游戏优化1. 界面优化:尽量设计简洁美观的用户界面,提高用户体验。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

五子棋游戏程序设计
五子棋游戏程序设计
1、引言
在本文档中,我们将介绍一个五子棋游戏的程序设计方案。

五子棋是一种非常古老的策略性棋类游戏,玩家通过在一个棋盘上下子,目标是先在横、竖、斜线上连成五个子的一方获胜。

2、需求分析
在这一部分,我们将详细描述五子棋游戏的功能需求和技术限制。

2.1 游戏规则
- 棋盘是一个 15x15 的格子矩阵,玩家轮流在格子中下子。

- 黑方和白方交替进行下子。

- 当任意一方在横、竖、斜线上连成五个子时,获得胜利。

- 如果棋盘填满且没有任何一方连成五个子,则游戏平局。

2.2 用户界面
- 游戏应提供一个交互式的用户界面,玩家可以通过鼠
标或键盘进行操作。

- 游戏界面应友好,清晰地显示当前的棋盘状态和玩家
轮次。

- 游戏应提供一些额外的功能(如悔棋、重新开始等)
来增加用户体验。

2.3 技术限制
- 本程序设计使用面向对象的方法实现。

- 棋盘的显示和用户交互部分应采用图形界面。

- 游戏应具备较好的性能,可以在合理的时间内响应用
户操作。

3、模块设计
在这一部分,我们将详细描述五子棋游戏的各个模块,并给
出相应的设计方案。

3.1 棋盘模块
- 这个模块负责管理棋盘的状态和提供相关的操作方法。

- 棋盘可以表示为空、为黑子、为白子的状态,并提供
下子和撤销子的方法。

- 这个模块还需要提供检查胜利条件的方法。

3.2 玩家模块
- 这个模块负责管理玩家的状态和提供相关的操作方法。

- 玩家可以选择下黑子或白子,并提供下子的方法。

- 这个模块还需要提供获取玩家输入的方法。

3.3 用户界面模块
- 这个模块负责显示棋盘和处理用户交互。

- 用户界面应提供可视化的棋盘,并允许玩家通过鼠标
选择下子的位置。

- 这个模块还需要处理玩家的输入,并将其转发给棋盘
和玩家模块。

4、测试计划
在这一部分,我们将描述五子棋游戏的测试计划,以确保游
戏的正确性和稳定性。

4.1 单元测试
- 棋盘模块应进行单元测试,测试其提供的下子和撤销
子的方法是否正确。

- 玩家模块应进行单元测试,测试其提供的下子的方法
是否正确。

- 用户界面模块应进行单元测试,测试其显示棋盘和处
理用户交互的方法是否正确。

4.2 集成测试
- 将棋盘、玩家和用户界面模块进行集成测试,测试整
个游戏的基本功能是否正常。

4.3 系统测试
- 对整个游戏进行系统测试,测试游戏的稳定性和性能。

5、部署
在这一部分,我们将描述游戏的部署计划和可能遇到的问题。

5.1 部署环境
- 游戏需要在操作系统上运行。

目前支持 Windows、macOS 和 Linux 平台。

- 游戏需要安装相应的运行时环境(如 Java 运行时环境)。

5.2 可能问题
- 在某些操作系统上可能存在兼容性问题,需要对游戏进行适配。

6、附件
本文档不涉及附件。

7、法律名词及注释
本文档不涉及法律名词及注释。

相关文档
最新文档