一:功能模块设计
1.初始化模块。本模块主要是用于初始化屏幕信息,包括显示欢迎信息、操作方法和初始化棋盘。
2.功能控制模块。本模块是各个功能函数的集合,主要是被其它模块调用,包括画棋子、胜负判断和行棋转换等功能。
3.下棋操作模块。人机交互。
4.帮助模块。教用户如何操作,提示办到哪方下棋。
二:数据结构设计
1.定义数组:
status[19][19],存棋盘坐标的状态,每个坐对应着一个状态,可以是0、1、2。‘0’表示当前位置无棋子,‘1’表示Player1在这里放了一个棋子,‘2’表示Player2在这里放了棋子。
2.全局变量:
1.step_x和step_y是两个整型变量,分别表示x,y的坐标。
2.Key也是整型变量,存储bioskey()函数返回的键值。UP,DOWN,LEFT,RIGHT的值都是由bioskey()返回,无需死记硬背。
3.Flag表示是哪个玩家,1表示Player1,2表示player2;
4.Offset_x,offset_y,offset分别表示x、y坐标的偏移量和放大倍数。
三:函数功能描述
1.drawboard()函数用于画棋盘,棋盘由18条横线和18条竖线交叉组成,函数主要由画线函数voidline(intx0,inty0,intx1,inty1)实现的。
2.drawCircle()画棋子,函数主要由画圆函数voidcircle(intx,inty,intr)实现的。
3.Alternation()用于交换下顺序,实现轮流下棋的功能,用全局变量flag标识。
4.judgePlayer()根据不用的棋方画不同颜色的棋子,也是根据全局变量flag进行判断的。
5.Down()完成下棋的操作过程,根据bioskey()返回的键值判断该如何操作,详见代码;
6.resultCheck(intx,inty)判断当前下棋的人否获胜,其中x,y表示下棋都最后落子坐标,判断横纵斜方向是否有五个相同棋子(颜色相同)。
7.welcomeInfo()用于输出欢迎信息,和提示性信息,如按键操作等。
8.showMassage()显示当前轮到哪一方下棋。
编译环境:Win-Tc
注意:请在Win-Tc安装目录下编译,否则可能初始化图形界面失败
本人C文件路径作参考:C:\Win-Tc\projects\noname.c
代码:
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<bios.h>
#include<conio.h>
#define left 0x4b00
#define right 0x4d00
#define down 0x5000
#define up 0x4800
#define esc 0x11b
#define space 0x3920
#define offset 20
#define offset_x 4
#define offset_y 3
#define n 19
int status[n][n];
int step_x,step_y;
int key;
int flag;
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 showMassage();
int main()
{
int gdriver;
int gmode;
int errorcode;
clrscr();
welcomeInfo();
gdriver=DETECT;
gmode=0;
initgraph(&gdriver,&gmode,"C:\\Win-TC");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("\nNotice:Error occured when graphics initializetion:%s",grapherrormsg(errorcode));
printf("Press any key to quit!\n");
getch();
exit(1);
}
flag=1;
drawBoard();
showMassage();
do
{
step_x=0;
step_y=0;
judgePlayer(step_x-1,step_y-1);
do
{
while(bioskey(1)==0);
key=bioskey(0);
done();
}
while(key!=space&&key!=esc);
}
while(key!=esc);
closegraph();
return 0;
}
void welcomeInfo()
{
char ch;
gotoxy(12,4);
printf("Welcome you to gobang world!");
gotoxy(12,6);
printf("1.You can use the up,down,left and right key to move the chessman,");
gotoxy(12,8);
printf(" and you can press Space key to enter after you move it !");
gotoxy(12,10);
printf("2.You can use Esc key to exit the game to!");
gotoxy(12,12);
printf("3.Do not move the pieces out of the chessboard!");
gotoxy(12,14);
printf("Do you want to continue?(Y/N)");
ch=getchar();
if(ch=='n'||ch=='N')exit (0);
}
void drawBoard()
{
int x1,x2,y1,y2;
setbkcolor(2);
setcolor(1) ;
setlinestyle(DOTTED_LINE,1,1);
for(x1=1,y1=1,y2=18;x1<=18;x1++)
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+offset_y)*offset,(x2+offset_x)*offset,(y1+offset_y)*offset);
for(x1=1;x1<=18;x1++)
for(y1=1;y1<=18;y1++)
status[x1][y1]=0;
setcolor(14);
settextstyle(1,0,1);
outtextxy((19+offset_x)*offset,(2+offset_y)*offset,"Player key:");
setcolor(9);
settextstyle(3,0,1);
outtextxy((19+offset_x)*offset,(4+offset_y)*offset,"UP--up");
outtextxy((19+offset_x)*offset,(6+offset_y)*offset,"DOWN--down");
outtextxy((19+offset_x)*offset,(8+offset_y)*offset,"LEFT--left");
outtextxy((19+offset_x)*offset,(10+offset_y)*offset,"RIGHT--right");
outtextxy((19+offset_x)*offset,(12+offset_y)*offset,"ENTER--space");
setcolor(14);
settextstyle(1,0,1);
outtextxy((19+offset_x)*offset,(14+offset_y)*offset,"Exit:");
setcolor(9);
settextstyle(3,0,1);
outtextxy((19+offset_x)*offset,(16+offset_y)*offset,"Esc");
}
void drawCircle(int x,int y,int color)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(offset_x+x)*offset;
y=(y+offset_y)*offset;
circle(x,y,6);
}
void alternation()
{
flag=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)
{
n1=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;
n1=n2=0;
for(j=x,k=y;k>=1;k--)
{
if(status[j][k]==flag)
n1++;
else break;
}
for(j=x,k=y;k<=18;k++)
{
if(status[j][k]==flag)
n2++;
else break;
}
if(n1+n2-1>=5)return 1;
n1=n2=0;
for(j=x,k=y;j>=1&&k>=1;j--,k--)
{
if(status[j][k]==flag)
n1++;
else break;
}
for(j=x,k=y;j<=18&&k<=18;k++,j++)
{
if(status[j][k]==flag)
n2++;
else break;
}
if(n1+n2-1>=5)return 1;
n1=n2=0;
for(j=x,k=y;j<=18&&k>=1;j++,k--)
{
if(status[j][k]==flag)
n1++;
else break;
}
for(j=x,k=y;j>=1&&k<=18;j--,k++)
{
if(status[j][k]==flag)
n2++;
else break;
}
if(n1+n2>=5)return 1;
return 0;
}
}
void done()
{
int i,j;
switch(key)
{
case left:
if(step_x-1<0)
break;
else
{
for(i=step_x-1,j=step_y;i>=1;i--)
if(status[i][j]==0)
{
drawCircle(step_x,step_y,2);
break;
}
if(i<1)break;
step_x=i;
judgePlayer(step_x,step_y);
break;
}
case right:
if(step_x+1>18)
break;
else
{
for(i=step_x+1,j=step_y;i<=18;i++)
if(status[i][j]==0)
{
drawCircle(step_x,step_y,2);
break;
}
if(i>18)break;
step_x=i;
judgePlayer(step_x,step_y);
break;
}
case down:
if(step_y+1>18)
break;
else
{
for(i=step_x,j=step_y+1;j<=18;j++)
if(status[i][j]==0)
{
drawCircle(step_x,step_y,2);
break;
}
if(j>18)break;
step_y=j;
judgePlayer(step_x,step_y);
break;
}
case up:
if(step_y-1<0)
break;
else
{
for(i=step_x,j=step_y-1;j>=1;j--)
if(status[i][j]==0)
{
drawCircle(step_x,step_y,2);
break;
}
if(j<1)break;
step_y=j;
judgePlayer(step_x,step_y);
break;
}
case esc:break;
case space:
if(status[step_x][step_y]==0)
{
status[step_x][step_y]=flag;
if(resultCheck(step_x,step_y)==1)
{
sound(1000);
delay(1000);
nosound();
gotoxy(30,4);
setbkcolor(BLUE);
cleardevice();
setviewport(100,100,540,380,1);
setfillstyle(1,2);
setcolor(YELLOW);
rectangle(0,0,439,279);
floodfill(50,50,14);
setcolor(12);
settextstyle(1,0,5);
outtextxy(20,20,"CONGRATULATION!");
setcolor(15);
settextstyle(3,0,4);
if(flag==1)
{
outtextxy(20,120,"Player 1 win the game!!");
}
if(flag==2)
{
outtextxy(20,120,"Player 2 win the game!!");
}
setcolor(14);
settextstyle(2,0,8);
getch();
exit(0);
}
alternation();
showMassage();
break;
}
else break;
}
}
void showMassage()
{
if(flag==1)
{
setcolor(2);
settextstyle(1,0,1);
gotoxy(100,30);
outtextxy(100,30,"It's turn to Player2 !");
setcolor(12);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player1 !");
}
if(flag==2)
{
setcolor(2);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player1 !");
setcolor(12);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player2 !");
}
}
相关推荐
java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip ...
本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,而且富含哲理,有助于修身养性。本...
Java五子棋游戏完整源代码 界面美观 详细注释【适合初学者】 java 五子棋游戏源码 java初学者 java游戏源码 java入门 【特点】界面美观 详细注释 【推荐】java初学者参考学习之用 Java五子棋游戏完整源代码 界面...
这个感觉很不错的一个网络版本的五子棋游戏源码,包含服务器端、游戏大厅之客户端。具有游戏大厅功能,支持多人游戏,可以实时显示玩家得分,支持互相发送信息聊天功能。可以自定义玩家昵称,玩家速度等。玩游戏时...
五子棋游戏是常见的益智小游戏,此程序除了实现基本游戏操作,还实现了联网对战,增加了对抗性。
五子棋游戏源代码,C语言实现,是我从程序员网上下的,在此分享一下
一个简单的五子棋游戏 具有以下功能:①数据结构的设计;五子棋棋盘的绘制。②人机下棋时,计算机下棋算法的设计。③人机下棋时,判断任一方获胜的算法的设计。
主要为大家详细介绍了MATLAB实现五子棋游戏,可以进行双人对战、也可悔棋,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在算法设计中,会有五子棋游戏设计,该文档中代码可以完全实现并运行!
java 五子棋游戏源码 java初学者 java游戏源码 java入门 【特点】界面美观 详细注释 【推荐】java初学者参考学习之用
该程序是基于STM32f103的五子棋游戏,里面包含了触摸屏和SD卡的应用,可以实现基本的五子棋对战
一款很好的五子棋游戏,使用mfc框架编写程序。对于学习mfc有很大帮助
(2)研究了博弈树的极大极小值搜索技术以及Q一13剪枝技术的基本原理及其改进方法,提出了分层次的棋形搜索算法,并将该算法与极大极小值搜索算法相融合,较大提高了五子棋游戏的智能性和运行速度。 (3)提出了基于...
VC五子棋游戏论文,五子棋是起源于中国古代的传统黑白棋种之一
网页版五子棋游戏源码,带AI,可本地双人 无需数据库,上传到服务器打开就能用
原生JavaScript实现简单五子棋游戏 本文实例为大家分享了JavaScript实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 HTML页面 注释都很明确了,大家好好学习。 <!DOCTYPE ...
C语言五子棋游戏源代码参考,里面涉及简单的五子棋游戏编程的思想
基于ALIENTEK 探索者 STM32F407开发板,设计一款五子棋游戏。通过LCD液晶屏显示游戏画面,通过触摸屏幕进行游戏模式选择、落子、暂停游戏、重新开始游戏、悔棋等操作。通过LCD液晶屏显示游戏画面,通过触摸屏幕进行...