C语言图形五子棋课程设计报告

更新时间:2023-11-03 23:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

1

C语言课程设计报告

五子棋

院系:软件学院 专业:软件工程

班级:102032 学号:10203230 指导老师:王星

~ 1 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

2

摘 要

五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。

Abstract

Gobang is a traditional checker-type game in which the lining up

of five pieces in a straight line scores victory. And C language can accomplish a 2-player gobang on computers. This 2-player gobang program contains 4 main sections, they are, graphics, movement and selection, victory judgment and helping system. Several elements and sentences of C programming language such as structural element, array, global variables, press processing and Graphics Programming are also applied in the program. With the accomplishment of the three main subprograms, namely, checker board and pieces construction, players’ step-selection and victory judgment, a whole program of gobang is established and gobang is available on computers.

~ 2 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

3

目 录

一、需求分析 ................................................................................. 4

二、概要设计 ................................................................................. 6

三、详细设计 ................................................................................. 9

四、调试分析 ............................................................................... 23

五、用户手册 ............................................................................... 24

六、测试数据 ............................................................................... 25

七、附录 ..................................................................................... 26

~ 3 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

4

第1章:需求分析

1.1五子棋背景

传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。

1.2 程序设计

本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。

1.2.1 程序需求分析

根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。

图形显示模块:程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成19×19的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束画面。

玩家控制模块:程序开始时,需玩家确定而后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开始新棋局。

胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。

玩家计分模块:一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。

1.2.2程序流程设计

根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。

~ 4 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

5

图1

~ 5 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

6

第2章:概要设计

2.1.1 各类头文件,变量及宏定义

#include\#include \#include \#include #include

#define closegr closegraph

/*定义1号玩家的操作键键码*/ #define W 0x1177/*上移--'W'*/ #define S 0x1f73/*下移--'S'*/ #define A 0x1e61/*左移--'A'*/ #define D 0x2064/*右移--'D'*/

#define SP 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/

#define UP 0x4800/*上移--方向键up*/

#define DOWN 0x5000/*下移--方向键down*/ #define LEFT 0x4b00/*左移--方向键left*/ #define RIGHT 0x4d00/*右移--方向键right*/ #define ENTER 0x1c0d/*落子--回车键Enter*/ #define ESC 0x011b/*退出*/ #define Y 0x1579/*YES*/ #define N 0x316e/*NO*/

#define BACK 0xe08 /*悔棋*/ #define DEL 0x5300 /*删除比分*/

2.1.2 全局变量

int ch,dh,del;/*文件操作计分变量*/ int k,i,j,n,t;/*控制变量*/ int a[20][20];/*棋盘数组*/

2.2 图形模块

棋盘的显示由游戏开始与结束部分控制,棋子以及棋子定位框的显示与保留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。

~ 6 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

7

图形模块主要由以下函数组成: initgr();/*图形界面初始化函数*/ Welcome();/*欢迎界面*/ Help();/*帮助界面*/ board();/*画棋盘*/ white();/*画白棋子*/ black();/*画黑棋子*/ bye();/*结束界面*/

green();/*连珠时着色相应棋子*/

show();drawmat();/*显示中文的点阵图函数,以及产生动态变色效果*/ border();/*棋子定位框函数*/

delborder();/*删除当前位置棋子定位框函数*/

p1turn();/*轮到1p时在左边边框画出白棋以及输出white turn以提示1p进行操作*/

p2turn();/*轮到2p时在右边边框画出黑棋以及输出black turn以提示2p进行操作*/

p1del();/*轮到2p时去除p1turn();函数的效果*/ p2del();/*轮到1p时去除p2turn();函数的效果*/

2.3 玩家操作模块

棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。

玩家操作模块主要由以下函数构成: P1move();/*玩家1移动函数*/ P2move();/*玩家2移动函数*/ Back();/*悔棋函数*/

2.4 胜负判断模块

胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。

以下简析本程序流程:,由获胜条件可以知,通过判断上、下、左、右、斜上、斜下八个方向上是否有连续的5个子即可得出是否获胜结果。在游戏开始时,将棋盘初始化,即将棋盘抽象为一个19*19的数组,数组中每个元素数值设为6。1P落子时,将数组内相应坐标处元素赋值为0;2P落子时,将数组内相应坐标

~ 7 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

8

处元素赋值为1。通过循环扫描棋盘数组,如果 上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于5时,1P获胜;当上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于0时,2P获胜。

胜负判断模块主要由以下几个函数构成: Win();/*主要函数,判断胜负*/

P1win();/*p1胜利时调用,用于告知p1玩家胜利及询问是否继续*/ P1win();/*p2胜利时调用,用于告知p2玩家胜利及询问是否继续*/ restart();/*询问是否重新开始新的一局比赛的函数*/ initialization();/*初始化棋盘对应数组所有值为6*/

2.5玩家计分模块

为了能使1p和2p更直观更便捷地看到双方对战的比分,所以做了此计分模块,因为分数不能因为重新调用main()函数就丢失了,所以采用对文件的操作,通过文件来记录双方的比分,这里对score1.txt和score2.txt文件进行操作,用来计1p和2p的分数。 玩家计分模块主要由以下几个函数构成: Point();/*整合所有文件操作的模块*/ p1_point_input();/*1p计分文件读取*/ p1_point_input2();/*1p计分文件写入*/ p1_point_output();/*1p计分文件输出*/ p2_point_input();/*2p计分文件读取*/ p2_point_input2();/*2p计分文件写入*/ p2_point_output();/*2p计分文件输出*/ delscore1() ; /*删除当前1p分数*/ delscore2(); /*删除当前2p分数*/

~ 8 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

9

2.6 各模块之间调用关系如下

主函数图形模块操作模块判断胜负模块文件操作模块

第3章:详细设计

3.1 图形模块

①initgr() /* BGI初始化 */ {

int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */

registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */

initgraph(&gd, &gm, \}

② welcome() /*欢迎界面*/ { initgr() ; /*初始化*/

clearviewport(); /*清屏*/ setcolor(2); /*设置颜色*/ settextstyle(0,0,6); /*样式*/

outtextxy(180,180,\位置以及内容*/ settextstyle(0,0,2); /*文本样式*/

outtextxy(240,420,\位置以及内容*/ getch(); /*press any key to continue*/ }

~ 9 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

10

③ help() /*帮助界面,基本操作同welcome();函数*/ {

initgr();

clearviewport(); setcolor(2);

settextstyle(0,0,2);

outtextxy(60,100,\ move; W S A D \ outtextxy(60,120,\ set : space \

outtextxy(60,180,\ move: up down left right \ outtextxy(60,200,\ set: Enter\

outtextxy(60,240,\ outtextxy(60,280,\ outtextxy(60,300,\

outtextxy(220,440,\ getch(); }

④ bye() /*say bye~@!,实现功能同上*/ {

initgr();

clearviewport(); setcolor(4) ; settextstyle(0,0,6);

outtextxy(130,180,\ settextstyle(0,0,2);

outtextxy(240,420,\ getch(); }

⑤ board()/*画棋盘*/ {

setcolor(14); /*线色*/ setfillstyle(1,6); /*样式*/ bar(120,50,520,450); /*棋盘底*/ for(k=0;k<21 ;k++) {

line(120+20*k,50,120+20*k,450) ; /*竖线*/ line(120,50+20*k,520,50+20*k) ; /*横线*/ }

~ 10 ~

;

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

11

setfillstyle(1,9) ;

bar(540,200,620,300); /*1p2p两边框*/ bar(20,200,100,300); setcolor(2);

settextstyle(3,0,4);

outtextxy(50,210,\ outtextxy(570,210,\ delay(50000);

show(); /*显示动态变色效果的标题*/ moveto(320,250); /*初始化中心位置*/ border(); /*画定位框*/ p1turn(); /*p1开始落子,游戏开始*/ }

⑥white() /*画白棋*/ {

setcolor(15); setfillstyle(1,15); circle(getx(),gety(),9); floodfill(getx(),gety(),15); }

black() /*画黑棋*/ {

setcolor(0); setfillstyle(1,0);

circle(getx(),gety(),9); floodfill(getx(),gety(),0); }

green() /*用粉色着色连珠时的棋子*/ {

setcolor(13); setfillstyle(1,13); circle(getx(),gety(),9); floodfill(getx(),gety(),13); } ⑦

p1turn()/*画左边边框内白棋子*/ {

setcolor(15); setfillstyle(1,15); circle(60,250,9); floodfill(60,250,15); settextstyle(3,0,4);

outtextxy(20,280,\

~ 11 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

12

}

p2turn() /*右边边框内黑色棋子*/ {

setcolor(0); setfillstyle(1,0); circle(580,250,9); floodfill(580,250,0); settextstyle(3,0,4);

outtextxy(540,280,\}

p1del()/*不是1turn时候抹去左边边框内棋子*/ { setfillstyle(1,9) ; floodfill(60,250,9); setcolor(9);

settextstyle(3,0,4);

outtextxy(20,280,\}

p2del()/*不是2turn时候抹去右边边框内棋子*/ {

setfillstyle(1,9);

floodfill(580,250,9) ; setcolor(9);

settextstyle(3,0,4);

outtextxy(540,280,\} ⑧

border() /*画定位框*/ {

setcolor(14);

line(getx()-8,gety()-9,getx()-3,gety()-9); /*通过画线函数画出定位框*/ line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); }

delborder() /*除去定位框*/ {

setcolor(6); /*本质在于颜色覆盖*/

line(getx()-8,gety()-9,getx()-3,gety()-9);

line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4);

~ 12 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

13

line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); }

⑨ drawmat(char *mat,int matsize,int x,int y,int color)/*点阵图所用标准输出方式*/ {

int i,j,k,m;

m=(matsize-1)/8+1; for(j=0;j

for(k=0;k<8;k++)

if(mat[j*m+i]&(0x80>>k))

putpixel(x+i*8+k,y+j,color); }

show() /*动态点阵图中文闪烁效果*/ {

for(n=0;n<3;n++)

{ delay(10000);

drawmat(wu32K,32,240,0,3);/*输出点阵图的“五”字*/ delay(10000);

drawmat(zi32K,32,290,0,3); delay(10000);

drawmat(qi32K,32,340,0,3); delay(10000);

drawmat(wu32K,32,240,0,2); delay(10000);

drawmat(zi32K,32,290,0,2); delay(10000);

drawmat(qi32K,32,340,0,2); }

3.2 玩家操作模块

p1move() /*玩家1操作*/ {

switch(bioskey(0)) /*bioskey函数对键盘操作*/ {

case W: /*上移*/

~ 13 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

14

{if(gety()<90)

{delborder();moveto(getx(),430);}

所有if语句作用在于 delborder();moverel(0,-20);border();p1move();}

如果落子即将溢出边 case A: /*左移*/

框,让其改变位置到 { if(getx()<160)

另一端,例如移动棋 {delborder();moveto(500,gety());}

盘最上端,若继续向 delborder();moverel(-20,0);border();p1move();}

上移动,则移动至棋 case S: /*下移*/

盘最下端对应位置 {if(gety()>410)

{delborder();moveto(getx(),70);}

delborder();moverel(0,20);border();p1move();} case D: /*右移*/ { if(getx()>480)

{delborder();moveto(140,gety());}

delborder();moverel(20,0);border();p1move();} case SP: /*落子*/ {if(a[getx()][gety()]!=6)

/*判定如果棋盘此处无子才能下,否则重新调用p1move函数*/ {p1move();}

delborder(); /*去除定位框*/ white(); /*画棋子*/

a[getx()][gety()]=1;/*将所在位置对应的数组点赋值为1*/ win(); /*判断胜负*/

border(); /*在新的位置画出定位框*/ p1del();

对左右两边提示框操作,提示轮到2pp2turn();

进行操作,并调用p2move()函数 p2move();}

case ESC: / *结束游戏*/ {bye();closegraph(); exit(0);} case BACK : /*悔棋操作*/ {back();p1del();p2turn();p2move();}

default: p1move();

} } ②

p2move() /*玩家2操作*/ { P2move(); switch(bioskey(0)) 函数与p1move();函数 { 基本作用相同 case UP: {if(gety()<90)

~ 14 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

15

{delborder();moveto(getx(),430);}

delborder();moverel(0,-20);border();p2move();} case LEFT: {if(getx()<160)

{delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();} case DOWN: {if(gety()>410)

{delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();} case RIGHT: { if(getx()>480)

{delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();} case ENTER:

{if(a[getx()][gety()]!=6)

{p2move();}delborder();black();a[getx()][gety()]=0;win();border();p2del();p1turn();p1move();}

default: p2move(); case ESC:

{bye();closegraph(); exit(0);} case BACK :

{back();p2del();p1turn();p1move();}

} } ③

back() /*悔棋功能*/ {

setcolor(6); setfillstyle(1,6);

circle(getx(),gety(),9);

floodfill(getx(),gety(),6); /*通过将现有棋子覆盖与棋盘底色相同的颜色来实现*/ setcolor(14) ;

line(getx()-9,gety(),getx()+9,gety()) ; line(getx(),gety()-9,getx(),gety()+9) ;

因为覆盖棋盘颜色后对应的

棋谱线条颜色被覆盖,所以通}

过画线函数补回被覆盖负分

的线色 ~ 15 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

16

3.3胜负判断模块

win() /*胜负判断主程序*/ {

for(i=120;i<540;i=i+20)

for(j=50;j<470;j=j+20)/*通过循环扫描整个棋盘判定胜负*/ {

if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5)||(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==5)||

(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5)||(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5))

/*如果棋盘上任何位置数组对应的值之和为5,则白方5子连珠*/

{ if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5) { moveto(i,j); green();delay(10000);moveto(i+20,j);green();

delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); }

else if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==5) {

moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); } else

if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5) {moveto(i,j);

green();delay(10000);moveto(i+20,j+20);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); } else

if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5) {moveto(i,j+80);

green();delay(10000);moveto(i+20,j+60);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); }

delscore1();p1_point_input2();p1_point_output() ;

行动态着色,以便玩家双方识别。 如果五子连珠,扫描是哪一个方向有连珠,并将连珠的5个字进~ 16 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

17

p1win(); }

if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0)||(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==0)||

(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0)||(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0))

{ if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0) { moveto(i,j); green();delay(10000);moveto(i+20,j);green();

delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); }

else if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==0) {

moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); } else

if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0) {moveto(i,j);

green();delay(10000);moveto(i+20,j+20);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); } else

if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0) {moveto(i,j+80);

green();delay(10000);moveto(i+20,j+60);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); }

delscore2(); p2_point_input2();p2_point_output() ;p2win(); } } }

此处判定如果棋盘上任何位置数组对应的值之和为0,则黑方5子连珠 此处依旧是五子连珠后的着色模块。 ~ 17 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

18

p1win() {

setcolor(15) ;

settextstyle(0,0,2);

outtextxy(10,110,\

outtextxy(240,460,\

此处2个函数用于1p或2p获胜restart();

后的告知以及询问是否开始新的

一局,调用restart();函数以继续}

或退出。 p2win()

{

setcolor(15) ;

settextstyle(0,0,2);

outtextxy(535,110,\

outtextxy(240,460,\ restart(); } ③

restart() {

switch(bioskey(0)) 通过对键盘的操作,提取Y或{case Y: N以确定是否开始新的一局。 {main();} case N:

{bye();closegraph(); exit(0);} default:restart(); } } ④

initialization()

{ for(i=120;i<540;i++)

for(j=50;j<470;j++) /*循环初始化棋盘对应的数组所在位置值为6*/ {

a[i][j]=6; } }

3.4 文件操作模块

point() /*用于整合所有计分的函数,方便操作*/

~ 18 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

19

{

之所以做这么多函数来实现文件操作的计分,是因为我发现C语言p1_point_input();

中对文件操作似乎存在bug,如果放在一个函数中经常出现文件无p1_point_output() ;

法正常读取,无法正常写入等现象,即使拆分成如此多函数,也依p2_point_input();

旧偶尔会出现以上提到的一些小bug。 p2_point_output() ;

}

p1_point_input() /*1p计分文件读取*/ {

FILE *fp;

fp=fopen(\

ch=getw(fp); 首先打开文件,然后取出里面的 fclose(fp); 数字赋值于ch变量,再用另一个} 函数打开文件并对ch进行自增操p1_point_input2() /*1p计分文件输入*/ 作,最后将ch写入文件。 {

FILE *fp;

fp=fopen(\ ch=ch+1; putw(ch,fp); fclose(fp); }

p1_point_output() /*1p计分输出*/ {

int i=0; char sh,score[10]; FILE *fp;

通过再次打开文件,循环扫描,输出文件 fp=fopen(\

中的数值并设置其样式。 for(; (sh=fgetc(fp))!=EOF; )

{

score[i++]=sh; }

score[i]='\\0'; setcolor(12);

settextstyle(3,0,4);

outtextxy(40,320,\ outtextxy(55,340,score);

fclose(fp); }

~ 19 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

20

p2_point_input() {

FILE *fp;

fp=fopen(\

dh=getw(fp); fclose(fp); }

p2_point_input2() {

FILE *fp;

fp=fopen(\ dh=dh+1; putw(dh,fp); fclose(fp); }

p2_point_output() {

int i=0; char fh,score[10]; FILE *fp;

fp=fopen(\ for(; (fh=fgetc(fp))!=EOF; ) {

score[i++]=fh; }

score[i]='\\0'; setcolor(12);

settextstyle(3,0,4);

outtextxy(560,320,\ outtextxy(575,340,score);

fclose(fp);

玩家2的计分模块,和玩家1的相同,就不再重复介绍了。 ~ 20 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

36

case S:

{if(gety()>410)

{delborder();moveto(getx(),70);}

delborder();moverel(0,20);border();p1move();} case D:

{ if(getx()>480)

{delborder();moveto(140,gety());}

delborder();moverel(20,0);border();p1move();} case SP:

{if(a[getx()][gety()]!=6) {p1move();}

delborder();white();a[getx()][gety()]=1;win();border();p1del();p2turn();p2move();}

case ESC:

{bye();closegraph(); exit(0);} case BACK :

{back();p1del();p2turn();p2move();} default: p1move(); } }

p2move() /*玩家2操作*/ {

switch(bioskey(0)) {

case UP:

{if(gety()<90)

{delborder();moveto(getx(),430);}

delborder();moverel(0,-20);border();p2move();} case LEFT:

{if(getx()<160)

{delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();} case DOWN:

{if(gety()>410)

{delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();} case RIGHT:

{ if(getx()>480)

{delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();} case ENTER:

{if(a[getx()][gety()]!=6)

~ 36 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

37

{p2move();}delborder();black();a[getx()][gety()]=0;win();border();p2del();p1turn();p1move();}

default: p2move(); case ESC:

{bye();closegraph(); exit(0);} case BACK :

{back();p2del();p1turn();p1move();} } } win() {

for(i=120;i<540;i=i+20) for(j=50;j<470;j=j+20) {

if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5)||(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==5)||

(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5)||(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5))

{ if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5) { moveto(i,j);

green();delay(10000);moveto(i+20,j);green();

delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); } else

if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==5) {

moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); } else

if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5) {moveto(i,j);

green();delay(10000);moveto(i+20,j+20);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); } else

if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5)

~ 37 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

38

{moveto(i,j+80);

green();delay(10000);moveto(i+20,j+60);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); }

delscore1();p1_point_input2();p1_point_output() ; p1win(); }

if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0)||(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==0)||

(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0)||(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0)) { if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0) { moveto(i,j);

green();delay(10000);moveto(i+20,j);green();

delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); } else

if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==0) {

moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); } else

if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0) {moveto(i,j);

green();delay(10000);moveto(i+20,j+20);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); } else

if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0) {moveto(i,j+80);

green();delay(10000);moveto(i+20,j+60);green();

delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); }

delscore2(); p2_point_input2();p2_point_output() ;p2win(); } } }

p1win() {

~ 38 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

39

setcolor(15) ;

settextstyle(0,0,2);

outtextxy(10,110,\

outtextxy(240,460,\restart(); }

p2win() {

setcolor(15) ;

settextstyle(0,0,2);

outtextxy(535,110,\

outtextxy(240,460,\ restart(); }

restart() {

switch(bioskey(0)) {case Y:

{main();} case N:

{bye();closegraph(); exit(0);} default:restart(); } }

initialization()

{ for(i=120;i<540;i++) for(j=50;j<470;j++) {

a[i][j]=6; } }

int main() {

welcome(); help();

clearviewport(); initgr();

initialization(); board(); point(); p1move(); getch();

closegr(); /* 恢复TEXT屏幕模式 */ }

~ 39 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

21

delscore1() /*删除当前1p分数*/ {

int i=0; char sh,score[10]; FILE *fp;

fp=fopen(\ for(; (sh=fgetc(fp))!=EOF; ) {

score[i++]=sh; }

score[i]='\\0'; setcolor(0);

settextstyle(3,0,4);

outtextxy(40,320,\ outtextxy(55,340,score);

fclose(fp); }

delscore2() /*删除当前2p分数*/ {

int i=0; char fh,score[10]; FILE *fp;

fp=fopen(\ for(; (fh=fgetc(fp))!=EOF; ) {

score[i++]=fh; }

score[i]='\\0'; setcolor(0);

settextstyle(3,0,4);

outtextxy(560,320,\ outtextxy(575,340,score); }

依旧通过循环读取文件内比分,然后通过颜色覆盖从而达到分数改变功能,这么操作十分复杂,体现了C语言图形编程下的不完善性。 ~ 21 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

22

3.5函数大致调用关系图

mainwelcome&help&initialization初始化p1move();玩家1操作board();画棋盘point();玩家计分win();p2move();胜负判断border();show();界面初始化restart();bye();重新开始或结束

注:因为函数过多且调用关系过于复杂,没办法把所有函数的调用关系用图表达,所以只能将大致的关系图表示出来。

~ 22 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

23

第4章:调试分析

主要遇到的问题已经在详细分析里说道,这里主要列举一些遇到的一些小问题。

4.1 图形模块

1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。

解决方案:参考书本以及其他资料,找出最合适的位置坐标。

2. 在构建棋子时候,发现C语言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。

解决方案:经过不断尝试,确认bug存在后,改变棋谱线颜色为淡黄色,之后能够成功画出黑色与白色棋子。

3. 在着色连珠五子的时候,依旧是颜色问题,发现有些颜色无法着色。 解决方案:经过多次调试后找出了部分能进行着色的颜色,并选定粉色。

4.2 玩家操作模块

1. 在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。

解决方案:通过在2个move函数中添加if条件语句,判定如果所在位置对应的数组值不等于6时,不能落子。

2. 另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。

解决方案: 通过if语句判定,如果操作框超出范围则移动到对应相反位置,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。

3. 还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来覆盖后,棋谱线条部分也会被覆盖。

解决方案:在back();即悔棋函数中,添加line画线函数来补棋谱线。

4.3 胜负判断模块

1. 在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利。 解决方案:通过参考书籍并加以优化,得出将棋谱做成数组,定义白子落下为1,黑子落下为5,初始为6,这样即不会造成冲突,也很好的解决了判断问题。 2. 另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。 解决方案:至今尚未解决,尝试过局部扫描,但失败了。

~ 23 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

24

4.4 玩家计分模块

1. 虽然这个功能不是主要功能,但却是困扰我最久的,就是对文件的操作经常出错,有时候能读取文件,有时候读取失败,一直没能找到问题的源头。

解决方案:经过多次尝试,发现对文件的操作一次最好在一个函数中构建,所以光是对文件的操作就做了好多个函数,但是最后还是偶尔会出现bug。

第5章:用户手册

1. 本程序的运行环境为DOS操作系统,执行文件为five.exe;文件目录下score1.txt和score2.txt是用于玩家的计分文件。

2. 进入演示程序后,即显示欢迎界面,按任何键进入帮助界面,再按任何键可以进入主界面开始游戏

3. 棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。

4.游戏中esc键可以直接退出游戏,backspace键可以操作进行悔棋。 5.游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并将着色构成连珠的5个子。

6.游戏结束且玩家选择不再继续后,跳出结束界面。退出程序。

~ 24 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

25

第6章:测试分析

本五子棋游戏采用C语言下图形界面编程,以下是各步骤及功能截图:

欢迎,帮助以及结束界面

主界面

获胜界面(包括计分)

~ 25 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

26

第7章:附录

见(附录)。

结 论

通过对各子程序的设计与优化,本程序完成了五子棋软件的主体的设计与制作,基本达到了使用五子棋软件的核心要求。然而程序还有一些不足之处,首先,程序的计分模块存在些许小问题,偶尔会出现不计分现象,并且还无法做到删除计分功能,其次,程序的界面过于简陋,而且无法使用鼠标进行操作。最后就是程序无法实现人机对战,缺乏可玩性。

附录

1. 源程序文件清单:

Five.c(主程序) score1.txt(玩家1计分) score2.txt(玩家2计分)

2.源程序

/* WIN-TC BGI 图形编程模板 */ #include\#include \#include \#include #include

#define closegr closegraph /*定义1号玩家的操作键键码*/ #define W 0x1177/*上移--'W'*/ #define S 0x1f73/*下移--'S'*/ #define A 0x1e61/*左移--'A'*/ #define D 0x2064/*右移--'D'*/ #define SP 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/

#define UP 0x4800/*上移--方向键up*/ #define DOWN 0x5000/*下移--方向键down*/ #define LEFT 0x4b00/*左移--方向键left*/ #define RIGHT 0x4d00/*右移--方向键right*/ #define ENTER 0x1c0d/*落子--回车键Enter*/ #define ESC 0x011b

~ 26 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

27

#define Y 0x1579 #define N 0x316e

#define BACK 0xe08 /*悔棋*/ #define DEL 0x5300 /*删除比分*/ int ch,dh,del; int k,i,j,n,t; int a[20][20];

p1move(); /*定义函数*/ p2move(); win();

p1_point_input(); p1_point_input2(); p1_point_output(); p2_point_input(); p2_point_input2(); p2_point_output(); point(); back(); p1win(); p2win(); white(); black(); welcome(); help();

initialization(); board(); p1turn(); p2turn(); p1del(); initgr(); p2del(); border(); show();

delborder(); drawmat(); restart(); green(); bye();

delscore2(); delscore1();

/*所有函数定义完毕*/

welcome() /*欢迎界面*/ { initgr() ;

clearviewport();

~ 27 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

28

setcolor(2);

settextstyle(0,0,6);

outtextxy(180,180,\ settextstyle(0,0,2);

outtextxy(240,420,\ getch(); }

bye() /*say bye~@!*/ {

initgr();

clearviewport(); setcolor(4) ; settextstyle(0,0,6);

outtextxy(130,180,\ settextstyle(0,0,2);

outtextxy(240,420,\ getch(); }

help() /*帮助界面*/ {

initgr();

clearviewport(); setcolor(2);

settextstyle(0,0,2);

outtextxy(60,100,\ outtextxy(60,120,\

outtextxy(60,180,\ outtextxy(60,200,\

outtextxy(60,240,\ outtextxy(60,280,\ outtextxy(60,300,\

outtextxy(220,440,\ getch(); }

char wu32K[]={

/* 以下是 '五' 的 32点阵楷体_GB2312 字模,128 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00, 0x00,0x03,0xFF,0x00,0x00,0x7F,0xE0,0x00, 0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00, 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,

~ 28 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

29

0x00,0x06,0x38,0x00,0x00,0x07,0xFE,0x00, 0x01,0xFE,0x1C,0x00,0x00,0xEC,0x18,0x00, 0x00,0x08,0x18,0x00,0x00,0x18,0x18,0x00, 0x00,0x18,0x30,0x00,0x00,0x10,0x30,0x00, 0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00, 0x00,0x20,0x7F,0xF0,0x00,0xFF,0xFF,0xF8, 0x7F,0xC0,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };

char zi32K[]={

/* 以下是 '子' 的 32点阵楷体_GB2312 字模,128 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00, 0x00,0x01,0xFE,0x00,0x00,0xFF,0x9E,0x00, 0x00,0x78,0x18,0x00,0x00,0x00,0x30,0x00, 0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00, 0x00,0x03,0x80,0x00,0x00,0x01,0x80,0x00, 0x00,0x01,0x83,0xF0,0x00,0x01,0xFF,0xFC, 0x00,0x3F,0xF0,0x00,0x3F,0xF8,0xC0,0x00, 0x1E,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00, 0x00,0x1D,0xC0,0x00,0x00,0x07,0xC0,0x00, 0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };

char qi32K[]={

/* 以下是 '棋' 的 32点阵楷体_GB2312 字模,128 byte */ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00, 0x02,0x00,0x03,0x00,0x01,0x80,0x03,0x00, 0x01,0x80,0x03,0x00,0x01,0x81,0xC3,0x00, 0x01,0x81,0x83,0x00,0x01,0x80,0x83,0x00, 0x01,0x80,0x83,0xE0,0x01,0x80,0xFF,0x80, 0x01,0xF7,0xE3,0x00,0x0F,0xE0,0x82,0x00, 0x7D,0x80,0x82,0x00,0x01,0x80,0xFA,0x00, 0x03,0x80,0x82,0x00,0x03,0x80,0x82,0x00, 0x07,0xF0,0xBA,0x00,0x0D,0xB0,0xC2,0x00, 0x09,0x80,0x82,0x00,0x19,0x80,0x82,0xFC, 0x31,0x80,0xBF,0xFE,0x21,0x9F,0xE0,0x00, 0x41,0x18,0x00,0x00,0x01,0x00,0x80,0x00,

~ 29 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

30

0x01,0x01,0xC7,0x00,0x01,0x01,0x83,0xC0, 0x01,0x03,0x00,0xE0,0x01,0x06,0x00,0x70, 0x01,0x0C,0x00,0x20,0x01,0x10,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, };

show()/*input word*/ {

for(n=0;n<3;n++) { delay(10000);

drawmat(wu32K,32,240,0,3); delay(10000);

drawmat(zi32K,32,290,0,3); delay(10000);

drawmat(qi32K,32,340,0,3); delay(10000);

drawmat(wu32K,32,240,0,2); delay(10000);

drawmat(zi32K,32,290,0,2); delay(10000);

drawmat(qi32K,32,340,0,2); } }

drawmat(char *mat,int matsize,int x,int y,int color) {

int i,j,k,m;

m=(matsize-1)/8+1; for(j=0;j

for(k=0;k<8;k++)

if(mat[j*m+i]&(0x80>>k))

putpixel(x+i*8+k,y+j,color); }

initgr() /* BGI初始化 */ {

int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */

registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */

initgraph(&gd, &gm, \}

board() {

setcolor(14); /*线色*/

~ 30 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

31

setfillstyle(1,6); /**/

bar(120,50,520,450); /*棋盘底*/ for(k=0;k<21 ;k++) {

line(120+20*k,50,120+20*k,450) ; /*竖线*/ line(120,50+20*k,520,50+20*k) ; /*横线*/ }

setfillstyle(1,9) ;

bar(540,200,620,300); /*1p2p框*/ bar(20,200,100,300); setcolor(2);

settextstyle(3,0,4); outtextxy(50,210,\ outtextxy(570,210,\ delay(50000); show();

moveto(320,250); border(); p1turn(); }

white() /*画白棋*/ {

setcolor(15);

setfillstyle(1,15);

circle(getx(),gety(),9); floodfill(getx(),gety(),15); }

green() /*画绿棋*/ {

setcolor(13);

setfillstyle(1,13);

circle(getx(),gety(),9); floodfill(getx(),gety(),13); }

black() /*画黑棋*/ {

setcolor(0);

setfillstyle(1,0);

circle(getx(),gety(),9); floodfill(getx(),gety(),0); }

p1turn()/*画左边白棋子*/ {

setcolor(15);

~ 31 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

32

setfillstyle(1,15); circle(60,250,9); floodfill(60,250,15); settextstyle(3,0,4);

outtextxy(20,280,\}

p2turn() /*右边黑色棋子*/ {

setcolor(0);

setfillstyle(1,0); circle(580,250,9); floodfill(580,250,0); settextstyle(3,0,4);

outtextxy(540,280,\}

p1del()/*不是1turn时候抹去左边棋子*/ { setfillstyle(1,9) ; floodfill(60,250,9); setcolor(9);

settextstyle(3,0,4);

outtextxy(20,280,\}

p2del()/*不是2turn时候抹去左边棋子*/ {

setfillstyle(1,9);

floodfill(580,250,9) ; setcolor(9);

settextstyle(3,0,4);

outtextxy(540,280,\}

p1_point_input() /*1p计分文件读取*/ {

FILE *fp;

fp=fopen(\ ch=getw(fp); fclose(fp); }

p1_point_input2() /*1p计分文件输入*/ {

FILE *fp;

fp=fopen(\ ch=ch+1; putw(ch,fp); fclose(fp);

~ 32 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

33

}

p1_point_output() /*1p计分输出*/ {

int i=0; char sh,score[10]; FILE *fp;

fp=fopen(\ for(; (sh=fgetc(fp))!=EOF; ) {

score[i++]=sh; }

score[i]='\\0'; setcolor(12);

settextstyle(3,0,4);

outtextxy(40,320,\ outtextxy(55,340,score); fclose(fp); }

p2_point_input() {

FILE *fp;

fp=fopen(\ dh=getw(fp); fclose(fp); }

p2_point_input2() {

FILE *fp;

fp=fopen(\ dh=dh+1; putw(dh,fp); fclose(fp); }

p2_point_output() {

int i=0; char fh,score[10]; FILE *fp;

fp=fopen(\ for(; (fh=fgetc(fp))!=EOF; ) {

score[i++]=fh; }

score[i]='\\0'; setcolor(12);

settextstyle(3,0,4);

~ 33 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

34

outtextxy(560,320,\ outtextxy(575,340,score); fclose(fp); }

delscore2() /*删除当前2p分数*/ {

int i=0; char fh,score[10]; FILE *fp;

fp=fopen(\ for(; (fh=fgetc(fp))!=EOF; ) {

score[i++]=fh; }

score[i]='\\0'; setcolor(0);

settextstyle(3,0,4);

outtextxy(560,320,\ outtextxy(575,340,score); }

point() {

p1_point_input(); p1_point_output() ; p2_point_input(); p2_point_output() ; }

delscore1() /*删除当前1p分数*/ {

int i=0; char sh,score[10]; FILE *fp;

fp=fopen(\ for(; (sh=fgetc(fp))!=EOF; ) {

score[i++]=sh; }

score[i]='\\0'; setcolor(0);

settextstyle(3,0,4);

outtextxy(40,320,\ outtextxy(55,340,score); fclose(fp); }

border() /*画定位线*/ {

~ 34 ~

C语言课程设计报告----五子棋

南昌航空大学软件学院102032班 陈琦帆

35

setcolor(14);

line(getx()-8,gety()-9,getx()-3,gety()-9); line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); }

delborder() /*除去定位线*/ {

setcolor(6);

line(getx()-8,gety()-9,getx()-3,gety()-9); line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); }

back() {

setcolor(6);

setfillstyle(1,6);

circle(getx(),gety(),9); floodfill(getx(),gety(),6); setcolor(14) ;

line(getx()-9,gety(),getx()+9,gety()) ; line(getx(),gety()-9,getx(),gety()+9) ; }

p1move() /*玩家1操作*/ {

switch(bioskey(0)) {

case W:

{if(gety()<90)

{delborder();moveto(getx(),430);}

delborder();moverel(0,-20);border();p1move();} case A:

{ if(getx()<160)

{delborder();moveto(500,gety());}

delborder();moverel(-20,0);border();p1move();}

~ 35 ~

本文来源:https://www.bwwdw.com/article/dcw2.html

Top