2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C语言实现双人的五子棋小游戏

C语言实现双人的五子棋小游戏

时间:2020-07-31 20:45:00

相关推荐

C语言实现双人的五子棋小游戏

主要就是利用清屏函数清除前面的输出棋盘,再利用无限循环函数不断输出棋盘和棋子,以清屏和无限输出棋盘达到光标移动和落子的视觉效果。

首先,我们定义了全局变量和一个二维数组用来记录棋盘有子和无子的数据,再多次使用了switch()语句进行菜单的选择与玩家一、二按键的获取达到该游戏的基础,在此我们又增加了背景更换的选择,for语句用来搭配DrawMap();函数画棋盘并将棋盘数据也就是二维数组的元素进行循环输入,在int judge(int x,int y);中以循环的形式判断输赢,if()语句更是大量运用在程序中game();函数中用来交换玩家落子并判断是否落子成功,在DrawMap();中用来判断何时输出黑子、白子和棋盘符号。while( );语句是实现玩家按键移动位置落子至关重要的一步,玩家每次按下功能键都是一次循环将DrawMap();函数放于循环体中搭配system("cls");使用,每次移动、落子都会再画出一个新的棋盘,从而实现光标移动和玩家落子的视觉效果。该程序还增加了一些有趣的步骤,不需要这些步骤的朋友可以看情况删除。

感谢大家的浏览。

代码:

#include<stdio.h>#include<Windows.h>#include<conio.h>//棋盘行列大小#define hang 15#define lie 29//定义全局变量int i,j,l; //l为落棋总数int a[hang][lie],b[hang][lie]; //棋盘数据int cursorX,cursorY; //光标位置int Gamer; //当前玩家;1黑子,2白子 //函数void menu(); //菜单函数void Init(); //初始棋盘函数void DrawMap();//画棋盘void Rule_set(); //游戏规则void game(); //开始游戏int Put();//落子函数int judge1(int ,int ); //判断玩家一获得胜利函数int judge2(int ,int ); //判断玩家二获得胜利函数void EndGame();//游戏结束//主函数int main(){SetConsoleTitle("五子棋游戏"); //窗口标题system("color E0"); //背景颜色 淡黄int a,up=1;while(up){system("cls"); //使返回菜单栏重新选择功能时清除先前屏幕的内容,只显示菜单栏printf("\n\n");printf(" 欢迎使用五子棋游戏!\n");printf("\n\n");menu();gotoxy(26,13);printf("*请按相应数字选择功能:");scanf("%d",&a);getchar();switch(a) //通过多分支选择结构执行调用相应函数,从而实现相应功能{case 1:game();break;case 2:game();break;case 3:Rule_set();break;case 0:up=0;break;}}system("cls");printf("\n已退出五子棋游戏!\n欢迎下次使用!\n");system("pause");return 0;}//菜单函数void menu(){printf(" ********************\n");printf(" * 五子棋游戏 *\n");printf(" * [1]开始新游戏 *\n");printf(" * [2]继续旧游戏 *\n");printf(" * [3]规则与设置 *\n");printf(" * [0]退出此游戏 *\n");printf(" ********************\n");}//初始化函数void Init() {int l=0;int a[hang][lie]={0}; //棋盘数据赋值为0cursorX=hang/2;cursorY=lie/2; //光标居中Gamer=1; //当前玩家 黑子}//游戏函数void game(){Init();while(1){DrawMap(); //画棋盘gotoxy(1,70);printf(" *请玩家%d下子。\n",Gamer); //显示行棋方gotoxy(2,70);if(Gamer==1) printf(" *请玩家一以W、A、S、D移动,按空格下棋!\n");else printf(" *请玩家二以↑、↓、←、→移动,按回车下棋!\n");char input=getch(); //获取输入if(Gamer%2==0){switch(input){case 72: //上键cursorX--; if(cursorX<0) cursorX=hang-1;break; case 80: //下键cursorX++;if(cursorX>hang-1) cursorX=0;break;case 75: //左键cursorY-=2;if(cursorY<0) cursorY=lie-1;break;case 77: //右键cursorY+=2;if(cursorY>lie-1) cursorY=0;break;}if(input==13){if(Put()==1) //判断是否落子成功{if(Gamer==2) //交换玩家Gamer=1;l++;}else if(Put()==0){printf(" 落子错误!该处已有棋子!");Sleep(1000); //延迟一秒后清屏}if(judge2(cursorX,cursorY)==1){gotoxy(40,10);printf(" 二号玩家白子获得胜利!");Sleep(3000); //延迟三秒后清屏EndGame();}if(l==225) {printf(" 两位玩家和棋!");Sleep(3000); //延迟三秒后清屏EndGame();}}}if(Gamer%2==1){switch(input){case 'w': //上键cursorX--; if(cursorX<0) cursorX=hang-1;break; case 's': //下键cursorX++;if(cursorX>hang-1) cursorX=0;break;case 'a': //左键cursorY-=2;if(cursorY<0) cursorY=lie-1;break;case 'd': //右键cursorY+=2;if(cursorY>lie-1) cursorY=0;break;}if(input==32){if(Put()==1) //判断是否落子成功{if(Gamer==2) Gamer=1;else Gamer=2;l++;}else if(Put()==0){printf(" 落子错误!该处已有棋子!");Sleep(1000); //延迟一秒后清屏}if(judge1(cursorX,cursorY)==1){gotoxy(40,10);printf(" 一号玩家黑子获得胜利!");Sleep(3000); //延迟三秒后清屏EndGame();}if(l==225) {Gamer=3;printf(" 两位玩家和棋!");Sleep(3000); //延迟三秒后清屏EndGame();}}}if(input==27) {break; //Esc返回菜单键}}}//棋盘函数void DrawMap() {system("cls");//清除先前屏幕的内容for(i=0;i<hang;i++) //棋盘行{for(j=0;j<lie;j++) //棋盘列{if(i==cursorX&&j==cursorY)printf("◎"); //光标else if(a[i][j]==1) //下黑子printf("●");else if(a[i][j]==2) //下白子printf("○");else if(j%2==1){printf("-");}else if(i==0&&j==0){printf("┌");}else if(i==0&&j==lie-1){printf("┐");}else if(i==hang-1&&j==0){printf("└");}else if(i==hang-1&&j==lie-1){printf("┘");}else if(i==0){printf("┬");}else if(i==hang-1){printf("┴");}else if(j==0){printf("├");}else if(j==lie-1){printf("┤");}else{printf("┼");}}printf("\n");}}//落子函数int Put() //下子成功返回 1 ,失败返回 0{if(a[cursorX][cursorY]==0)//判断此处是否有棋子{a[cursorX][cursorY]=Gamer; //当前玩家下子return 1;}return 0;}//规则与设置函数void Rule_set(){system("cls");int b;gotoxy(36,7);printf("[规则]:");gotoxy(37,8);printf("【玩家一】:以W、S、A、D键控制移动,空格键为落子。");gotoxy(37,9);printf("【玩家二】:以↑、↓、←、→控制移动,回车键为落子。");gotoxy(37,10);printf("先让己方5个棋子排列成一行、一列或一斜线者获胜!");gotoxy(36,11);printf("[设置]:");gotoxy(37,12);printf("1:淡绿色背景,紫色字体.");gotoxy(37,13);printf("2:浅绿色背景,红色字体");gotoxy(37,14);printf("3:淡黄色背景,绿色字体");gotoxy(37,15);printf("4:亮白色背景,绿色字体");gotoxy(37,16);printf("5:淡黄色背景,淡蓝色字体");gotoxy(37,17);printf("6:亮白背景,灰色字体");gotoxy(37,18);printf("0取消选择\n");gotoxy(37,20);printf("请输入标号进行选择:");scanf("%d",&b);getchar();switch(b) //通过多分支选择结构执行调用相应函数,从而实现相应功能{case 1:system("color B5");break;//淡绿色背景,紫色字体case 2:system("color B4");break;//浅绿色背景,红色字体case 3:system("color E2");break;//淡黄色背景,绿色字体case 4:system("color F2");break;//亮白色背景,绿色字体case 5:system("color E9");break;//淡黄色背景,淡蓝色字体case 6:system("color F8");break;//亮白背景,灰色字体case 0:b=0;break;}gotoxy(37,21);printf("*按回车返回菜单栏*");getchar();}//游戏结束函数void EndGame(){char input;system("cls");if(Gamer==1){gotoxy(42,10);printf("恭喜二号玩家白子获得本局游戏的胜利!!!");}else if(Gamer==2){gotoxy(42,10);printf("恭喜一号玩家黑子获得本局游戏的胜利!!!");}else if(Gamer==3){gotoxy(42,10);printf("双方玩家和棋!");}gotoxy(42,11);printf("游戏结束,是否开始新一局游戏?\n");gotoxy(42,12);printf("继续游戏请按Y/y,结束游戏请按任意键,返回菜单请按回车。");input=getch();if(input=='Y' || input=='y'){system("cls");memset(a,0,sizeof(a)); //棋盘数据归为零game();}if(input==13){system("cls");memset(a,0,sizeof(a)); //棋盘数据归为零main();}elsegotoxy(0,25);exit(0);}//判断玩家一获得胜利函数int judge1(int x,int y) //判断一号玩家是否胜利{for(j=y-8;j<=y+8;j++)//判断横{if(a[x][j]==1 && a[x][j+2]==1 && a[x][j+4]==1 && a[x][j+6]==1 && a[x][j+8]==1){return 1;}elsecontinue;}for(i=x-4;i<=x+4;i++)//判断竖{if(a[i][y]==1 && a[i+1][y]==1 && a[i+2][y]==1 && a[i+3][y]==1 && a[i+4][y]==1){return 1;}elsecontinue;}for(j=y-8,i=x-4;j<=y+8;j+=2,i++)//判断右斜{if(a[i][j]==1 && a[i+1][j+2]==1 && a[i+2][j+4]==1 && a[i+3][j+6]==1 && a[i+4][j+8]==1){return 1;}elsecontinue;}for(j=y+8,i=x-4;j>=y-8;j-=2,i++)//判断左斜{if(a[i][j]==1 && a[i+1][j-2]==1 && a[i+2][j-4]==1 && a[i+3][j-6]==1 && a[i+4][j-8]==1){return 1;}elsecontinue;}return 0;}//判断玩家二获得胜利函数int judge2(int x,int y) //判断二号玩家是否胜利{for(j=y-8;j<=y+8;j++)//判断横{if(a[x][j]==2 && a[x][j+2]==2 && a[x][j+4]==2 && a[x][j+6]==2 && a[x][j+8]==2){return 1;}elsecontinue;}for(i=x-4;i<=x+4;i++)//判断竖{if(a[i][y]==2 && a[i+1][y]==2 && a[i+2][y]==2 && a[i+3][y]==2 && a[i+4][y]==2){return 1;}elsecontinue;}for(j=y-8,i=x-4;j<=y+8;j+=2,i++)//判断右斜{if(a[i][j]==2 && a[i+1][j+2]==2 && a[i+2][j+4]==2 && a[i+3][j+6]==2 && a[i+4][j+8]==2){return 1;}elsecontinue;}for(j=y+8,i=x-4;j>=y-8;j-=2,i++)//判断左斜{if(a[i][j]==2 && a[i+1][j-2]==2 && a[i+2][j-4]==2 && a[i+3][j-6]==2 && a[i+4][j-8]==2){return 1;}elsecontinue;}return 0;}//定位函数void gotoxy(int x, int y) //定位到第y行的第x列{int xx=0x0b;HANDLE hOutput;COORD loc;loc.X = x;loc.Y=y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, loc);return;}

运行图:

谢谢大家的支持!!!

🙏

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。