第12章 数组趣味程序(20101123).doc

上传人:pu****.1 文档编号:558906997 上传时间:2023-02-03 格式:DOC 页数:12 大小:316KB
返回 下载 相关 举报
第12章 数组趣味程序(20101123).doc_第1页
第1页 / 共12页
第12章 数组趣味程序(20101123).doc_第2页
第2页 / 共12页
第12章 数组趣味程序(20101123).doc_第3页
第3页 / 共12页
第12章 数组趣味程序(20101123).doc_第4页
第4页 / 共12页
第12章 数组趣味程序(20101123).doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《第12章 数组趣味程序(20101123).doc》由会员分享,可在线阅读,更多相关《第12章 数组趣味程序(20101123).doc(12页珍藏版)》请在金锄头文库上搜索。

1、3第12章 数组趣味程序12第 章 数组趣味程序数组是一种常用的数据组织形式,本章通过编制几个有趣味的程序,进一步了解数组在程序中的应用,提高设计算法和编制程序的能力。12.1 井字棋游戏通过编制井字棋这类小游戏趣味程序,可以了解开发游戏程序的一般思路。在开发游戏软件时经常用到数组,特别是棋类游戏,一般用二维数组存储棋盘等信息。井字棋游戏很简单,如图12.1所示,黑白两种棋子先后摆放,哪种棋子先摆成三个为一直线者胜。先看一下设计本程序的大致过程。12.1.1 分析设计图12.1 井字棋棋盘和两粒棋子 分析需求,理解题意。 确定数据的组织形式即数据结构。 总体设计和详细设计,总体设计主要描述基本

2、处理流程、功能分配、模块划分、接口设计等。详细设计主要设计描述每一个模块的算法、流程。 界面设计。界面是用户与计算机交互的重要媒介,一般游戏的界面都基于图形模式,在C语言中可以通过相关图形函数实现;而C语言字符模式界面的实现较为简单,本例棋盘状态的显示可以用制表符和相应字符进行设计,显示成三行三列的形式。 代码的编写、调试、运行。本程序中,可以采用一维数组或二维数组表示数据,本例采用一维数组“char a9”,在字符数组中用空格表示未落子,用、#分别表示黑子、白子。在此基础上可设计以下几个子函数。初始化(init)完成程序开始的准备,所有落子位置初始化为空格。显示棋盘(list)用制表符和相应

3、字符,以字符方式显示三行三列的棋盘状态。判赢(win)判断一方是否获胜,看是否有某一行、某一列、某一对角线上的字符都是同一字符。主控(main)控制程序的流程,让游戏双方进行游戏。程序流程如图12.2所示。图12.2 井字棋游戏程序流程图12.1.2 编制程序先定义一个全局型字符数组存储棋盘状态。char a9;设计相关函数。void init(void)/* 初始化,让数组元素初值为空格表示空棋盘 */int i;for (i=0; i9; i+) ai= ;void list(void)/* 显示棋盘 */printf(%2c%2c%2cn, a0, a1, a2);printf(n);p

4、rintf(%2c%2c%2cn, a3, a4, a5);printf(n);printf(%2c%2c%2cn, a6, a7, a8);int win(int i)/* 判断选手是否获胜 */char ch;int x=0;if (i%2=1) ch=;else ch=#;if (a0=ch&a1=ch&a2=ch) x=1; /* 判断第一行是否为同一棋子 */if (a3=ch&a4=ch&a5=ch) x=1; /* 判断第二行是否为同一棋子 */if (a6=ch&a7=ch&a8=ch) x=1; /* 判断第三行是否为同一棋子 */if (a0=ch&a3=ch&a6=ch)

5、 x=1; /* 判断第一列是否为同一棋子 */if (a1=ch&a4=ch&a7=ch) x=1; /* 判断第二列是否为同一棋子 */if (a2=ch&a5=ch&a8=ch) x=1; /* 判断第三列是否为同一棋子 */if (a0=ch&a4=ch&a8=ch) x=1; /* 判断主对角线是否为同一棋子 */if (a2=ch&a4=ch&a6=ch) x=1; /* 判断副对角线是否为同一棋子 */return x;main() int i, j; init(); list();i=1; /* 用i记录下棋数目,并控制选手交替 */ dodo /* 输入下棋的位置,从第一行往

6、下依次编号1到9 */printf(input 1-9 :n); scanf(%d, &j);while(aj-1!= ); /* 保证输入位置正确,即没有落子 */ if (i%2=1) aj-1=; /* 黑方落子*/ else aj-1=#; /* 白方落子*/ list(); i+;while(i=9&win(i-1)=0); /* 棋盘未满、选手未赢则继续 */ if (i=10) printf(no winner!); else if (i%2=0) printf(pre win!); else printf(later win!);上面的程序基于人与人对弈,如何让程序具有智能,即

7、实现人与计算机下棋呢?要和计算机对弈,必须有自动选择位置的函数来选择较好的位置,下面设计autosele函数,实现为某一选手选择最佳位置的功能。int autosele(int i)char play, opponent; int j, x=-1; int p8=0, 2, 6, 8, 1, 3, 5, 7;/*指定四个角、四个边的中心在数组中的位置*/ if (a4= ) return(4);/*选择中心位置*/ if (i%2=1) play=; opponent=#; else play=#; opponent=; for (j=0; j9; j+)/*先看有没有能使自己赢的位置,有则落

8、子*/ if (aj= ) aj=play; if (win(i)aj= ; x=j; return(x); aj= ; for (j=0; j9; j+)/*看有没有一位置能使对手赢,如有先占领*/ if (aj= ) aj=opponent; if (win(i+1) aj= ; x=j; return(x); aj= ; for(j=0; j8; j+)/*依次在四个角、四个边的中心找位置*/ if (apj= ) return(pj);另外为了实现人机对弈,还要对主函数进行修改,修改后的程序如下:main() int i, j, x=1; init(); list(); printf(

9、input 1 computer first ,0 user first:n); scanf(%d, &x); i=1; do if (i%2=x) j=autosele(i)+1;/*计算机自动选择位置*/ else do printf(input 1-9 :n); scanf(%d, &j); while(aj-1!= );if (i%2=1) aj-1=;else aj-1=#; list(); i+; while(i=9&win(i-1)=0); if (i=10) printf(no winner!); else if (i%2=0) printf(pre win!); else p

10、rintf(later win!);12.2 数字螺旋方阵所谓数字螺旋方阵是:对n阶方阵,从左上角往下按逆时针方向把1n2填入方阵。如3阶方阵为:1 8 72 9 63 4 599990009000900099999图12.3 方阵的初始化填充的方向:先向下,再向右、向上、向左循环,实际上是坐标的变化,在填入时,判断下一个位置是否是空白,是空白就填值,不是就改变方向。在本例中,为了不判断边界,先定义较大的数组,把第0行、第n+1行、第n列用非0填充,用作方阵的填0,三节方阵的初始化如图12.3所示。在填充时从第1个开始往下,遇到非0就改变方向。#define max 20main()int a

11、maxmax, i, j, n, k, di;scanf(%d, &n);for(i=0; i=n; i+) /* 用9填充第0行、第n+1行、第n列 */ a0i=9; an+1i=9; ain=9; for(i=1; i=n; i+)/* 用0填充第1行到第n行前n列 */ for(j=0; jn; j+) aij=0; a10=1; /*第1行第0列填充1*/ k=2; di=0; i=1; j=0; /*i表示行标,j表示列标*/*从2开始循环,di表示前进方向,0向下,1向右,2向上、3向左*/ while(k=n*n) switch(di) /*行、列值相应变化*/ case 0: i+; break; case 1: j+; break; case 2 :i-; break; case 3: j-; break; if(aij=0)/*找到了合适位置*/ aij=k; k+; else/*没找到合适位置,改变方向,先修改回原来的行、列值*/ switch(di) case 0:i-; break; case 1:j-; break; case 2:i+; break; case 3:j+; break; di=(di+1)%4; for(i=1; i=n; i+)/*输出方阵*/ for(j=0; jn; j+) printf(%3d, aij);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号