扫雷游戏设计_课程设计报告
扫雷游戏课程设计报告

(一)需求分析题目:32、实现一种N*M 旳扫雷游戏设计规定:可以实现一种N*M 旳扫雷游戏a、可以打开一种方格(由于做旳是静态显示,故在控制台上方格用‘—’替代),已打开旳方格不能关闭b、可以标识一种方格,标识方格旳含义是对该方格有雷旳预测(并不体现真旳一定有雷)c、可以给出游戏成果:输、赢d、N和M可由玩家自己设置系统功能需求分析:一种数字和一种雷(boom)。
你可以打开(open)一种方格,假如你打开旳是一种boom,那么就失败;否则就会打开一种数字,该数字是位于[0,8]旳一种整数,该数字体现其所有邻居方格所包括旳雷数,应用该信息可以协助你扫雷。
点击到了某区域发现其周围没有雷,那么显而易见应当点开周围旳区域,拓展空白区域(二)概要设计由于知识储备局限性,VC中旳MFC应用程序又过于复杂,故退而求另首先,不再采用动态显示和界面图形化,采用静态显示来实现扫雷游戏中旳重要功能。
用键盘上旳‘1’键替代鼠标左击,即打开一种方格查看其属性,已打开旳方格不能在关闭;用键盘上旳‘2’键替代鼠标右击,即标识一种方格,标识方格旳含义是对该方格有雷旳预测(并不体现真旳一定有雷)用键盘上旳‘↑’‘↓’‘←’‘→’四个键来实现光标在控制台上旳自由移动,相称于用鼠标实现光标在图形界面旳移动游戏区域旳高度与宽度及总雷数可由玩家自己设定应题目规定设计了一种基类:Base和一种继承类:Game。
基类Base重要实现某些基本功能:游戏结束时输出游戏旳成果:输赢;返回控制台上光标旳位置返回按下键时所对应旳按键控制符基类Base:继承类Game是本程序旳重要内容,也是实现扫雷游戏旳关键部分。
重要实现旳功能:初始化图形界面,把游戏区域在控制台上显示出来;运用随机函数进行随机布雷,以保证玩家每次玩游戏时雷旳分布位置均不同样;得到一种坐标位置周围旳雷数,并把数值返回;在一种坐标点上(x,y)点击,在该位置上显示其周围旳雷数或拓展空白区域或失败;假如一种坐标点旳周围没有雷,则拓展空白区域,并递归拓展;其中saolei()函数是类Game里旳关键函数体,用来判断玩家按下了哪个键,并作出对应反应(上下左右四个方向旳移动,打开一种方格,标识一种方格),并判断游戏旳输与赢继承类Game:(三)详细设计关键算法:(1)布雷函数:初始化时把数组里旳值所有置为0,然后运用srand(),rand()随机机制产生随机数,分别对列和行取模,便产生了雷旳随机位置。
c语言扫雷游戏课程设计

c语言扫雷游戏课程设计一、课程目标知识目标:1. 让学生掌握C语言的基本语法和程序结构;2. 帮助学生理解二维数组的使用方法,灵活运用数组存储和处理扫雷游戏的数据;3. 引导学生掌握逻辑表达式和循环结构在游戏中的运用。
技能目标:1. 培养学生运用C语言编写简单游戏的能力;2. 提高学生分析问题、解决问题的能力,通过设计扫雷游戏,让学生学会分解复杂问题为简单问题,逐步解决;3. 培养学生团队协作和沟通能力,分组完成游戏设计。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生主动探索新知识的热情;2. 培养学生面对挑战时不怕困难,勇于尝试,持续改进的良好品质;3. 引导学生树立正确的价值观,尊重他人成果,学会分享与合作。
分析课程性质、学生特点和教学要求,本课程旨在通过设计扫雷游戏,让学生在实践过程中掌握C语言的基本知识和技能。
课程目标具体、可衡量,既注重知识技能的培养,又关注学生的情感态度价值观发展,为后续的教学设计和评估提供明确方向。
二、教学内容1. C语言基础知识回顾:变量、数据类型、运算符、控制结构(条件语句、循环语句);2. 二维数组的概念和使用方法,数组在扫雷游戏中的应用;3. 函数的定义和调用,模块化编程思想在游戏设计中的应用;4. 随机数的生成和运用,实现扫雷游戏的雷区布置;5. 逻辑表达式和条件判断,实现扫雷游戏的胜利判断和雷区展开;6. 排序算法和查找算法的应用,优化扫雷游戏的逻辑处理;7. 用户交互设计,实现扫雷游戏的输入输出界面;8. 游戏测试与调试,培养学生解决问题的能力;9. 团队协作与沟通,分组完成扫雷游戏的开发。
教学内容按照课本章节顺序进行,结合课程目标,确保学生能够系统地掌握C 语言编程知识。
教学大纲明确教学内容和进度,使学生在完成课程学习后,能够独立编写简单的扫雷游戏程序。
三、教学方法本课程将采用以下教学方法,以激发学生的学习兴趣和主动性,提高教学效果:1. 讲授法:教师通过生动的语言和实际案例,讲解C语言基础知识和扫雷游戏设计原理,帮助学生建立知识体系。
安卓扫雷游戏课程设计

安卓扫雷游戏课程设计一、课程目标知识目标:1. 学生能理解并掌握安卓开发基本知识,包括界面设计、事件处理和逻辑控制。
2. 学生能运用所学的安卓开发技能,独立完成一个扫雷游戏的编写。
3. 学生了解并掌握扫雷游戏的规则和算法实现。
技能目标:1. 学生能运用安卓开发工具(如Android Studio)进行游戏设计和开发。
2. 学生通过实践,培养解决问题、调试程序的能力。
3. 学生能够进行团队合作,共同完成项目任务。
情感态度价值观目标:1. 学生培养对编程的兴趣,增强学习信息技术的自信心。
2. 学生通过扫雷游戏项目,认识到编程在现实生活中的应用价值,激发创新意识。
3. 学生在团队合作中,学会沟通与协作,培养集体荣誉感和责任感。
课程性质:本课程为信息技术课程,结合实际操作,培养学生的编程能力和团队协作能力。
学生特点:学生为初中年级,具备一定的信息技术基础,对游戏开发有浓厚兴趣。
教学要求:结合学生特点,以实践操作为主,注重培养学生的动手能力和团队协作精神。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 安卓开发基础- 界面设计:Activity、布局(LinearLayout、RelativeLayout)、控件(Button、TextView等)。
- 事件处理:setOnClickListener、触摸事件。
- 逻辑控制:条件语句(if-else)、循环语句(for、while)。
2. 扫雷游戏规则与算法- 扫雷游戏规则介绍:游戏目标、地雷分布、计分方式等。
- 算法实现:递归算法、随机数生成。
3. 游戏开发实践- 创建项目:使用Android Studio创建新项目,配置游戏界面。
- 编写代码:完成游戏逻辑、界面交互、地雷生成等功能。
- 调试与优化:测试游戏功能,修复bug,提高游戏体验。
4. 团队合作与项目评估- 团队合作:分配任务,协同开发,共同完成项目。
- 项目评估:评估标准,包括功能完整性、界面美观、代码规范等。
c语言扫雷课程设计报告vc

C语言扫雷课程设计报告1. 引言扫雷游戏是一款经典的单人益智游戏,通过在一个由方块组成的网格中,通过点击方块并根据周围方块的状态来逐步揭示地雷的位置。
本文档将介绍一个使用C语言实现的扫雷游戏。
2. 项目背景扫雷游戏是一个经典的Windows游戏,在Windows操作系统中自带有扫雷游戏,因此开发一个C语言版本的扫雷游戏可以提高学生对C 语言的学习兴趣,同时锻炼计算机编程能力。
3. 项目目标本项目的目标是实现一个具备基本功能的C语言扫雷游戏,包括以下特点:•游戏开始时,玩家输入游戏难度(即地雷数量和地图大小),按照输入的难度生成对应的地图。
•玩家通过输入坐标的方式来翻开方块,并根据周围地雷的数量显示提示信息。
•当玩家翻开一个地雷方块时,游戏结束,显示游戏失败信息。
•如果玩家成功翻开了所有的非地雷方块,则游戏胜利,显示游戏胜利信息。
4. 技术实现本项目将使用C语言实现扫雷游戏,主要涉及以下技术:•使用C语言的基本语法和数据结构,实现游戏逻辑和操作;•使用C语言中的文件操作,实现游戏的保存和读取功能;•使用C语言中的随机数生成函数,生成随机地雷的位置;•使用C语言的图形库(如ncurses)来实现游戏界面的显示。
5. 版本控制为了方便项目的维护和追踪,本项目将使用Git进行版本控制。
代码库将托管在GitHub上,方便多人协作和版本管理。
6. 开发计划本项目的开发计划如下:•第1周:学习C语言基础知识,熟悉C语言的基本语法和数据结构;•第2周:完成C语言扫雷游戏的框架搭建,包括游戏初始化、界面设计等;•第3周:实现游戏逻辑,包括地雷生成、方块翻开、胜利条件判定等;•第4周:优化游戏功能,增加保存和读取功能,完善游戏界面等;•第5周:完成文档撰写和项目总结。
7. 预期成果通过本项目的实现,预期可以达到以下成果:•培养学生对C语言的编程能力,加深对C语言的理解;•提高学生的逻辑思维和问题解决能力;•锻炼学生的团队协作和沟通能力;•了解和应用Git版本控制工具,提高代码管理和维护能力。
幼儿园益智游戏《扫雷》教案及游戏实践报告

《扫雷》教学实践与游戏报告1. 前言幼儿园益智游戏一直是幼儿园教学中不可或缺的一部分。
而在幼儿园益智游戏中,《扫雷》作为一款富有挑战性和趣味性的益智游戏,受到了越来越多幼儿园老师和家长的关注。
本文将以《扫雷》为主题,围绕教学实践及游戏报告展开探讨,并希望能在对该游戏进行深入了解的为幼儿园教师及家长提供一些有益的借鉴。
2. 《扫雷》教案设计2.1 游戏概述《扫雷》是一款在方块矩阵中排雷的游戏。
每个方块中可能有地雷,也可能没有。
玩家需要根据已知信息判断哪些方块中有地雷,哪些没有,并用旗帜标记。
游戏的目标是找出所有没有地雷的方块。
2.2 游戏目标通过玩《扫雷》游戏,培养幼儿的观察能力、逻辑推理能力和空间想象能力,提高幼儿的专注力和耐心。
3. 游戏实践报告3.1 游戏实践过程在一次《扫雷》游戏实践中,我们为幼儿们准备了一块由小方块组成的游戏板,其中隐藏了一些小石子代表地雷。
幼儿们在老师的指导下,用小旗帜标记出他们认为有地雷的位置,并逐渐揭开没有地雷的位置。
3.2 游戏实践效果通过《扫雷》游戏实践,我们发现幼儿们在游戏中展现出了较强的观察力和逻辑推理能力。
他们能够根据已知信息做出判断,并在游戏中不断尝试,提高了他们的空间想象能力和解决问题的能力。
4. 总结通过对《扫雷》教学实践及游戏报告的深度和广度探讨,我们可以看到,《扫雷》作为一款益智游戏,确实对幼儿的能力培养有着积极的促进作用。
在今后的教学实践中,我们应该充分发挥益智游戏在幼儿教育中的作用,为幼儿的个性发展和综合能力的培养提供更多的可能性。
5. 个人观点和理解在我看来,《扫雷》这款益智游戏能够很好地锻炼幼儿的观察力和逻辑推理能力,同时也能够培养幼儿的耐心和解决问题的能力。
我认为在幼儿园教学中,引入类似的益智游戏是非常有益的。
结语通过本文的撰写,希望能够对幼儿园教师及家长们对《扫雷》益智游戏有更深入的了解,并帮助他们更好地教育和培养孩子。
希望本文的内容能够为读者带来一些启发和帮助。
Java扫雷游戏课程设计实训报告

Java应用技术实训报告一.总体设计本系统共包括3个java源文件和4个图像文件1.类之间的关系如图1.1所示图1.1类之的关系2 . java源文件及其功能如表1所示3.图像文件Bomb.gif :地雷方块上的图标。
questio n.gif :疑惑探雷是否正确。
bomb_big.gif :触雷时方块上的图标。
flag.gif :探雷标记。
、详细设计1 .主类Main(1 )成员变量(见表2)表2成员变量描述变量类型备注游戏运行Mai nBomb 临时变量(2)成员变量(见表3)表3名称功能备注mai n 游戏开始(3)源代码见文件Ma in .javaimport java.awt.*;import java.awt.eve nt.*;import javax.swi ng.*;/*主类*/public class Mai n{public static void main(String args[]) {(new Main Bomb()).show();}}2 .挖雷游戏MainBomb(1 )成员变量(见表4)(2)方法见(表5)(3)源代码见文件MainBomb.javaimport java.awt.*;import java.awt.eve nt.*;import javax.swi ng.*;/*窗口及算法实现类*/class Mai nBomb exte ndsJFrame impleme nts Actio nListe ner,MouseListe nerpublic JTextField text;public Label nowBomb,setBomb;public int BlockNum,BombNum;// 当前方块数当前雷数public Icon icon_bomb = new ImageIcon("Bomb.gif");// 踩雷public Icon icon_bomb_big = new ImageIcon("bomb_big.gif"); // 踩雷标记public Icon icon_flag = new ImageIcon("flag.gif");// 雷标记public Icon icon_question = new ImageIcon("question.gif"); // 疑惑是否有雷public JButton start = new JButton(" 开始");public Panel MenuPamel = new Panel();public Panel mainPanel = new Panel();public Bomb[][] bombButton;/* 界面设计*/public MainBomb(){super(" 成型04-2 李超JAVA 课程设计");BlockNum = 64;BombNum = 10;Container c=getContentPane();c.setBackground(Color.gray);c.setLayout(new BorderLayout());text=new JTextField("10 ",3);nowBomb = new Label(" 当前雷数"+" "+BombNum+"");setBomb= new Label(" 设置地雷数");start.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){BombNum = Integer.parseInt(text.getText().trim());if(BombNum >= 10 && BombNum < 50 )replay();else{JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(null," 您设置的地雷数太多了设!"," 错误, 请重",2);}}} );MenuPamel.add(setBomb);MenuPamel.add(text);MenuPamel.add(start);MenuPamel.add(nowBomb);c.add(MenuPamel,"North");mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum)(int)Math.sqrt(BlockNum)) );bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][];for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++) {bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ];}for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ ) for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) {bombButton[ i ][ j ]=new Bomb(i,j);bombButton[ i ][ j ].setForeground( Color.gray);bombButton[ i ][ j ].addActionListener(this);bombButton[ i ][ j ].addMouseListener(this);}for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) mainPanel.add(bombButton[ i ][ j ]);c.add(mainPanel,"Center");startBomb();setSize(400,400);setLocation(350,200);setResizable(false);}/* 布雷*/public void startBomb()for(int i=0;i<BombNum;i++){int x =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));int y =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));if(bombButton[ x ][ y ].isBomb==true)i--;elsebombButton[ x ][ y ].isBomb=true ;}}/* 重新开始*/public void replay(){nowBomb.setText(" 当前雷数"+" "+BombNum+"");for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++){bombButton[ i ][ j ].isBomb=false;bombButton[ i ][ j ].isClicked=false;bombButton[ i ][ j ].setEnabled(true);bombButton[ i ][ j ].setText("");bombButton[ i ][ j ].setIcon(null);}startBomb();}/* 是否挖完了所有的雷*/public void isWin(){int findBomb=0; // 找到的地雷数for(int i=0;i< (int)Math.sqrt(BlockNum); i++)for(int j=0;j< (int)Math.sqrt(BlockNum ); j++){if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight== true)findBomb++;}if( findBomb == Integer.parseInt(text.getText().trim()) ){JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(this," 您挖完了所有的雷,您胜利了您胜利了",2);}}/* 计算方块周围雷数*/public void CountRoundBomb(){for (int i=0; i< (int)Math.sqrt(BlockNum); i++){for (int j = 0; j < (int)Math.sqrt(BlockNum); j++){int count = 0;// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数if (bombButton[ i ][ j ].isBomb != true) {if ( (i - 1 >= 0) && (j - 1 >= 0)) {if (bombButton[i - 1][j - 1].isBomb == true) {count += 1; // 检测左上方空格是否是地雷}}if ( (i - 1 >= 0)) {if (bombButton[i - 1][ j ].isBomb == true) {count += 1; // 检测上方空格是否为地雷}}if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i - 1][j + 1] .isBomb == true) {count += 1; // 检测右上方是否为地雷}}if ( (j - 1 >= 0)) {if (bombButton[ i ][j - 1] .isBomb == true) {count += 1; // 检测左边是否为地雷if ( (i >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {if (bombButton[ i ][j + 1].isBomb == true) {count += 1; // 右边}}if ( (j - 1 >= 0) && (i + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i + 1][j - 1].isBomb == true) {count += 1; // 左下}}if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {if (bombButton[i + 1][ j ].isBomb == true) {count += 1; // 下}}if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) && (i + 1 <= Math.sqrt(BlockNum)-1)) {if (bombButton[i + 1][j + 1].isBomb == true) {count += 1; // 右下}}bombButton[ i ][ j ].BombRoundCount = count;}/** 当选中的位置为空, 则翻开周围的地图**/public void isNull(Bomb[][] bombButton,Bomb ClickecButton){int i,j;i=ClickecButton.num_x;j=ClickecButton.num_y;if (ClickecButton.isBomb==true) {}else {if ( (i - 1 >= 0) && (j - 1 >= 0)) { // 检测左上方空格是否是空if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j -1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) {bombButton[i-1][j-1].setText((bombButton[i-1][j-1].BombRoundCount)+"");bombButton[i - 1][j - 1].setEnabled(false);bombButton[i - 1][j - 1].isClicked=true;}}if ( (i - 1 >= 0)) { // 检测上方空格是否为空if (bombButton[i-1][ j].isBomb == false && bombButton[i1][ j ].isClicked == false && bombButton[i - 1][ j ].isRight == false){bombButton[i-1][ j].setText((bombButton[i-1][ j ].BombRoundCount)+"");bombButton[i - 1][ j ].setEnabled(false);bombButton[i - 1][ j ].isClicked=true;if ( (i - 1 >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测右上方是否为空if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j +1].isClicked == false && bombButton[i - 1][j + 1].isRight == false){bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+"");bombButton[i - 1][j + 1].setEnabled(false);bombButton[i - 1][j + 1].isClicked=true;}}if ( (j - 1 >= 0)) { // 检测左边是否为空if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j - 1].isClicked == false && bombButton[ i ][j - 1].isRight == false) {bombButton[ i ][j - 1].setText((bombButton[ i ][j -1].BombRoundCount)+"");bombButton[ i ][j - 1].setEnabled(false);bombButton[ i ][j - 1].isClicked=true;}}if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测右边空格是否是空if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j +1].isClicked == false && bombButton[ i ][j + 1].isRight == false) {bombButton[ i ][j + 1].setText((bombButton[ i ][j +1].BombRoundCount)+"");bombButton[ i ][j + 1].setEnabled(false);bombButton[ i ][j + 1].isClicked=true;}if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测左下空格是否是空if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j -1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) {bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+"");bombButton[i + 1][j - 1].setEnabled(false);bombButton[i + 1][j - 1].isClicked=true;}}if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测下边空格是否是空if (bombButton[i + 1][ j ].isBomb == false && bombButton[i + 1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) {bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+"");bombButton[i + 1][ j ].setEnabled(false);bombButton[i + 1][ j ].isClicked=true;}}if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) && (i + 1 <=((int)Math.sqrt(BlockNum)-1)) ) { // 检测右下边空格是否是空if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j +1].isClicked == false && bombButton[i + 1][j + 1].isRight == false){bombButton[i+1][j+1].setText((bombButton[i+1][j+1].BombRoundCo unt)+"");bombButton[i + 1][j + 1].setEnabled(false); bombButton[i + 1][j +1].isClicked=true;}}if ( (i - 1 >= 0) && (j - 1 >= 0))// 检测左上isNull(bombButton,bombButton[i - 1][j - 1]);if ( (i - 1 >= 0))isNull( bombButton,bombButton[i - 1][ j ]);// 检测上方if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1))isNull( bombButton,bombButton[i - 1][j + 1]);// 检测右上if ( (j - 1 >= 0))isNull(bombButton,bombButton[i][j - 1]);// 检测左边if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) )isNull(bombButton,bombButton[i][j + 1]);// 检测右边if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) )isNull(bombButton,bombButton[i + 1][j - 1]); // 检测左下if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) // 检测下isNull(bombButton,bombButton[i + 1][ j ]);if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) && (i +1 <= ((int)Math.sqrt(BlockNum)-1)) )// 检测右下isNull(bombButton,bombButton[i + 1][j + 1]);}}public void actionPerformed(ActionEvent e){CountRoundBomb();if(((Bomb)e.getSource()).isBomb==false&&((Bomb)e.getSource()).isClicked==false){((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount) +"");((Bomb)e.getSource()).isClicked=true;((Bomb)e.getSource()).setIcon(null);((Bomb)e.getSource()).setEnabled(false);if((((Bomb)e.getSource()).BombRoundCount) == 0)isNull(bombButton,(Bomb)e.getSource());isWin();}else if(((Bomb)e.getSource()).isBomb == true){for(int i=0;i<(int)Math.sqrt(BlockNum);i++)for(int j=0;j<(int)Math.sqrt(BlockNum);j++){if(bombButton[ i ][ j ].isBomb == true)bombButton[ i ][ j ].setIcon(icon_bomb);}((Bomb)e.getSource()).setIcon(icon_bomb_big);JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(this," 你踩到地雷了,按确定重来"," 你踩到地雷了",2);replay();}}public void mouseClicked(MouseEvent e){Bomb bombSource = (Bomb)e.getSource();boolean right = SwingUtilities.isRightMouseButton(e);if((right == true) && (bombSource.isClicked == false)){bombSource.BombFlag = (bombSource.BombFlag + 1)%3;if(bombSource.BombFlag == 1){if(BombNum > 0 && bombSource.isRight == false ){bombSource.setIcon(icon_flag);bombSource.isRight = true;BombNum--;}isWin();nowBomb.setText(" 当前雷数"+" "+BombNum+"");}else if(bombSource.BombFlag == 2){if( (BombNum!=0 ) &&(bombSource.getIcon()==icon_flag)) )||(BombNum==0 BombNum++;bombSource.setIcon(icon_question);nowBomb.setText(" 当前雷数"+" "+BombNum+"");}else if(bombSource.BombFlag == 0)bombSource.setlc on(n ull); bombSource.isRight = false;}}}public void mouseE ntered(MouseEve nt e){}public void mouseReleased(MouseEve nt e){}public void mouseExited(MouseEve nt e){}public void mousePressed(MouseEve nt e){}}3 .按钮Bomb(1 )成员变量(见表6)(2)源代码见文件Bomb.java import java.awt.*;import java.awt.eve nt.*;import javax.swing.*; /* 按扭类 */class Bomb extends JButton{public int num_x,num_y; public int BombRoundCount; public boolean isBomb; public boolean isClicked; public int BombFlag;public boolean isRight; public Bomb(int x,int y) { BombFlag = 0; num_x = x;num_y = y; BombRoundCount = 0; isBomb = false; isClicked = false; isRight = false;}}三.运行效果点击开始运行游戏,即可点选方格、根据方格数字推断雷的位置。
人工智能 扫雷 课程设计报告

人工智能project报告学号:20091000608姓名:王沙沙班级:191091指导老师:赵老师2011年10月25目录1.自动扫雷 (3)需求分析 (3)游戏规则 (3)扫雷游戏设计 (3)自动扫雷设计 (5)用户手册 (5)运行结果 (6)结论 (7)主要算法代码 (7)1 自动扫雷1.问题描述、需求分析扫雷是Windows操作系统自带的桌面小游戏之一,由于其规则简单,长期以来一直受到电脑用户的欢迎。
自动扫雷是开始扫雷后根据扫雷规则利用计算机进行扫雷。
开始棋局,单击第一个按钮,因为执行第一个动作时所有按钮是雷的概率都相等,为了方便起见每次开局后都按下第一个按钮,如果不幸第一个按钮就是雷,那么单击--开始--重新开局。
2.游戏规则游戏界面如下图所示,游戏区域是由M X N个格子组成的“雷区”,左上方的数字显示雷区中未被标出的地雷的个数,右上方的数字显示用户从第一次点击开始所用的时间,单位是秒。
中间的图标指示游戏的状态(完成:笑脸;失败:哭脸)。
用户需要通过鼠标操作来确定雷区中所有地雷的位置:左键单击:尝试某个格子是否有地雷。
如果该格子下有地雷,则游戏失败·如果该格子下没有地雷但其周围八个格子下有地雷,该格子会显示其周围八个格子中地雷的个数;如果该格子下没有地雷且其周围八个格子下也没有地雷,则此处被挖开。
右键单击:改变某个格子是否有雷的标志(工)。
或左右键同时单击:当该格子周围已标地雷的个数与格子中的数字相同时,则挖开周围的其余格子。
当提示该格子周围已标地雷的个数少于格子;3.扫雷游戏设计每个格子有如下几种状态:{MS_NORMAL,MS_OPEN,MS_FLAG,MS_QUEST,MS_EXPLODE} MINESTATUS1)格子类共有变量如下:MINESTATUS m_nStatus;//格子状态int m_nMineNum;//格子周围的雷数,即格子上显示的数字CWnd *m_pParent;//父窗口int m_nX,m_nY; //按下按钮的横纵坐标成员函数SetStatus(MINESTATUS nStatus)//设置状态GetStatus()//获取状态SetMineNum(int nMineNum)//设置雷数GetMineNum() //获取雷数DrawItem(BOOL bFail=TRUE);//绘制格子2)布雷类共有变量如下int m_nRow,m_nCol;//棋盘有多少行多少列int m_nMineNum; //棋盘上的雷数int m_nX,m_nY; //棋盘的位置int m_nOldMine;int m_aMineTest[9];int m_nMineTest;CMineButton *m_aLandMine[10000]; //棋盘CWnd *m_pParent;成员函数Create(int nRow,int nCol,int nMineNum,int nX,int nY,CWnd *pParent);Reset(int nRow,int nCol,int nMineNum);//重新布局ReDraw(BOOL bFail);//刷新棋局LButtonDown(CPoint point);//左键按下BothButtonDown(CPoint point);//左键与右键同时按下RButtonDown(CPoint point);//右键按下MouseMove(CPoint point,int bBothDown);//鼠标移动LButtonUp(CPoint point);//左键弹起BothButtonUp(CPoint point);//左键与右键同时弹起OpenMine(int nCurMine);//开局函数IsSuccess(); //判断是否扫雷成功RndBtShdDn(int nCurMine);GetMineNum()//获取棋盘的雷数GetRight(int nCurMine)//获取四邻域的中心点像素正右方像素点的位置 GetLeft(int nCurMine)//获取四邻域的中心点像素正下左像素点的位置 GetTop(int nCurMine)//获取四邻域的中心点像素正上方像素点的位置GetBot(int nCurMine)//获取四邻域的中心点像素正下方像素点的位置3)布雷算法:首先定义一个n*n的二维数组,该数组的i-1到i+1,j-1到j+1除去i,j本身。
java_扫雷游戏课程设计报告(共5篇)

java_扫雷游戏课程设计报告(共5篇)第一篇:java_扫雷游戏课程设计报告一、设计任务与要求扫雷游戏的基本要求Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。
本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。
具体要求如下:(1)扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。
(2)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(3)用户要揭开某个方块,可单击它。
若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(4)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(5)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
(6)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G 然后M)即可,此时双击右键并可出现“?”标记。
另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。
(7)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。
当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。
二、需求分析1、扫雷游戏概述扫雷是一种具有迷惑性的对记忆和推理能力的简单测试,它是长久以来最受欢迎的Windows游戏之一。
游戏目标:找出空方块,同时避免触雷。
2、扫雷的操作方法游戏主区域由很多个方格组成。
使用鼠标随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《WINDOWS程序设计》课程设计报告题目:扫雷游戏设计专业:班级:姓名:指导教师:成绩:学院二〇一六年十一月十五日目录1.设计目的及意义 (3)2.游戏基本操作内容 (3)2.1 游戏玩法 (3)2.2 游戏的基本操作 (4)2.3 扫雷的设计原理 (4)2.4总体游戏过程分析 (5)3.游戏设计过程 (6)3.1基本设计类及流程图 (6)3.2 设计过程 (7)4.设计结果及分析 (24)4.1结果 (24)4.2问题: (25)5.心得体会: (25)6.参考文献 (26)1.设计目的及意义在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。
我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。
即:设计一个功能与Windows中的挖雷游戏相同的小游戏。
1.培养学生综合运用所学知识独立完成课题的能力。
2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核2.游戏基本操作内容2.1 游戏玩法:游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。
2.2 游戏的基本操作:包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。
其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:左键单击:在判断出不是雷的方块上按下左键,可以打开该方块。
如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。
所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。
双击:同时按下左键和右键完成双击。
当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。
地雷未标记完全时使用双击无效。
若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“×”。
2.3 扫雷的设计原理:扫雷游戏分为几个步骤:第一步,使用二维数组表示地图;第二步,随机生成几个地雷;第三步,点击方格的反应,计算每个非雷区方格点开后的数字;第四步,当方格数字为0的情况;第五步,当方格为地雷的情况。
第一步地图的大小和第二步地雷的数量都应该是程序中给定的,或者玩家输入的。
这个是多少自己决定吧。
第三步,计算非雷区方格点开后的数字就把这个方格在二维数组中周围八个方向的方格是否是地雷都检查一遍,一定要注意不要越出数组边界。
这个数字可以在游戏初始化时全都计算好,也可以在玩家点击的时候再计算。
点击非雷区方格,显示数字,这个方格标记为“已点过”。
第四步,当方格数字为0时,这里要用到递归调用,就是让程序自动“点击”这个数字为0方格周围的八个方格,然后再看结果,如果不是0,就停止,如果是0,依然递归调用,直到没有0为止,或者直到点遍所有方格为止,一定要注意不要越出数组边界。
第五步,很简单,宣布玩家死亡就可以了。
查阅相关资料,了解扫雷的的玩法,了解扫雷的设计思想方法。
借鉴他人写过的程序,从中找到突破口。
从程序中了解需要的各种函数准备,再进一步获悉该函数的功能与使用方法。
对自己要设计的挖地雷游戏进行功能分析,大致如下:2.4游戏功能:简易版扫雷游戏要具备以下功能:1)开局:首先选择游戏等级,然后生成不同等级的雷区界面。
游戏等级分为三级:各等级行列数为———:简单:10×10、普通:15×15、困难:20×20;雷区每个*号下面或埋藏有1个地雷,或者没有地雷;2)挖雷:从键盘中输入(行数X,列数Y),并按回车键,可挖开它;若所揭方块下有9,则踩雷,此时所有含地雷的块都出现9,该局游戏失败;如果方块上出现数字,它代表在它周围的8个方块中共有多少颗地雷;3)输入:通过键盘输入相关指示信息;4)输出:提示游戏失败,是否继续再来一遍;3.游戏设计过程3.1基本设计类及流程图:扫雷游戏的主要设计的类有三个: Main、Pane 、MineField1)Main 是主控窗体,负责项目的启动和关闭;并协调内部各个组建模块的协调工作。
2)Pane是一个方格的封装,是雷区的重要组建;它表示一个方格的当前状态,以及是否布雷等信息。
3)MineField是雷区的封装,是游戏的核心组建;它负责方格的布局以及地雷分布;并控制玩家的基本操作以及正确的响应。
图1流程图3.2 设计过程:(1)组建雷区功能描述:Pane是一个方格的封装,是雷区的重要组建;它表示一个方格的当前状态,以及是否布雷等信息它所具有的公共属性:名称可见性返回值类型功能描述AroundMineCountpublicint获取或设置当前方块周围地雷的数量HasMinePublicbool获取或设置当前方块是否又雷StatePublicPaneState获取或设当前方块扫雷的状态.它所具有的公共方法:名称可见性返回类型参数功能描述Markpublicvoid无把当前方块标记为【有雷】状态,即:插上一个小红旗。
Openpublicvoid无打开该方块。
打开后如果如果有雷,则显示地理图标;否则如果周围有相邻的地理,则显示地雷数量。
Resetpublicvoid无恢复关闭状态,即:取消Mark()的操作结果。
Three:源码://默认的构造方法public Pane(){InitializeComponent();this.BackgroundImageLayout = ImageLayout.Stretch;}//公有属性:Public bool HasMine { get; set; }Public int AroundMineCount { get; set; }Public PaneState State { get; set; } //由于它有几种状态,设置一个枚举类型属性public enum PaneState{Closed, //关闭状Opened, //打开状Marked, //标记状态}//共有方法:public void Mark() //标记当前方格为又雷状态,插个小红旗{this.BackgroundImage = Properties.Resources.Markedthis.State = PaneState.Marked;}public void Reset() //恢复标记状态,取消小红旗标记{this.BackgroundImage = null;this.State = PaneState.Closed;}//打开方法//打开后如果如果有雷,则显示地理图标;否则如果周围有相邻的地理,则显示地雷数量。
public void Open(){if (this.HasMine){this.BackgroundImage = Properties.Resources.MineBomp;this.Enabled = false;}else{switch (this.AroundMineCount){case 0:this.BackgroundImage = null;this.Enabled = false;break;case 1:this.BackgroundImage = Properties.Resources.Num1;this.Enabled = false;break;case 2:this.BackgroundImage = Properties.Resources.Num2;this.Enabled = false;break;case 3:this.BackgroundImage = Properties.Resources.Num3;this.Enabled = false;break;case 4:this.BackgroundImage = Properties.Resources.Num4;this.Enabled = false;break;case 5:this.BackgroundImage = Properties.Resources.Num5;this.Enabled = false;break;case 6:this.BackgroundImage = Properties.Resources.Num6;this.Enabled = false;break;case 7:this.BackgroundImage = Properties.Resources.Num7;this.Enabled = false;break;case 8:this.BackgroundImage = Properties.Resources.Num8;this.Enabled = false;break;}}}图2游戏初始界面(2)分布雷区以及响应玩家操作功能描述:CrlMineField是雷区的封装,是游戏的核心组建;它负责方格的布局以及地雷的分布;并控制玩家的基本操作以及正确的响应。
它所具有的公有方法名称可见性返回值类型参数功能描述InitMineFieldPublicVoidint paneNumber, int mineNumber初始化雷区。
布局方格并随机分布地理。
DisplayAllPublicVoid明示雷区的全部方块里的内容。
当踩雷以后,给玩家显示所有地雷位置。