《C++语言程序设计》课程设计报告--五子棋
更新时间:2023-03-08 05:55:08 阅读量: 综合文库 文档下载
C++语言程序设计
课程设计报告
课 程: C++语言程序设计 题 目: 五子棋 年 级: 专 业: 学 号: 姓 名: 指导教师:
江苏师范大学数学与统计学院
【摘要】
五子棋是我国古代的、传统的黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。本游戏是以C++语言作为开发工具,运行环境Visual C++ 6.0,通过构造函数绘制棋谱,以及落子函数、判断函数,实现双人对弈的功能。
【关键词】五子棋、游戏、人人对战、C++
【引言】
五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。
本游戏是以C++语言作为开发工具,运行环境Visual C++ 6.0,通过构造函数绘制棋谱,以及落子函数、判断函数,实现双人对弈的功能。
【设计思路】
第一步:绘制棋谱
第二步:对战双方落子
第三步:判断是否有五子连珠
第四步:重复第一、二、三步直至出现五子连珠
【设计过程】
通过构造函数实现棋盘,编写落子函数实现玩家落子,通过判断函数判断是否有五子连珠的结果。
【设计结果】
图1-1 初始画面
图1-2 双方落子
图1-3 白棋胜出
【设计总结】
本五子棋游戏是一种简单的小程序,没有图形界面以及复杂的人机、网络对战,但即便如此我们也可以在娱乐中感受到C++编程的奇妙之处。
附录:
#include
public: MyGobang(); void printBoard(); void getPointXY(); void getPointMN(); bool isFirstWin(); bool isSecondWin();
private: int x,y,m,n,num_xy,num_mn; char board[20][20]; };
MyGobang::MyGobang()//构造函数实现棋谱 {
num_xy=0; num_mn=0;
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
board[i][j]='.'; }
void MyGobang::printBoard()//刷新棋谱 {
for(int i=0;i<=20;i++) {
if(i<10) cout<
cout< for(int j=1;j<=20;j++) { if(j<10) { cout< for(int k=0;k<20;k++) cout< { cout< for(int k=0;k<20;k++) cout< } } void MyGobang::getPointXY()//第一人落子函数 { cout<<\请输入第\步白旗X,Y的坐标(x,y在1和20之间):\ cin>>x>>y; cout< while(x<1||x>20||y<1||y>20) { cout<<\出界,请重新输入:\ cin>>x>>y; cout< while(board[y-1][x-1]!='.') { cout<<\该位置已被占,重新输入:\ cin>>x>>y; cout< while(x<1||x>20||y<1||y>20) { cout<<\出界,请重新输入:\ cin>>x>>y; cout< board[y-1][x-1]='o'; num_xy++; } bool MyGobang::isFirstWin()//判断第一人是否赢 { int num1=1,num2=1,num3=1,num4=1; int i,j; //这里是判断X坐标向右的'0'连续数 for(i=x;i<=x+3&&i<20;i++) { if(board[y-1][i]=='o') num1++; else break; } //这里是判断X坐标向左的'0'连续数 for(i=x-2;0<=i&&i>=x-5;i--) { if(board[y-1][i]=='o') num1++; else break; } //这里是判断Y坐标向下的'0'连续数 for(j=y;j<20&&j<=y+3;j++) { if(board[j][x-1]=='o') num2++; else break; } //这里是判断Y坐标向上的'0'连续数 for(j=y-2;j>=0&&j>=y-5;j--) { if(board[j][x-1]=='o') num2++; else break; } //这里是判断右斜上'0'连续数 for(i=x,j=y;i<20&&j<20&&i<=x+3&&j<=y+3;i++,j++) { if(board[j][i]=='o') num3++; else break; } //这里是判断左斜下'0'连续数 for(i=x-2,j=y-2;i>=0&&j>=0&&i>=i-5&&j>=5;i--,j--) { if(board[j][i]=='o') num3++; else break; } //这里是判断左斜上'0'连续数 for(i=x-2,j=y;i>=0&&j<20&&i>=x-5&&j<=y+3;i--,j++) { if(board[j][i]=='o') num4++; else break; } //这里是判断右斜下'0'连续数 for(i=x,j=y-2;i<20&&j>=0&&i<=x+3&&j>=y-5;i++,j--) { if(board[j][i]=='o') num4++; else break; } if(num1==5||num2==5||num3==5||num4==5) return 1; // 这里总结 X,Y ,左斜,右斜 的'0'连续数,有等于五的就直接返回 1 否则返回0 else return 0; } void MyGobang::getPointMN()//第二人落子函数 { cout<<\请输入第\步黑旗X,Y的坐标(x,y在1和20之间):\ cin>>m>>n; cout< while(m<1||m>20||n<1||n>20) { cout<<\出界,请重新输入:\ cin>>m>>n; cout< while(board[n-1][m-1]!='.') { cout<<\该位置已被占,重新输入:\ cin>>m>>n; cout< while(m<1||m>20||n<1||n>20) { cout<<\出界,请重新输入:\ cin>>m>>n; cout< board[n-1][m-1]='x'; num_mn++; } bool MyGobang::isSecondWin()//第二人是否赢 { int num1=1,num2=1,num3=1,num4=1; int i,j; for(i=m;i<=m+3&&i<20;i++) { if(board[n-1][i]=='x') num1++; else break; } for(i=m-2;0<=i&&i>=m-5;i--) { if(board[n-1][i]=='x') num1++; else break; } for(j=n;j<20&&j<=n+3;j++) { if(board[j][m-1]=='x') num2++; else break; } for(j=n-2;j>=0&&j>=n-5;j--) { if(board[j][m-1]=='x') num2++; else break; } for(i=m,j=n;i<20&&j<20&&i<=m+3&&j<=n+3;i++,j++) { if(board[j][i]=='x') num3++; else break; } for(i=m-2,j=n-2;i>=0&&j>=0&&i>=i-5&&j>=5;i--,j--) { if(board[j][i]=='x') num3++; else break; } for(i=m-2,j=n;i>=0&&j<20&&i>=m-5&&j<=n+3;i--,j++) { if(board[j][i]=='x') num4++; else break; } for(i=m,j=n-2;i<20&&j>=0&&i<=m+3&&j>=n-5;i++,j--) { if(board[j][i]=='x') num4++; else break; } if(num1==5||num2==5||num3==5||num4==5) return 1; else return 0; } int main() { cout<<\五子棋*****************\ MyGobang gobang; gobang.printBoard ();//申明MYGobang类的一个对象 for(int i=0;;i++) { gobang.getPointXY();//调用这个函数 gobang.printBoard ();//调用绘制棋盘 if(gobang.isFirstWin ()!=0)//调用第一人是否赢的函数 { cout<<\白棋胜利***************\ break; } gobang.getPointMN(); gobang.printBoard (); if(gobang.isSecondWin ()!=0) { cout<<\黑棋胜利***************\ break; } } system(\ }
正在阅读:
南京幼童饿死事件后的社会工作现状反思08-13
语文之美作文700字06-16
国家安全人民防线工作制度03-14
与众不同的礼物作文300字06-26
《八年级思品人生难免有挫折》说课稿04-12
半月板移植临床研究进展07-28
假面舞会主持词 修改版03-06
庆六一儿童节作文500字07-13
- 辛店六小小学开展阳光体育活动工作自查报告
- 对农村留守儿童良好行为习惯的养成教育策略研究
- 浅析我国企业投资决策的现状和分析
- 2013年山东科技大学806水力学考研真题考研试题硕士研究生入学考
- 新人教版英语教材培训心得
- 秋冬季雏鸡死亡率高的原因分析
- GPS控制网的优化设计
- 新视野大学英语第三版第三册Unit4教案
- 触摸屏技术的简介与发展
- 小学英语教师评职称工作总结
- 2018人教版三年级数学下册全套试卷
- 设备管理精细化
- 混凝土及抹灰表面施涂油性施工工艺标准
- 通过普尔文(Prometric)注册报名华为LTE初级认证考试的步骤及细则
- 地下车库冬施方案2013.12.09
- 工艺员考试试题
- 《机械产品再制造通用技术要求》标准编制说明
- 江苏省无锡市2017-2018学年高二下学期期末考试地理试卷 Word版含
- 常用护理文件的书写规范
- 中级职称-有机化工基础与实务复习笔记