写了一个代码,命令提示符版五子棋。只是提供学习的
提供个新人学习和鼓励用的。程序代码:
/*************************** * E-mail:dreamdev@ * ***************************/ /* 所用的知识全为最初级入门知识。 注意逻辑结构就可以完成: 一个逻辑核心(包括构建地图和处理逻辑信息) 一个显示界面功能 一个控制功能 界面不断读取核心来显示它,控制功能操控逻辑 它很像我用opengl,大多数图形SDK都是这个逻辑 */ #include <iostream> #include <string> using namespace std; char map[10][10];//我们的地图 string pmove;//控制操作用的 char players=1;//用于决定哪个玩家行动,初始化为空心笑脸 bool gamewin=false;//判断游戏是否胜利 string showmsg,showerror;//界面显示状态 int ix=0,iy=0;//它在每个函数内的作用都不一样,但函数在使用前会自己初始化 int gamen;//记录游戏有效次数,你不想都放满了游戏还在继续吧 void newgame();//新的游戏 void showmap();//绘画界面 void player();//玩家操控 void gamew();//游戏是否胜利,谁取得胜利 int main() { system("color 75");//只是缓解视觉疲劳,命令提示符中输入color ?可以得到该命令全部说明 while(1) { newgame(); while(!gamewin) { showmap(); if(!gamewin)player(); } } } void newgame()//全部的初始化,新游戏只执行一次 { ix=0;iy=0; while(iy<10){ while(ix<10){ map[ix][iy]='+'; ix++; } iy++; ix=0; } gamewin=false; players=1; gamen=0; } void showmap()//显示在屏幕上的东西 { system("CLS");//系统内部函数,执行命令提示符输入命令,只是为了美观而清屏 cout<<"输入坐标请先输入数字然后输入字母,比如0a或者9j.\n" "为什么只有9格?因为多了10以上格子和坐标编号对不齐,只是因为这样而已\n"<<endl;//先来段说明吧 char text='a'; ix=0;iy=0; cout<<" "<<"0 1 2 3 4 5 6 7 8 9\n"<<endl; while(iy<10){ cout<<text<<" "; while(ix<10){ cout<<map[ix][iy]<<" "; ix++; } cout<<endl; iy++; text++; ix=0; } if(gamen<=80) { if(players==1) showmsg=" 该空心笑脸行动"; else showmsg=" 该实心笑脸行动"; cout<<"\n状态: "<<players<<showmsg<<" "<<showerror<<"\n\n请输入坐标:"; showerror=""; } else { cout<<"\n这下只能平局了,回车后重新开始"; gamewin=true; cin.get();cin.get();//输入缓冲的问题,用两个让它停下来 } } void player() { cin>>pmove; ix=pmove[0]-48;iy=pmove[1]-97;//依次为横向数字,竖向字母。根据ASCII码减成0 if(ix>9||iy>9||iy<0||ix<0)//它不能防止乱输入,但可以防止内存泄漏 {showerror+=" 错误:坐标输入错误!";} else { if(map[ix][iy]!='+') {showerror+=" 错误:该位置上不可放置!";} else { map[ix][iy]=players;//放置棋子 gamen++;//记录有效次数 gamew();//如果把检测单独做个模块,它就能添加AI if(players==1)//如果能正常运行在地图上完成后记住交换玩家 players=2; else players=1; } } } void gamew() { int test=0; for(int x=0;x<=9;x++){//注意这个循环只检查了竖行体系 for(int y=0;y<=9;y++){ if(map[x][y]==players)test++;//如果检测到棋子就+1 if(test>=5)gamewin=true;//如果连续的5个就胜利 if(map[x][y]!=players)test=0;//如果遇到断开的就归零 } } test=0; for(int x=0;x<=9;x++){//横行体系 一模一样只是复制下 for(int y=0;y<=9;y++){ if(map[y][x]==players)test++;//交换一下下标就可以了 if(test>=5)gamewin=true;//如果连续的5个就胜利 if(map[y][x]!=players)test=0;//如果遇到断开的就归零 } } int mx=ix,my=iy;test=0; while(mx<=9 && my>=0){//棋子点往上右 if(map[mx][my]==players)test++; if(test>=5)gamewin=true; if(map[mx][my]!=players)break; mx++;my--; } mx=ix-1,my=iy+1; while(mx>=0 && my<=9){//棋子点往下左 if(map[mx][my]==players)test++; if(test>=5)gamewin=true; if(map[mx][my]!=players)break; mx--;my++; } mx=ix,my=iy;test=0; while(mx>=0 && my>=0){//棋子点往上左 if(map[mx][my]==players)test++; if(test>=5)gamewin=true; if(map[mx][my]!=players)break; mx--;my--; } mx=ix+1,my=iy+1; while(mx<=9 && my<=9){//棋子点往下右 if(map[mx][my]==players)test++; if(test>=5)gamewin=true; if(map[mx][my]!=players)break; mx++;my++; } if(gamewin==true){ showmap();//一般前面是先绘制再控制,这里得到胜利条件就不绘制了,所以绘制一下 if(players==1) cout<<players<<players<<players<<"空心笑脸玩家胜利啦"<<players<<players<<players; else cout<<players<<players<<players<<"实心笑脸玩家胜利啦"<<players<<players<<players; cin.get();cin.get(); } }