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;}
运行图:
![](/assets/blank.gif)
谢谢大家的支持!!!
C语言实现双人的五子棋小游戏相关推荐
- c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc
C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...
- 记一次做双人在线五子棋小游戏
前一段时间没有项目在身上,时间比较充裕,就研究了下H5里的canvas画布,了解一些基础语法后,想尝试做个demo来练练手,检验下这段时间所学的知识,无意间看到慕课网channingbreeze老师的 ...
- 用C语言代码编写一个五子棋小游戏
五子棋: 需要的数据: 1.定义一个1515的棋盘 2.定义变量用于记录棋子的坐标 3.定义角色变量 业务逻辑: 是否需要对数据进行初始化 for( ; ; ) { 1.刷新屏幕,显示棋盘 2.落子 ...
- Python:五子棋小游戏
临近期末考试,班主任把所有的不参与考试的副科课程全都停了,天天语数外历史物理,实在是无聊,同学们便在课间互相约战五子棋,棋盘便是平时写作业用的玛丽大号写字本,棋子就是xo,不到两个星期,我就成功地用完 ...
- C语言---简单五子棋小游戏
效果图如下: 设计思路: 棋盘设计为15×15格,初始状态光标在棋盘的中央,白棋先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋).当游戏一方胜利后显示胜利信息 ...
- c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc
基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...
- c语言五子棋小游戏vc,C语言实现五子棋小游戏
C语言实现五子棋小游戏 # include # include # include # include//插入输入输出头文件 # include//字符数组的函数定义的头文件 # include//s ...
- c语言实现五子棋游戏,C语言实现五子棋小游戏
C语言实现五子棋小游戏 # include # include # include # include//插入输入输出头文件 # include//字符数组的函数定义的头文件 # include//s ...
- c语言五子棋对局结果存储,基于C语言五子棋小游戏总结.doc
五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如下:首先,设计这个游戏最基本的就是 ...
最新文章
- 20162309单步追踪数组及查找课下补分博客
- MySQL带ALL关键字的子查询
- Scala函数的调用过程分析
- OpenCV C++ 05 - Change Contrast
- ajax php 不影响进程,ajax已并发请求php,但php-fpm却没有如预期fork出多个进程来处理?...
- 【笔记】C++自学笔记系列02:类的组合与类的友元
- 黑客攻防技术宝典Web实战篇第2版—第7章 攻击会话管理
- redhat 中安装rpm包时遇到异常 “error: Failed dependencies:xinetd is needed by .”
- TensorFlow2.0:数据统计
- ubuntu16.04 pytorch 安装
- paip.环境设置 mybatis ibatis cfg 环境设置
- java 加密 —— 对称加密、非对称加密、消息摘要
- Grunt (自动化项目构建的软件工具)
- hdu 5285 wyh2000 and pupil【二分图+染色法】
- Css动画效果旋转图片
- 使用opencv读取rtsp流的图片帧进行目标检测,并将处理好的图像推到rtsp服务器上
- TI C2000 刷flash意外锁芯片的解决办法
- 彻底理解Java并发:Java并发工具类
- 和利时scada系统服务器参数,设备数据采集之SCADA系统
- 64位字长的高性能微型计算机,计算机中的字长