五子棋课程设计报告

别妄想泡我
883次浏览
2021年01月27日 22:27
最佳经验
本文由作者推荐

煤矿安全生产责任书-世界史复习提纲

2021年1月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


}
.





























.






























.
































煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲


煤矿安全生产责任书-世界史复习提纲