《C++课程设计五子棋.doc》由会员分享,可在线阅读,更多相关《C++课程设计五子棋.doc(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC+课程设计五子棋C+课程设计五子棋/*这是我们c+课程设计五子棋,我用了许多循环语句,可能比较繁碎,不过仔细分析的话,还是挺简单的。如果有什么不懂的地方可以加我q 1570169994 */#include#include#include / 这些是一些必要的头文件#include#includeusing namespace std;#define M 15 /此
2、处定义棋盘大小为15*15,自己视情况而定typedef struct Nodeint a; /这里定义的结点在悔棋时要用到int b;struct Node *next;node;class Qipan /定义一个棋盘类,这个类里有实现不同功能的函数public:int a,b,t; /棋子的坐标我们用a,b表示,t表示接收的输入信息int player; /player为1时,代表绿方下棋,2代表红方int nameMM; /棋盘用一个15*15的二维数组表示void reset(); /此函数实现重置功能,即将棋盘上的棋子清零void chess(); /此函数实现下棋功能,是非常重要的
3、void win(); /此函数实现判断功能,即每当一方落子后,都要调用此函数void explain(); /此函数是解释说明的函数void output(int count); /此函数输出赢的一方void gotoxy(int x,int y) HANDLE hout; /这是实现光标移动的函数,具体可以百度一下 COORD coord; /x,y即为棋子的坐标,和a,b一样 coord.X = x; /此函数是将当前光标移动到x,y坐标处 coord.Y = y; hout = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosit
4、ion(hout,coord);/ main 函数int main()Qipan qipan; /定义一个棋盘对象dosystem(cls); /清屏函数 cout1.开始游戏 endl; cout2.游戏说明 endl; fflush(stdin); /清空输入缓冲区,准备接收用户的输入qipan.t = getch(); /接受用户的输入,把值赋给 tif(qipan.t = 27) /Esc键的ASCII为27,即用户如果按下Esc键,则退出循环break;switch(qipan.t) /选择语句case 1: /如果用户输入1,即要开始游戏while(1) system(cls);
5、cout1.绿棋先走 endl; cout2.红棋先走 endl;fflush(stdin); qipan.t = getch(); if(qipan.t=48) break; if(qipan.t = 27) break; if(qipan.t = 49) /用户输入1,则绿棋先走, qipan.player = 1; if(qipan.t = 50) /输入2,红棋先走 qipan.player = 2;do qipan.reset(); /重置棋盘,即绘制棋盘 qipan.chess(); /下棋函数while(qipan.t = 49); if(qipan.t=48) break;br
6、eak;case 2:qipan.explain(); /用户输入2,调用说明函数qipan.t = getch();break;while(qipan.t!=48);qipan.gotoxy(40,8);return 0;/reset函数,绘制棋盘void Qipan:reset()int i,j;a = 14; /定义光标初始位置为中间,即(14,7)b = 7;for(i=0;iM;i+)for(j=0;jM;j+)nameij = 0; /初始化二维数组为0,当有棋子落下时,根据红绿变为1或2system(cls);SetConsoleTextAttribute(GetStdHandl
7、e(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);/ 此函数为设置背景颜色为白色函数,可以自行百度for(i=0;iM;i+)for(j=0;jM;j+)if(nameij = 0)cout; /输出棋盘,即15*15 个 + 号coutendl;gotoxy(42,2);cout按Eas返回上级菜单;gotoxy(42,3); / 在右边输出一些提示cout按 2 悔棋 ;gotoxy(42,4);cout按 1 重新开始endl;gotoxy(42,5);cout按 0 结束游戏a = 0;
8、 /头结点初始化为0h-b = 0;h-next = NULL;while(t = getch() != 27) /接收用户的输入,并且判断不为0,因为0是结束游戏switch(t)case w: / w s a d 和 上下左右键是移动光标的if(b0)b = b-1;gotoxy(a,b);break;case s:if(b0)a = a-2;gotoxy(a,b);break;case d:if(a0)b = b-1;gotoxy(a,b);break;case 80:if(b0)a = a-2;gotoxy(a,b);break;case 77:if(aa = a;q-b = b;q-
9、next = NULL; /将当前光标的坐标即a,b赋给结点,即用结点记录棋子的坐标p-next = q;p = q;if(player = 1)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);cout; /设置颜色gotoxy(a,b);name(a/2)b = 1; /落子后,二维数组的值相应的变为1或2win(); / 每下一次棋,就要调用此函数判断是否有五子连线elseSetConsoleTextAttribute(GetStdHandle(ST
10、D_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);couta = a;q-b = b;q-next = NULL;p-next = q;p = q;if(player = 1)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);cout;gotoxy(a,b);name(a/2)b = 1;win();elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPU
11、T_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);coutnext = p) p = r; else for(int i=0;i+) r = r-next; if(r-next = p) p = r; break; a = q-a; / 此为悔棋步骤,先找到最后一个结点,即最后一棋子的位置,因为坐标保存在了结点里 b = q-b; gotoxy(a,b);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGRO
12、UND_BLUE); cout; gotoxy(a,b); / 悔棋后,player也需要变name(a/2)b = 0;player=(player=1)?2:1; free(q); q = p;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);/ 设置背景颜色/win函数,判断是否有五子void Qipan:win() / 此函数判断是否有五子相连,需要从横竖些捺四个方向判断in
13、t i,j,count8=0,k;for(j=0;jM;j+) / 从第一个位置开始,判断横向是否有五子for(i=0;iM;i+)for(k=0;k5;k+)if(nameij+k=1)count0+;if(nameij+k=2)count1+;output(count);/for(j=0;jM;j+) / 从第一个位置开始,判断竖向是否有五子 for(i=0;iM;i+) for(k=0;k5;k+) if(namei+kj=1) count2+; if(namei+kj=2) count3+; output(count); / for(j=0;jM;j+) for(i=0;iM;i+)
14、for(k=0;k5;k+) if(namei+kj+k=1) count4+; if(namei+kj+k=2) count5+; output(count); / for(j=0;jM;j+) for(i=0;iM;i+) for(k=0;k5;k+) if(namei+kj-k=1) count6+; if(namei+kj-k=2) count7+; output(count); /output函数,输出赢的一方void Qipan:output(int count8) / 如果有五子相连,则有一方胜利,此函数输出胜利者if(count0=5 | count2=5 | count4=5
15、 | count6=5)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);gotoxy(42,8);cout绿棋赢了endl;gotoxy(a,b);fflush(stdin);if(count1=5 | count3=5 | count5=5 | count7=5)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);gotoxy(42,8);cout红棋赢了endl;gotoxy(a,b);fflush(stdin);for(int i=0;i8;i+)counti = 0;/explain函数,说明函数void Qipan:explain()system(cls);cout按w s a d 或 上 下 左 右 键 进行移动endl;cout按空格键 或 Enter 键 进行落子endl;cout按任意键上级菜单endl;-
限制150内