c++课程设计五子棋游戏
巡山小妖精
882次浏览
2021年01月18日 14:52
最佳经验
本文由作者推荐
孕妇每月食谱大全-伤仲永ppt
--
一、课程设计目的、任务和内容要求:
《计算 机语言程序设计》是一门以编程实践为主的专业课,目的在于培养学生利
用计算机语言进行软件开发所必 需的基本思想和基本技能,进一步提高综合应用计算
机语言的各种编程知识和技巧进行程序设计的能力< br>,
通过本次课程设计,
学生应能达到
具备设计功能较为复杂的应用程序的能力< br>,
同时培养学生自主学习和独立创新的精神。
任务如下:
1.
进行需求分析和概要设计,给出流程图。
2.写出详细设计,熟悉其中采用的关键技术。
3.
给出具体的编码实现并调试。
4.
写课程设计报告提交源程序。
内容要求:
设计并完成软件系统。要求:
1.
应具有简洁友好的用户界面。
2.要求软件系统的功能完整。
3.
要求程序具备正确性
,
可读性和运行的高效性。
--
--
二、进度安排
:
第1
~3
天:
查找资料
,
进行需求分析和概要设计;
第
4
~
6
天:
各模块的详细设计
;
第
7
~1
2
天:
软件实现与调试;
第
1
3~14天
:
写课程设计报告并提交源程序。
三、主要参考文献:
[1]
四维科技
,
丁展
,
汤倩.
V
i
s
u
al
C++
游戏开发 技术与实例
[M].
北京
:
人民邮电出
版社
,2
0
05
[
2
]
求是科技
,
张宏林.Visu
al C++ 6.0
程序设计与开发技术大全
[M]
.
北京
:
人民邮电出版社
,20
0
5
[3]
汪翔,
袁辉
.Visual
C++
实践与提高
(
网络编程篇
)[M]
.
北京:
中国铁道出版社
,20
0
1
[
4]
黄维通
.Vis
ual
C++
面向对象与可视化程序设计
[M].
北京
:
清华大学出版社,
2
003
[5]
谢希任
.
计算机网络
(
第4版)
[M]
.
北京
:
电子工业出版社
,2005
[6](
美
)W. Ric
h
ard Ste
ve
ns
.
TCP/
I
P
详解卷
1:
协议
[M
]
.
北京:机械工业出
版社
,2005
[
7
]
北京现 代富博科技有限公司
,
陈兵旗
,
孙明
.
北京:
Vis
u
a
l
C+
+
实用图象处理
专业教程
[M]
.清华大学出版社
,2
0
0
4
[8]
张 静.
Windo
w
s
多媒体编程基础
[M].
北京
:
清化大学出版社
,2
0
05
[9
]
刘振安,
徐峰
.Wind
o
ws
实用编程指南[M
].
北京
:
人民邮电出版社
,1
9
95
[10
]刘长明
,
杨工明
.Vis
u
al
C
+
+
实践与提高
(
多媒体篇)
[M].
北京
:
中国铁道出版
社
,2
0
01
指导教师签字
:
--
--
年
月
日
--
--
目
录
摘
要
………………………………………………………………………………………
II
A
b
st
r
act
…………………………………………… ……………………………………
.
.
.
II
1
绪论
……………………
.
……………………………………
.. 1
1.1
课题背景
…………………………………………………………………………
...
1
1.
2
课程设计的目的
…………………………………………
..
…………………………
1
2
设计方案简述
………………………………………
.
.
…………………
.. 2
2
.
1
可行性分析
………………………………………………
.
.
…………………………
.
2
2.
2
需求分析
…………………………………………………
.
.
…………………………
.2
3
详细设计
……………………………………………………………
..
………………
.
.< br>3
3
.
1窗体设计
………………………………………………
..
……………………………
..3
3.2
游戏项目开发
………………………………………
.
.
…………………………………
5
3
.2
.1棋牌设置
…………………………………………………………… ……………
..
…
5
3
.2
.
2
放置棋 子功能的开发
………………………………………………………………
.
.6
3.
3
.3
游戏获胜决断的开发
……………………………………………………
.
………
.12
3
.
2.
4游戏的调试与运行< br>…
………………………………………
.
……………
20
4
设计结果及分析
………………………………………………
..
… …
.
……………
2
2
4.1
程序的结果
……… ………………………………
.
………………………………
..22
4.2
结果分析
…………………………………………
.
.
… ……………………………
.
.
23
5
总
结
……
.
.
…………… ……………………………………
.
.………………………
24
参考文献
……
.
………………
..
……………… ………………..………………………
25
--
--
摘
要
网络游戏的出现代表了一种全新娱乐方式的诞生。
目前网络游戏正以其独 特的魅力吸引
着众多的玩家。随着游戏产业的蓬勃发展,将需要越来越多的人加入到游戏开发中来。
本毕业设计所完成的五子棋游戏
(网络版)
是在
Wind
o< br>w
s
X
P下使用
Micro
s
oft V
i
sual
C
++6
.
0
开发的
C/ S
系统,可以实现网络间的双人对战,并且可以提供多媒
体播放功能。系统的多媒体播放功能可 以播放MP
3
、WM
A
等主流格式的音乐。
本论文从基本 网络套节字开始入手
,
介绍了一些本系统相关的理论知识
,
随后详细介绍了< br>五子棋游戏
(
网络版)的开发过程。包括服务器端、客户端的
so
c< br>ket
编程,五子棋服
务器和客户端通信的实现
,
五子棋判断算法的实 现
,
主界面视图
,
多媒体播放以及定时器
等附加功能的实现。最后对 系统进行测试并对所做工作进行总结。
关键词
程序设计;
Fivec
h
e
s
s;MFC;
Ab
s
tra
c
t
A
b
stract
On
-
line
games
b
r
in
g
to
a
new
f
orm
of
e
n
t
e
rtai
nme
n
t
.
Unt
i
l
n
o
w
,
on-
l
ine ga
m
e
s
i
s
c
h
armi
n
g m
or
e
a
nd
more players.
As
t
he
developm
e
nt
of
g
ame
in
d
u
st
r
y
,
t
her
e
wi
l
l
b
e
mo
r
e
and
more
deve
l
o
p
e
r
s
join
in the gam
e
dev
e
lop
m
ent t
ea
m.
T
h
e
on
-l
ine
Bl
ac
k&
W
h
ite game was devel
ope
d by Microso
ft
V
i
s
u
al
C+
+6.
0 on Window
s
XP
p
l
atfo
r
m.
I
n
th
is
g
ame
,
t
wo
p
eople
c
a
n
play
t
h
e
game on lin
e
, and the
gam
e
al
so
pr
o
vides
mul
t
imedia play
e
r
fu
nctio
n
.
T
he th
e
sis
s
t
ar
t
w
ith in
tr
odu
c
tio
n
of n
e
twork
s
o
cket programming
,
t
he
develo
p
ment process
i
ng of the
o
n
-l
ine
B
lack
&
W
h
ite ga
m
e are in
t
rod
u
c
e
d
i
n
detail
a
s
fol
l
owed.
T
he
thesis
h
ave
a
f
ull
t
o
uch
on
server
a
nd
c
lient
s
ocke
t
pr
ogramm
i
n
g,
th
e
c
o
m
munica
t
ion
betwee
n
serve
r
a
n
d
c
l
ie
n
t
w
a
s
im
p
le
m
ented
,
the
algorith
m
of
the
f
iv
e-i
n-a-
r
o
w
game
,
the
mu
lti
me
dia playback
f
unc
tio
ns.
K
eyword
s
:
prog
ra
m; comp
u
ter
;
M
FC; Fivechess
--
--
--
--
1
绪论
娱乐是人类不可或缺的生活内容
,
目前市场上的游戏种类繁多读者将所学的语言应
用到 实际
,
用学习的
c
+
+
语言编程开发一个简易的计算机单机 游戏
,
即五子棋游戏。
1.1
课题背景
中国民 族原创网络游戏为中国网络游戏产业所做出了巨大贡献,民族原创网络
游戏已经成为产业发展的主导力量 。
同样在中国自主研发的民族原创网络游戏已经真正
成为中国游戏市场的主导力量。
网络游戏是通过信息网络传播和实现的互动娱乐形式,是一种网络与文化相结合的产
业。
近年来,
网络文化市场发展很快,
随着互联网的迅速普及、
宽带的接入社区和家庭,
我国网络游戏市场发展迅速并进入了一个高速增长期
,
并已经创造了较大的产值,带动
了相关产业的发展
,
对促进我国网络经济和娱乐业的发展、丰富互联网时代人民群众的
文化娱乐生活起到了积极作用。
1.2
课程设计目的
在程序设 计中,通过设计、编制、调试一个五子棋的程序,加深对语法及语义分析
原理的理解
,
并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:
一是传统的结构化程序设计方 法
,
二是更先进的面向对象程序设计方法。
由于多个函数均需要访问某些数据
,
这些数据常被设计为全局变量。
而在面向对象程序设计中关键是如何将问题域中的实体
(
即日常所见的概念)抽取
出 来
,
作为C+
+
程序中的类,而属性与行为作为类的两类要素通常是必不可少 的,甚至
还应考虑类必须满足的约束。
--
--
2
设计方案简述
如下是描述整五子棋游戏的流程
,
开发一个五子棋游戏需要从两方面入手。一
是游戏规则,二是技术。其实
,
任何软件开发都是这两大类。根据项目的特点,将不相
关的功能分块份阶段进行。大致流程如下:
1.
画棋盘
;2
画棋子;
3
增加下棋制约条件;
4.
每下一步,判断输赢
;
5
.< br>调试运行。
2.
1
可行性分析
游戏设计已经成为现在社会的一种热门行业。五子棋是一种受 大众广泛喜爱的游
戏
,
其规则简单,变化多端,非常富有趣味性和消遣性。这里设计和 实现了一个简单的
五子棋单机游戏。主要应用了
Visu
a
l
C+
+
编程来完成这个游戏的设计的。本文主要
介绍了本游戏开发环境
M
i
crosof
t
V
isual
C
+
+
6
.
0
,使用当前优秀的开发工具
VC++
编程。包含了五子棋程序的棋盘初始化、游戏规则、胜负判断。思路简单明了
,程序也较为简单。可以灵活运用一学过的
c++
知识来编写程序。
2
.
2
需求分析
近年来
,
随着网络的发展,游戏成为许多人关注的焦点。与传统的影音产业 一样
,
游戏产业也是娱乐行业的一个重要组成部分
,
基于数字化的网络游戏更 让人们找到了前
所未有的感受,并已经成为全球互联产业的热点。五子棋
,
亦称
“
连五子
”
、
“
串珠
”
、
“
五
目
”
、
“
五格
”
等等,
日文称之为
“
连珠
”
,
英文则称之为
“
Goba
ng”或
“
Renju
”
或
“FI
R(
Five In a
Ro
w
)”
,是起源于中国古代的传统黑白棋种之一,是 一种体现民族特
色的休闲游戏
,
同时能较好的锻炼人的思维。具有广阔的开发前景。< br>
--
--
3
详细设计
3
.1
窗体设计
利用
MFC
A
ppWin
z
ard
生成五子棋游戏应用程序框架具体步骤如下:
(1)
执行
V C
程序,选择
File|Ne
w命令
,
弹出N
ew
对话框
.
单击
Projec
t
s
标签,转到
Pro jects
选项卡
,
选择
MFC
AppWiza
r
d(exe)
选项
,
然后在
Project
n
a
m
e文本框中输入
Five
c
h
e
ss
_
44
。L
a
c
a
t
ion
文本框是指 项目的本地路径。
--
--
(2)
单击按钮,弹出
MFC AppWin
z
ard_
S
te
p
1
对话框。选中单选按钮
,
如图所示。
(3
)单击完成按钮,则建立一个单文档应用框架。
--
--
3.
2游戏项目开发
(
四号字
黑体
)
3
.
2
.
1
棋盘设计
1.
在已 创建的工程
Fiveches
s
_44
中添加画棋盘的函数。
首先在
“Fi
veche
s
s_44.
h”
头
文件中定义一个用于显示棋盘的自定义公有函数:
void Chec
k
erboard(CDC*pDC);
然后在“
Fivech< br>e
ss
_44
V
i
ew
.
cpp
” 源文件中实现该函数。代码如下
:
voi
d
C
F
ivech
e
ss_44
V
ie
w
::Ch< br>e
cke
r
boa
rd
(CDC*pDC
)
{
ﻩ
fo
r(in
t
i=0;
i
<20;i++
)
//
连续画
2
0条竖线
{
ﻩﻩ
p
DC->M
ov
eTo( i
*
50,
0)
;
//
画笔移动到
(i*50,0)
点
p
DC->Li
n
eT
o
(
i
*5
0
,1000);
//
画笔从
(i*50
,
0
)点到
(i
*
50,10
00)
点
ﻩ
}
for(i=0;i<20;
i
++)
//
连续画
20
条横线
{
ﻩ
pDC->MoveT
o(
0,i*50);
ﻩ
p< br>D
C->
Li
neT
o
(
10
00,
i
*5
0
)
;
}
}
2.
在应用程序框架的
OnDr
a
w
()函数中调用该画棋 盘函数,将
pDC
对象作为实参传
递给Ch
ec
k
erb
oard
(
)
函数
,
代码如下:
void CFivechess_44Vi
ew::O
n
Draw(CDC
*
p
DC)
{
ﻩ
CFi
ve
ches
s
_4
4Do
c* p
Do
c = Ge
t
Do
c
ument()
;
A
SSERT_V
ALID(pDoc);
/
/
TODO:
add
d
ra
w code for nati
ve
da
t
a
h
ere
Checkerboar
d
(
pDC
)
;
/
/
调用自定义的画键盘函数
}
3.
编译运行得到如下效果
:
一个空棋盘
--
--
3
.
2
.
2
放置棋子功能的开发
按照规划
,
棋子使用鼠标的左键和右键
(
分别用这两键来表示下棋的双方 )
来进行单机下
棋
,
即是当用户单击左键时
,
下黑色棋子,
,用户单击右键时
,
下白色棋子。因此
,
必须为鼠
标添加鼠 标左键和鼠标右键单击的鼠标消息处理函数
,
步骤如下:
1
.右击C
FivechessV
iew类,调用添加消息处理函数的对话框,选择
A dd w
i
ndo
w
s
Mes
sa
geH
an
dler
2.添加消息处理函数< br>WM_LBUTTONDO
W
N
和W
M_RBUTT
ONDOW
N这两个消息
处理函数。然后点击
Edit Ex
is
i ti
n
g
退出对话框。并添加消息处理函数代码。如下图
所示:
添加鼠标左键和右键的消息处理函数:
(1)
.
左键消息
voi
d
CFi
v ech
e
s
s_44
Vi
ew::
O
n
L But
tonD
ow
n(
U
INT
n
Flag
s
,
C
--
--
Point
po
in
t
)
{// TODO: Add
y
o
ur mes
sa
ge ha
ndl
er cod
e
h
e
r
e
and
/or
c
a
l
l
de
f
a
u
lt
ﻩ
CBrush
*
brush =
n
ew CBr
u
s
h
(RGB(0,0,
0
)) ;//
定义黑色画刷
ﻩﻩ
C
DC
* pDC = t
h
is->G
e
t
DC(
);
/
/获取当前的图形设备指针
ﻩﻩ
pDC->SelectOb
j
ect
(brush);
//
选中该黑色画刷
ﻩ
for
(
i
n
t i = 0
;
i
<
1
0
0
0
;
i+=5
0)
{
for(int j
= 0 j
< 1
00
0 j
+
=50)
ﻩﻩﻩ
{C
R
ect rec
t
(i,j
,
i+50,j+50);
i
f
(rect< br>.
PtIn
R
ec
t
(poin
t)
)
{
CPo
i
nt
t
e
mp
P
oi
nt
ﻩﻩ
t
em
pPoint
=
r
e
P
oint
()
;
ﻩ
pDC->Ellipse(te
mp
Po
in
t.x-20,te
m
pP
o
in
t
.y-20,
t
empP
o
i
nt
.x
+2
0,
t< br>empPoi
n
t.y+20);
ﻩﻩ
}
ﻩ
ﻩ
}
}
CVie
w
:
:
O
nLButton
D
ow
n
(nFl
a
gs, poi
n
t);
}
(
2)
.
右键消息
v
oid
CFi
v
e
che
ss_4 4View::O
n
RButto
n
Do
w
n(U
IN
T
nF
l
a
gs,
CPo
i
n
t
poi
nt)
{
// TODO: Add yo
u
r message handler
code
here an
d
/o
r
c
a
ll defaul
t
CB
ru
s
h
*
brus
h
=
n
e
w C
B
rus
h
(< br>RG
B
(255,255,
2
5
5
)
)
;
/
/
定义白色
画刷
ﻩ
CDC*
pDC
=
t
h
is-
>
GetDC()
;
//
获取当前的图形设备指针
ﻩ
pDC->
S e
l
e
ctObje
c
t
(
b
r
u
s
h);
//
选中该白色画刷
ﻩﻩ
fo
r
(int
i =
0
; i < 1000
i+=
5
0)
{
for
(i
n
t
j
=
0
;
j
< 100
0
;
j+=
5
0)
{
C
Rect
re
c
t
(i,j,
i
+5 0,j+5
0
);
/
/
每格都信定义一矩形
if(rec
t .
P
tI
nRec
t
(poi
n
t
))
/
/如果鼠标点在该矩形内
{
C
P
oint
t
empP
oi
nt
ﻩﻩ
tem
p
Poi
nt
= rec
t
.Ce
n
terPoint()
;
/ /
获取矩形中心
,
用于画棋子
ﻩﻩ
p
DC->Elli
ps
e(tempPo
i
nt.
x-< br>20,
t
empPo
i
n
t
.y-20,
t
empPoi
nt
.x+2
0
,te
m
pPoi< br>n
t.y+2
0)
;
ﻩﻩﻩ
}
ﻩ
ﻩ
}
}
ﻩ
CVi
e
w::
O
nRB
ut
to
n
Do
w
n
(
n
F
l
ag
s, point);
}
--
--
到此便将画棋盘和棋子的 代码编好,编译运行如下
:
左击鼠标左键画黑点
,
右击鼠标右键
画白 点
3
.
但程序至此尚有两点未解决:
其一
,
下棋子的约束条件,即双方按顺序一人下一次才可第二次落棋子。其二
,< br>同一方格
不能重复下棋子
;
解决第一个问题,添加以下代码
:
(
1
)
在
CFivechess_44V
ie< br>w
中添加一个公有的整形变量
int
Rig
h
tO
R
Let;
//定义保存左键或右键下棋的标记变量
(
2
)
构造函数将下棋的顺序初始化为左键先下
C
Fivechess_4 4View::CFivec
h
ess
_
44V
i
ew(
)
{
//
TODO:
a
dd con
s
t
ruc
ti
o
n code
h
ere
RightO
R
Let=0;
//
初始化默认左键先下
}
(
3
)
修改鼠标的左键和右键的单击消息处理函数
,在画棋子之前判断轮到哪方下棋
,
代码如下:
左键代码
:
vo
i
d
C
Fi
v
e
c
he
s
s_
4
4Vie
w
::On L
Bu
tt
o
n
D
own(UINT
nFlags,
CPoint
point)
{
// T
O
DO:
Ad
d
yo
u
r
messag
e
handle
r
c
o
de here and/or
ca
l
l
d
efault
i
f
(Rig
htO
RLeft==0 )
{
--
--
ﻩ
CB
r
ush*
b
ru
s
h
= ne
w
CBrush(RGB
(0,0
,0
)
) ;
/
/
定义黑色画刷
ﻩ
C
D
C* pDC =
thi
s
-
>
GetDC()
;
/
/
获取当前的图形设备指针
pDC-
>
SelectObject
(
brush);
/
/选中该黑色画刷
ﻩﻩ
for(
int
i =
0 i
<
1
0
0
0
; i
+
=50)
ﻩﻩ
{
ﻩ
f
or(
in
t j
=
0 ;
j
< 1000 j+=
5
0)
ﻩ
{
ﻩﻩ
CRe
ct
rect(i,j
,i+
50,j+50)
;
if(rect
.P
t
I
nRect
(
poi
n
t)
)
{ CPo
i
n
t
t
e
m
p
P
o
i
nt
ﻩ
ﻩ
t
em
pP
o
int = r
e
r
P
oi
nt();
ﻩ
pDC-
>
Elli
pse
(
te< br>mpPo
in
t.x-20,t
em
pPoint.y-2
0
,t
empP
o
i
nt
.
x
+
2 0
,
te
mp
Point.
y
+20);
ﻩ
}
ﻩﻩ
}
ﻩﻩ
}
Right
O
RLef
t+
+;
//鼠标状态变化为
0
}
C
V
iew
:
:O
nL
B
u
tto
nDo
w
n
(nFl
a
gs
,
point)
;
}
右键代码:
v
o
id CFivech
ess_4
4V
ie
w
::O
n
RButt
on D
own(
UI
NT
n
Flags, CPo
i
nt point)
{
ﻩ
/
/
T
OD
O: Add your mess
a
ge handler co
d
e h
e
re
a
n
d
/
or
c
a
ll
def
a
ult
i
f(
R
ightORLef
t
=
=
1)
{
C
Bru
s
h
*
b
ru
sh
=
ne
w
C
Brush(RGB(255,255,255)) //
定义白色画刷
ﻩ
CDC* pD
C
= th
i
s->
G
etDC();
//获取当前的图形设备指针
ﻩ
pD
C-
>
S
e
le
ct< br>O
b
j
ect
(
b
ru
sh);
/
/
选中该白色画刷
ﻩﻩ
fo
r(
in
t
i =
0
;
i < 1000
;
i+
=50
)
{
ﻩ
ﻩ
fo
r
(int j = 0
j <
1
0
00 j+
=
50)
ﻩ
ﻩ
{
ﻩﻩ
C
Re
c
t re
c
t(i,
j
,i+5
0,j+5
0);/
/每格都信定义一矩形
if(
r
I
nRect
(
po
i
nt))
/
/
如果鼠标点在该矩形内
{ CP
o
int t
e
mpPoint
ﻩﻩ
ﻩ
tem
p
P
o
int =
r
e
ct.
C
e
nterP
o
in
t(
); /
/获取矩形中心
,
用于画棋子
ﻩ
ﻩ
p
DC
-
>
Elli
p
s
e
( tem
p
Po
i
n
t.
x
-20,
tem
p
Poi
n
t
.y-20
,
tempPo int.x+20,tempPoint.y+20)
;
ﻩ
}
}
ﻩﻩ
}
--
--
Ri
ghtORLeft- -;
/
/
鼠标状态变化为
1
,鼠标右键按下后,再次改变鼠标
状态
ﻩ
}
CVi
e
w
:
:
On
R
But
to< br>n
Down
(n
F
lags, poin
t
);
}
其二
,
解决第二个问题:
(1)
在
Fi
v
echess_44Vi
e
w
.
h
头文件中加入
3
行公有代码
,
并且在该头文件中包含
vect
or
的头文件
,
代码如下
:
#
i
n
cl
u
d
e
< vect
o
r
>
cl
as
s CF
i
v
e
chess_44View : p
ub
l
i
c CVi
ew
{
…………
;
s
t
d::vector
nt
>
chess
V
ec
boo
l
i
s L
o
cation
(C
P
oi
n
t
cp);
ﻩ
v
o
i
d
Loc
ation(CPoin
t
cp);
………
.
.
;
}
(
2)根据函数名在正确位置添加或修改以下函数
<1>
.添加实现放置棋子函数额判断放置许可函数
:
b
o
o
l
CFiv
ec
hess_44 V
i
e
w
::i
s
L
o
catio
n(
CP
oin
t cp
)
{
bool
isLoc
=
t
r
ue
for(
i
nt i = 0
; i < ch
es
s
Vec
.
si
z
e
(
)
; i++)
{
ﻩﻩ
if
(
c
p
.x
==
che
s
sVec[
i]
.
x
&& cp
.y
==
che
ss
V
ec
[i
]
.
y)
ﻩ
{
ﻩ
ﻩ
i
sLoc =
f
al
se
ﻩﻩ
}
ﻩ
}
ﻩ
r
e
t
u
rn
i
sL
oc
;
}
void CFiv
ec
h
e
ss_44Vi
e
w::L
o
cati o
n
(
C
Point c
p
)
{
chessVec.p
u
s
h
_back(cp);
}
--