《五子棋(可运行)》由会员分享,可在线阅读,更多相关《五子棋(可运行)(17页珍藏版)》请在金锄头文库上搜索。
1、五子棋五子棋( (可运行可运行) )/*加载头文件*/#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 2
2、0#define OFFSET_x 4#define OFFSET_y 3/*定义棋盘数组大小,即棋盘的大小,这里为 18x18 格*/#define N 19/*定义全局变量*/int statusNN; /*定义的数组,表示棋盘某点的状态(棋手 1或棋手 2)*/int step_x,step_y;/*行走的坐标,即每一步光标移动的距离*/int key ; /*获取按下的键盘的键*/int flag; /*玩家标志,当 flag=0 时,表示该点无棋子,flag=1 表示玩家 1 的棋子,flag=2 表示玩家 2 的棋子*/*自定义函数原型*/void DrawBoard(); /*画
3、棋盘函数*/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 WelcomeI
4、nfo()char ch ;/*移动光标到指定位置*/gotoxy(12,4);/*显示欢迎信息*/printf(“Welcome you to wuziqi word!“);gotoxy(12,6);printf(“1. up,down,left and right key to move ,“);gotoxy(12,8);printf(“ Space key to move!“);gotoxy(12,10);printf(“2. Esc key to exit !“);gotoxy(12,12);printf(“3.Don not move the pieces out of the ch
5、essboard !“);gotoxy(12,14);printf(“ continue ?(Y/N)“);ch=getchar();/*判断程序是否要继续进行,按 n 表示退出,y 表示继续玩游戏*/if(ch=n|ch=N)/*如果不继续进行,则推出程序*/exit(0);/*画棋盘函数,用来画棋盘的格子和棋子,这里棋子用带某一颜色的圆圈表示*/void DrawBoard()int x1,x2;int y1,y2;/*设置背景色*/setbkcolor(2);/*设置线条颜色*/setcolor(200);/*设置线条风格、宽度*/setlinestyle(DOTTED_LINE,10,
6、1);/*按照预设的偏移量开始画棋盘*/for(x1=1,y1=1,y2=18;x1=1;j-)if(statusjk=flag)n1+;elsebreak;/*水平向右数*/for(j=x,k=y;j=5)return(1);/*对垂直方向进行判断是否有 5 个同色的圆*/n1=0;n2=0;/*垂直向上数*/for(j=x,k=y;k=1;k-)if(statusjk=flag)n1+;elsebreak ;/*垂直向下数*/for(j=x,k=y;k=5)return(1);/*从左上方到右下方进行判断是否有 5 个同色的圆*/n1=0;n2=0;/*向左上方数*/for(j=x,k=y
7、;(j=1)j-,k-)if(statusjk=flag)n1+;elsebreak;/*向右下方数*/for(j=x,k=y;(j=5)return(1);/*从右上方到左下方进行判断是否有 5 个同色的圆*/n1=0;n2=0;/*向右上方数*/for(j=x,k=y;(j=1);j+,k-)if(statusjk=flag)n1+;elsebreak;/*向左下方数*/for(j=x,k=y;(j=1)return(0);/*执行下棋函数*/void Done()int i ;int j ;/*根据不同的 key 值进行不同的操作*/switch(key)/*如果是向左移动的*/case
8、 LEFT:/*如果下一步超出棋盘左边界则什么也不作*/if(step_x-1=1;i-)if(statusij=0)DrawCircle(step_x,step_y,2);break ;if(i18)break ;elsefor(i=step_x+1,j=step_y;i18)break ;step_x=i ;/*根据不同的行棋者画不同颜色的圆*/JudgePlayer(step_x,step_y);/*显示行棋一方是谁*/break ;/*如果是向下移动的*/case DOWN :/*如果下一步超出棋盘下边界则什么也不作*/if(step_y+1)18)break ;else for(i=
9、step_x,j=step_y+1;j18)break ;step_y=j ;JudgePlayer(step_x,step_y);break ;/*如果是向上移动的*/case UP :/*如果下一步超出棋盘上边界则什么也不作*/if(step_y-1)=1;j-)if(statusij=0)DrawCircle(step_x,step_y,2);break ;if(j=1/*如果判断当前行棋者获胜*/if(ResultCheck(step_x,step_y)=1)/*以指定频率打开 PC 扬声器*/sound(1000);/*扬声器的发生时间,为 1 秒钟*/delay(1000);nos
10、ound();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);/*三重笔划字体, 水平放大 5 倍*/outtextxy(20,20,“Congratulation !“);setcolor(15);sett
11、extstyle(3,0,4);/*如果是 Player1 获胜,显示获胜信息*/if(flag=1)/*无衬笔划字体, 水平放大 5 倍*/outtextxy(20,120,“Player1 win the game !“);/*如果是 Player1 获胜,显示获胜信息*/if(flag=2)/*无衬笔划字体, 水平放大 5 倍*/outtextxy(20,120,“Player2 win the game !“);setcolor(14);settextstyle(2,0,8);getch();exit(0);/*如果当前行棋者没有获胜,则交换行棋方,接着下棋*/Alternation(
12、);/*提示行棋方是谁,即显示正在落子的玩家*/ShowMessage();break;elsebreak ;/*显示行棋方函数,用来显示正在落子的玩家*/void ShowMessage()/*轮到 Player1 行棋*/if(flag=1)setcolor(2);settextstyle(1,0,1);gotoxy(100,30);/*覆盖原有的字迹*/outtextxy(100,30,“Its turn to Player2 !“);setcolor(12);settextstyle(1,0,1);outtextxy(100,30,“Its turn to Player1 !“);/*
13、轮到 Player2 行棋*/if(flag=2)setcolor(2);settextstyle(1,0,1);/*覆盖原有的字迹*/outtextxy(100,30,“Its turn to Player1 !“);setcolor(12);settextstyle(1,0,1);gotoxy(100,20);outtextxy(100,30,“Its turn to Player2 !“);/*主函数*/int main()int gdriver;int gmode;int errorcode;/*清空文本模式窗口*/clrscr();/*显示欢迎信息*/WelcomeInfo();gd
14、river=DETECT;gmode=0;/*初始化图形系统*/initgraph(/*返回最后一次不成功的图形操作的错误代码*/errorcode=graphresult();if (errorcode!= grOk) /*根据错误代码输出错误信息串*/printf(“nNotice:Error occured when grphics initialization: %sn“,grapherrormsg(errorcode);printf(“Press any key to quit!“);getch(); exit(1); /*设置 flag 初始值,默认是 Player1 先行*/flag=1;/*画棋盘*/DrawBoard();ShowMessage();do step_x=0 ;step_y=0 ;JudgePlayer(step_x-1,step_y-1);do /*如果没有键按下,则 bioskey(1)函数将返回 0*/while(bioskey(1)=0);/*获取从键盘按下的键值*/key=bioskey(0);/*根据获得的键值进行下棋操作*/Done();while(key!=SPACEwhile(key!=ESC);/*关闭图形系统*/closegraph();return 0;