五子棋课程设计报告
别妄想泡我
883次浏览
2021年01月27日 22:27
最佳经验
本文由作者推荐
煤矿安全生产责任书-世界史复习提纲
.
.
石家庄铁道大学课程设计
单
位
分院
(
系
)
专
业
学
号
学生
指导教师
课程设计题目
五子棋
完成日期
2011
年
05
月
日
摘
要
五子棋的历史
:
五子棋是一种两人对弈的纯策略型棋类游戏,< br>是起源于
中国
古代
的传统
黑白棋
种之一
.
发 展于
日本
,流行于
欧美
.
容易上手,
老少皆宜,而且趣味横 生,引人
入胜;不仅能增强思维能力,提高
智力
,而且富含
哲理
,有 助于修身养性
.
五子棋相传起源于四千多年前的尧帝时期,比
围棋
的历史还 要悠久,可能早在
“尧造围棋”之前,民间就已有五子棋游戏
.
有关早期五子棋的文史 资料与围棋有相
似之处,因为古代五子棋的棋具与围棋是完全相同的
.
在上古的神话传 说中有“女娲
造人,伏羲做棋”一说,
《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋 ,
五色而文状鹑卵.”
善
注引三国淳《艺经》中曰:“棋局,纵横各十七道,合二百八
十九道,白黑棋子,各一百五十枚”.这段虽没明讲是何种棋类,但至少知道远古就
以漂亮的石 头为棋子
.
因而
规则
简单的五子棋也可能出自当时,
并是用石子作棋 子
.
亦
有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子后代 中遍
及开来
.
程序说明
:
本程序是一款棋类益智游戏程序,
是用
WIN- TC
编写在
WINDOWS
系统下运行的娱乐游戏
.
本程序可以实 现人人对战,操作采用键盘上的上下左右
键控制棋子的上下左右移动,
由空格键控制下棋,双方都可通过
ESC
键终止游戏
.
游戏开始后,
红、
白 双方轮流下棋,
程序会根据双方下棋的先后顺序自动显示不
同颜色的棋子,提示当前下棋的棋手 ,任何一方由五子连成一线时,游戏结束,
.
.
.
.
.
结束时会显示对战双方胜负情况
.
关键词:五子棋游戏应用程序,
C
语言,图形函数
目
录
第
1
章选题的意义………………………………………………………………
2
1.1
…………………………………………………………………………
2
1.2
…………………………………………………………………………
2
第
2
章系统功能需求分析
………………………………………………………
3
2.1
系统的基本要求
………………………………………………………
3
2.2
…………………………………………………………………………
3
第
3
章系统设计
…………………………………………………………………
5
第
4
章系统实现
…………………………………………………………………
7
第
5
章总结
………………………………………………………………………
33
第
1
章
选题的意义
1.1
意义
通过游戏过程增加编程的兴趣,提高编程水平
.
编制该程序我对以下的知识点进行的巩
固和掌握:
1.
数组元素为结构体的数组应用
.2.
全局变量应用
.3.
按键的处理
.4.
数组元素与< br>蛇、
食物的对应关系
.5.
图形方式等等
.
加深对所学知识的 理解与掌握,
增强自己对所学知识
解决实际问题的能力,为以后的程序开发打下基础
.
1.2
设计思路
棋
盘
设
计
为
18
×1
8
格
,
初
始
状
态
光标
在
棋
盘
的
中
央
,
玩
家1
先
走
,
轮
流
落
子
,
当一
方
连
成
五
子
或
下
满
棋盘
时
,游
戏
结
束(
连
成
五
子
的
一
方
获
胜
,下
满
棋
盘
为
和
棋
)
.
当
游
戏
一
方
胜
利
后
显
示
胜
利
信
息
.
从程序表面看,这是一个二维平面图,所以数
据用二维数组来表示,
数组两个下标可以表示棋盘 上的位置,
数组元素的值代表棋格上的状
态,共有三种情况,
分别是
0
代表空格,
1
代表白棋,
2
代表黑棋
.
这样程序的主要工 作是接
收棋手按键操作,棋手用
Up
、
Down
、
Left
、
Right
控制光标移动,空格键表示落子
.
一旦接
收到 空格键,
说明棋手落子,
先判断是否是有效位置,
也就是说已经有棋子的位置不能重叠
.
.
.
.
.
落子
.
落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左 下、
右上、
右下是否有相同颜色的棋子连成五子,
如果连成五子,
则游戏结束 ,
输出相应的信息
.
如果想退出游戏,可以按
Esc
键
.
第
2
章
系统功能需求分析
2.1
系统的基本要求
操作系统为
WindowsXP
,设计语言为
Visual C++
或
Turbo C++3.0.
2.2
需求分析
1.
游戏需求
(
1
)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;
(
2
)画出棋盘的大小;
(
3
)画棋子并确定棋子的大小;
(
4
)判断键盘输入哪个键执行操作;
(
5
)玩家
P1
先落棋;
(
6
)玩家轮流下棋;
(
7
)判断赢家
.
2.
功能模块
初
始
化
模
块
下棋操
作
模块
判
断
胜
负
模块
帮
助
模
块
.
.
.
.
.
五子棋游戏
初
始
化
模
块
下
棋
操
作
模
块
判
断
胜
负
模
块
帮
助
模
块
.
.
.
.
.
3.
流程图
开始
帮助信息
显示棋盘
10x10
玩家
1
先下棋
显示棋子位 子,玩家
1
为白色
O
子,玩家
2
为红色
x
子
换玩家
下棋
五子连成一线
No
Yes
玩家
1
?
No
Yes
玩家
1
赢
玩家
2
赢
结束
第
3
章
系统设计
1
.定义全局变量
.
.
.
.
.
1.
int
status[N][N]
。
/*
定
义
的
数
组
,表
示
棋
盘
某
点
的
状
态
(
棋
手
1
或
棋
手
2
)
*/
2.
int
step_x,step_y
。
/*
行
走
的
坐
标
,
即
每
一
步
光
标
移
动
的
距
离
*/
3.
int
key
。
/*
获
取
按
下
的
键
盘
的
键
*/
4.
int
flag
。
/*
玩
家
标
志
,当
flag=0
时
,表
示
该
点
无棋
子
,
flag=1
表
示
玩
家
1的
棋
子
,
flag=2
表
示
玩
家2
的
棋
子
*/
2
.
Main()
主
函
数
按
照
语
法
规
则
,
首
先
定
义
使
用
到
的
常
数
、
全
局
变
量
、
函
数
原
型
说
明
.
棋
盘
状
态
用
数
组
int
status[19][19 ]
,
初
值
为
0
,表
示
空
格
.
函
数
的
实
体
比
较
简
单
,调
用
图
形
驱
动
、画
棋
盘
、人
人
对
弈
等
自
定
义
函
数
, 一
旦
游
戏
结
束
后
,关
闭
图
形
驱
动
,程
序
结
束
.
3
.< br>DrawBoard()
画
棋
盘
函
数
背< br>景
颜
色
设
为
绿
色
,
从
坐< br>标
(100
,
100)
开
始
每
隔
2 0
个
单
位
用
黄
色
画
一
条
水
平
直
线
,一
条
垂
直
线
,构成
棋
盘
,用
循
环
语
句
实
现< br>.
画
线
函
数
line()
的
参
数< br>为
线
的
起
点
和
终
点
坐
标< br>,注
意
要
计
算
正
确
.
函
数
setfillstyle()
可
以
设
置
填
充模
式
和
填
充
颜
色
,
circle(x ,y,8)
以
x
和
y
为
圆
心
画
圆
(
这
里
半
径
为
8
)
,
用
它
表
示
棋
子
.
4
.
ResultCheck(int
x,int
y)
判
断
是
否
胜
出
函
数
本
函
数
根
据
每
次
落
子
的
位
置
,
分
别
向
上
、
下
、
左
、
右
、
左
上
、
左
下
、
右
上
、
右
下
八
个
方
向
判
断
是
否
有
相
同
颜
色
的
棋
子
连
成
五
子
,如
果
成
立
,游
戏
就
结
束
,并
显
示
提
示信
息
(
如
:
红
方
获
胜
),
否
则
继
续
落
子
.
5
.< br>Done()
执
行
下
棋
函
数
这< br>是
游
戏
进
行
的
函
数
,
主< br>要
是
接
收
棋
手
的
按
键
消< br>息
,
其
处
理
过
程
如
下
:< br>
(1)
按
Esc
键
程
序
可
以< br>随
时
结
束
.
(2)
按
上
下左
右
光
标
键
,
则
改
变
棋子
移
动
的
坐
标
值
.
(3)
按
空
格
键
后
判
断
:
1) 如
落
子
的
位
置
已
经
有
棋则
无
效
,
继
续
按
键
.
2)
如
落
子
位
置
是
空
格
,
可
以
将
棋
子
落
入
格
,
调
用
ResultCheck(int
x,int
y)
函
数
.
.
.
.
.
.
3)
如
果
棋
子
变
化
后
,棋
盘
已
下
满
了棋
子
,
则
游
戏
结
束
.
显示
平
局
信
息
.
(4)
重
复
上
述
步
骤
,
直
到
游
戏
结
束
.
6
.
图
形
功
能
函
数
以
下
函
数
原
形
都
在
graphics.h< br>中
.
(1)registerbgidriver():
(2)initgraph(int
*driver,
int
*mode,
char
*path):
用
于
初
始
化
图
形
系
统
,
并
装
入
相
应
的
图
形
驱
动
器
.
该
函
数
把
由
driver
所
指
向
的
图
形
驱
动
器
代
码
装
入
存
.
如
果
图
形
驱
动
器
未
装
入
存
,
图
形
函
数
将
不
能
操
作
.
图
形
函
数
所
用
的
屏
显
模
式
由
mode
所
指
向
的< br>整
数
值
确
定
.
最
后
,
图< br>形
驱
动
器
的
路
径
是
由
pa th
所
指
向
的
字
符
串
给
出
.
如
果
没
有
指
定
路
径
,
就
在
当
前
工
作
路
径
上
寻
找
.
(3)rectangle(int
left,int
top,int
right,int
bottom):
函
数rectangl
e()
用
当
前
画
出
由
坐
标
left,top
及
right,bottom
所
定
义
的
矩
形
.
(4)setcolor(int
color):
把
当
前
画
线
颜
色
设
置
为
color
所
指
定
的
颜
色
.
(5)closegraph():
该函数使图形状态失效,并且释放用于保存图形驱动 器
和字体的系统存
.
当你的程序既用到图形输出又用到非图形输出时,应该用此函数
.
该函数还把系统屏显模式返回到调用
initgragh()
前的状 态
.
第
4
章
系统实现
1.
程序代码
/*win-tc
下的五子棋源代码
*/
/*
加载头文件
*/
#include
输入输出函数
*/
#include
包含系统函数,
定义杂项函数及存分
配函数
*/
#include
图像函数
*/
#include
存放有接口函数
*/
.
.
.
.
.
#include
定义了通过控制台进行数据输入和
数据输出的函数,主要是一些用户通过按键盘产生的对应 操作
*/
/*
编译预处理,定义按键码
*/
#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
/*
定义棋盘数组大小,即棋盘的大小,这里为
18x18
格
*/
#define N 19
/*
定义全局变量
*/
int
status[N][N]
。
/*
定义的数组,
表示棋盘某点的状态
(棋
手
1
或棋手
2
)
*/
int
step_x,step_y
。
/*
行走的坐标,即每一步光标移动的距
离
*/
int key
。
/*
获取按下的键盘的键
*/
int flag
。
/*
玩家标志,当
flag=0
时,表示该点
无棋子,
flag=1
表示玩家
1
的棋子,
flag=2
表示玩家
2
的棋 子
*/
.
.
.
.
.
/*
自定义函数原型
*/
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)
。
/*
将当前字符屏幕的光标位置移动到
x,y
坐标位置
*/
/*
显示欢迎信息
*/
printf(
。
gotoxy(12,6)
。
printf(
。
gotoxy(12,8)
。
printf(
。
.
.
.
.
.
gotoxy(12,10)
。
printf(
。
gotoxy(12,12)
。
printf(
。
gotoxy(12,14)
。
printf(
。
ch=getchar()
。
/*
从标准输入流读取一个字符并回显,
读到回车符时退出
*/
/ *
判断程序是否要继续进行,按
n
表示退出,
y
表示继续玩游戏*/
if(ch=='n'||ch=='N')
/*
如果不继续进行,则推出程序
*/
exit(0)
。
/*
程序中止执行,返回调用过程
*/
}
/*
画棋盘函数,用来画棋盘的格子和棋子,这里棋子用带某一颜色的圆圈表示
*/
void DrawBoard()
{
int x1,x2
。
int y1,y2
。
/*
设置背景色
*/
setbkcolor(2)
。
/*
设置线条颜色
*/
setcolor(14)
。
/*
设置前景颜色
,
颜色值含义如下
: */
/*
0
-
BLACK
黑
深色
0
-
7
*/
.
.
.
.
.
/* 1 - BLUE
兰
2 - GREEN
绿
*/
/* 3 - CYAN
青
4 - RED
红
*/
/* 5 - MAGENTA
洋红
6 - BROWN
棕
*/
/*
7
-
LIGHTGRAY
淡灰
8
-
DARKGRAY
深
灰
淡色
8 - 15 */
/*
9
-
LIGHTBLUE
淡兰
10
-
LIGHTGREEN
淡绿
*/
/*
11
-
LIGHTCYAN
淡青
12
-
LIGHTRED
淡红
*/
/* 13 - LIGHTMAGENTA
淡洋红
14 - YELLOW
黄
*/
/* 15 - WHITE
白
*/
/*
设置线条风格、宽度
*/
setlinestyle(DOTTED_LINE,3,1)
。
/*
设置画线模式
,linestyle
画线风格,
取值和含义如下
*/
/* SOLID_LINE= 0
实线
DOTTED_LINE=1
点线
*/
/* CENTER_LINE=2
中心线
DASHED_LINE=3
虚线
*/
/* USERBIT_LINE=4
用户自定义模式
*/
/* upattern
在
linestyle=USERBIT_LINE
时,表 示自定义的线型
thickness
线宽,有
2
个取值。
*/
/* NORM_WIDTH=1 1
个象素宽度
THICK_WIDTH=3 3
个象素宽度
*/
/*
按照预设的偏移量开始画棋盘
*/
.
.
.
.
.
for(x1=1,y1=1,y2=18
。
x1<=18
。
x1++) /*line
用于画直线,
x1,y1,x2,y2
直
线的起点和终点坐标
*/
line((x1+ OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x )*OFFSET,(y2+OFFSET_
y)*OFFSET)
。
for(x1=1,y1=1,x2=18
。
y1<=18
。
y1++)
line((x1+OFFSET_x)*OFFSET,(y1+OFFS ET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_
y )*OFFSET)
。
/*
将各个点的状态设置为
0*/
for(x1=1
。
x1<=18
。
x1++)
for(y1=1
。
y1<=18
。
y1++)
status[x1][y1]=0
。
/*
显示帮助信息
*/
setcolor(150)
。
/*
设置字体、大小
*/
settextstyle(1,0,4)
。
/*
设置图形模式下字符显示底字体、方
向和大小
*/
/*font
显示字体,取值如下:
*/
/*DEFAULT_FONT =
0 8x8
点阵
*/
/*TRIPLEX_FONT =
1
三倍笔划
*/
/*SMALL_FONT =
2
小号字体
*/
/*SANS_SERIF_FONT = 3
无衬线字
体
*/
.
.
.
.
.
/*GOTHIC_FONT =
4
哥特字体
*/
/*directiom
显示方向,
取值如下
: */
/*HORIZ_DIR =
0
水平显示
*/
/*VERT_DIR =
1
垂直显示
*/
/*charsize
字体放大倍数,取值为
0-10*/
outtex txy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,
。
/*
图形模式下在
x,y
坐标位置显示一行字符串
*/
setcolor(9)
。
settextstyle(3,0,1)
。
outtextxy((19 +OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,
。
outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y )*OFFSET,
。
outtextxy((19+OFFSET_x) *OFFSET,(8+OFFSET_y)*OFFSET,
。
outt extxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,。
outtextxy((19+OFFSET_x)*OFFSET,(12 +OFFSET_y)*OFFSET,
。
setcolor(14)
。
settextstyle(1,0,1)
。
outtextxy((19 +OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,
。
setcolor(9)
。
settextstyle(3,0,1)
。
outtextxy((19 +OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,
。
}
.
.
.
.
.
/*
画圆函数,用来表示玩家的棋子
*/
void DrawCircle(int x,int y,int color)
{
setcolor(color)
。
/*
设置画圆线条的风格,宽度,这里设置为虚线
*/
setlinestyle(SOLID_LINE,0,5)
。
x=(x+OFFSET_x)*OFFSET
。
y=(y+OFFSET_y)*OFFSET
。
/*
以
(x,y)
为圆心,
8
为半径画圆
*/
circle(x,y,8)
。
}
/*
交换行棋方函数,即让玩家轮流下棋
*/
void Alternation()
{
if(flag==1)
flag=2
。
/*
如果此时 为玩家
1
落棋,
则下回换为
玩家
2
落棋
*/
else
flag=1
。
/*
如果此时为玩家
2
落棋,
则下回换为
玩家
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++
。
else
break
。
}
.
.
.
.
.
/*
水平向右数
*/
for(j=x,k=y
。
j<=18
。
j++)
{
if(status[j][k]==flag)
n2++
。
else
break
。
}
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++
。
else
break
。
}
.
.
.