C++扫雷,python五子棋

编程入门 行业动态 更新时间:2024-10-24 06:38:15

C++扫雷,python<a href=https://www.elefans.com/category/jswz/34/1769950.html style=五子棋"/>

C++扫雷,python五子棋

今天我闲来无事,做了C++1个扫雷的游戏和一个python五子棋的游戏。
上效果截图:
扫雷:

五子棋:

源码先生:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<queue>
#include<ctype.h>
#define A 17	//地图的高
#define B 17	//地图的宽
#define C 30	//雷的总数
using namespace std;//全局变量
DWORD a,b;
char map[A][B],news,spare;
int BoomTotalNum,floatx,floaty,flag[A][B],flagnum,mode,slect[A][B],game;//颜色属性
const WORD FORE_BLUE  =  FOREGROUND_BLUE;	//蓝色文本属性
const WORD FORE_GREEN = FOREGROUND_GREEN;	//绿色文本属性
const WORD FORE_RED   =   FOREGROUND_RED;	//红色文本属性//开垦地图结构体 
struct node {int x;int y;
};
queue <node> dui;//打印位置
void position(int x,int y) {COORD pos={x,y};HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(Out,pos);
}//隐藏光标 
void Hide() {HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  CONSOLE_CURSOR_INFO CursorInfo;  GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息  CursorInfo.bVisible = false; //隐藏控制台光标  SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态   
}//初始化
void Beginning() {while(!dui.empty()) {dui.pop();}game=1;//BoomTotalNum=C;floatx=A/2;floaty=B/2;flagnum=0;BoomTotalNum=C;mode=0;HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息int x,y;srand((unsigned)time(0));for(int i=0;i<A;i++) for(int j=0;j<B;j++) {map[i][j]=' ';flag[i][j]=0;slect[i][j]=0;}while(BoomTotalNum) {x=rand()%A;y=rand()%B;if(map[x][y]==' ') {map[x][y]='@';BoomTotalNum--;}}SetConsoleTextAttribute(handle_out, FORE_GREEN);  for(int i=0;i<A;i++) {for(int j=0;j<B;j++) printf("█");printf("\n");}position(floaty*2,floatx);SetConsoleTextAttribute(handle_out, FORE_RED);  printf("");	//光标位置position(44,9);printf("扫雷模式");position(44,5);printf("剩余雷数:%d ",C-flagnum);SetConsoleTextAttribute(handle_out, FORE_GREEN);  position(5,22);printf("按“空格”切换模式");position(5,23);printf("按“Enter”确认");position(5,24);printf("按“方向键”选择方块"); }//打印地图的一块儿 
void Lump(int xx,int yy) {switch(map[xx][yy]) {case '1' : printf("①");break;	//周围雷的数量(下同) case '2' : printf("②");break;case '3' : printf("③");break;case '4' : printf("④");break;case '5' : printf("⑤");break;case '6' : printf("⑥");break;case '7' : printf("⑦");break;case '8' : printf("⑧");break;case ' ' :if(xx==floatx&&yy==floaty) {if(flag[xx][yy]==0) {if(mode%2==0) printf("");else printf("");}else printf("");}else {if(flag[xx][yy]==0) printf("█");else printf("");}break;case '@' :if(xx==floatx&&yy==floaty) {if(flag[xx][yy]==0) {if(mode%2==0) printf("");else printf("");}else printf("");}else {if(flag[xx][yy]==0) printf("█");else printf("");}break;case 'x' : if(floatx==xx&&floaty==yy) printf(""); else printf("  ");break;	//已经挖开的空白}
}//移动光标
void Move() {HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息int xxx,yyy;xxx=floatx;yyy=floaty;switch(news) {case 72 : floatx--;break;	//上 case 80 : floatx++;break;	//下 case 75 : floaty--;break;	//左 case 77 : floaty++;break;	//右 }if(floatx==-1) floatx=A-1; floatx%=A;	//两端穿模处理 if(floaty==-1) floaty=B-1; floaty%=B;position(yyy*2,xxx);SetConsoleTextAttribute(handle_out, FORE_GREEN);Lump(xxx,yyy);	//删除原位置if(map[floatx][floaty]=='x') {position(floaty*2,floatx);printf("  ");}position(floaty*2,floatx);SetConsoleTextAttribute(handle_out, FORE_BLUE);  Lump(floatx,floaty);	//更新新位置 
} //插旗和排雷模式切换 
void Mode() {HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息mode++;SetConsoleTextAttribute(handle_out, FORE_BLUE);position(floaty*2,floatx);if(mode%2==0) printf("");else printf("");position(44,9);if(mode%2==0) {SetConsoleTextAttribute(handle_out, FORE_BLUE);  printf("扫雷模式");}else {SetConsoleTextAttribute(handle_out, FORE_RED);  printf("插旗模式");}
}//该点周围地雷数 
int Boomnum(int xx,int yy) {int num=0;if((xx-1>=0)&&(yy-1>=0)&&(map[xx-1][yy-1]=='@')) num++;if((xx-1>=0)&&(yy+0>=0)&&(map[xx-1][yy]=='@')) num++;if((xx-1>=0)&&(yy+1<B) &&(map[xx-1][yy+1]=='@')) num++;if((xx+0>=0)&&(yy-1>=0)&&(map[xx][yy-1]=='@')) num++;if((xx+0>=0)&&(yy+1<B) &&(map[xx][yy+1]=='@')) num++;if((xx+1<A)&&(yy-1>=0) &&(map[xx+1][yy-1]=='@')) num++;if((xx+1<A)&&(yy+0>=0) &&(map[xx+1][yy]=='@')) num++;if((xx+1<A)&&(yy+1<B)  &&(map[xx+1][yy+1]=='@')) num++;return num;
}//更新地图 
void Open() {node c;node d;while(!dui.empty()) {dui.pop();}c.x=floatx;c.y=floaty;dui.push(c);slect[c.x][c.y]=1;while(!dui.empty()) {c=dui.front();dui.pop();if(Boomnum(c.x,c.y)!=0) {map[c.x][c.y]=(Boomnum(c.x,c.y)+48);continue;}else {map[c.x][c.y]='x';                                                                                                                                                                                                                                                                                                                                                                                                                                     if((c.x-1>=0)&&(c.y-1>=0)&&(map[c.x-1][c.y-1]==' ')&&(slect[c.x-1][c.y-1]==0)) {d.x=c.x-1;d.y=c.y-1;dui.push(d);slect[d.x][d.y]=1;}if((c.x-1>=0)&&(c.y-0>=0)&&(map[c.x-1][c.y]==' ')&&(slect[c.x-1][c.y]==0)) {d.x=c.x-1;d.y=c.y-0;dui.push(d);slect[d.x][d.y]=1;}if((c.x-1>=0)&&(c.y+1<B)&&(map[c.x-1][c.y+1]==' ')&&(slect[c.x-1][c.y+1]==0)) {d.x=c.x-1;d.y=c.y+1;dui.push(d);slect[d.x][d.y]=1;}if((c.x-0>=0)&&(c.y-1>=0)&&(map[c.x][c.y-1]==' ')&&(slect[c.x][c.y-1]==0)) {d.x=c.x-0;d.y=c.y-1;dui.push(d);slect[d.x][d.y]=1;}if((c.x-0>=0)&&(c.y+1<B)&&(map[c.x][c.y+1]==' ')&&(slect[c.x][c.y+1]==0)) {d.x=c.x-0;d.y=c.y+1;dui.push(d);slect[d.x][d.y]=1;}if((c.x+1<A)&&(c.y-1>=0)&&(map[c.x+1][c.y-1]==' ')&&(slect[c.x+1][c.y-1]==0)) {d.x=c.x+1;d.y=c.y-1;dui.push(d);slect[d.x][d.y]=1;}if((c.x+1<A)&&(c.y-0>=0)&&(map[c.x+1][c.y]==' ')&&(slect[c.x+1][c.y]==0)) {d.x=c.x+1;d.y=c.y-0;dui.push(d);slect[d.x][d.y]=1;}if((c.x+1<A)&&(c.y+1<B)&&(map[c.x+1][c.y+1]==' ')&&(slect[c.x+1][c.y+1]==0)) {d.x=c.x+1;d.y=c.y+1;dui.push(d);slect[d.x][d.y]=1;}}}
}int main() {freopen("排名.txt","r",stdin);Relife:	//重玩处HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  CONSOLE_SCREEN_BUFFER_INFO csbi;                        //定义窗口缓冲区信息结构体  GetConsoleScreenBufferInfo(handle_out, &csbi);          //获得窗口缓冲区信息Hide();		//隐藏光标Beginning();//初始化地图a=GetTickCount();while(1) {if(kbhit()!=0) {spare=getch();//按其他if((spare!=(-32))&&(spare!=13)&&(spare!=' ')) continue;//跳过 //按Enterif(spare==13) {	//确认 //排雷if(mode%2==0) {if(map[floatx][floaty]=='@'&&flag[floatx][floaty]==0) {break;	//触雷game=0;}if(flag[floatx][floaty]==1) continue;	//有旗跳过Open();position(0,0);SetConsoleTextAttribute(handle_out, FORE_GREEN);for(int i=0;i<A;i++) {for(int j=0;j<B;j++) Lump(i,j);printf("\n");}position(floaty*2,floatx);SetConsoleTextAttribute(handle_out, FORE_BLUE);Lump(floatx,floaty);}//插拔旗else {//不能插旗的地方if(map[floatx][floaty]=='x'||(map[floatx][floaty]>'0'&&map[floatx][floaty]<'9'))continue;	//跳过//插旗if(flag[floatx][floaty]==0) {flagnum++;flag[floatx][floaty]=1;position(floaty*2,floatx);SetConsoleTextAttribute(handle_out, FORE_BLUE);Lump(floatx,floaty);}//拔旗 else {flagnum--;flag[floatx][floaty]=0;position(floaty*2,floatx);SetConsoleTextAttribute(handle_out, FORE_BLUE);Lump(floatx,floaty);}}}//按空格if(spare==' ') Mode();	//切换模式 //按方向键 if(spare==-32) {news=getch();Move();	//移动光标}for(int i=0;i<A;i++) for(int j=0;j<B;j++) if(map[i][j]=='x'||(map[i][j]>'0'&&map[i][j]<'9')) game++;if(game==A*B-C+1) break;else game=1;SetConsoleTextAttribute(handle_out, FORE_RED);position(44,5);printf("剩余雷数:%d ",C-flagnum);}else Sleep(10);b=GetTickCount();SetConsoleTextAttribute(handle_out, FORE_RED);position(44,7);printf("用时:");	//用时 if((b-a)/60000<10) printf("0");printf("%d:",(b-a)/60000);if(((b-a)/1000)%60<10) printf("0");printf("%d:",((b-a)/1000)%60);if(((b-a)/10)%100<10) printf("0");printf("%d",((b-a)/10)%100);}SetConsoleTextAttribute(handle_out, FORE_RED);position(5,5);if(game==1) printf("游戏结束!");else printf("恭喜通关!");position(5,8);printf("任意键重玩");scanf("%c%c",&spare,&spare);system("cls");position(0,0);goto Relife;
}    

五子棋:

import random
class chess:def __init__(self):print('#---------------棋盘----------------#')self.grid = []self.si = []for i in range(8):self.grid.append([' □  ']*8)for j in range(8):print(''.join(self.grid[j]),'\n')  #''.join(grid[j]))def getPos(self,x,y):print('#----------------落子----------------#')self.x = xself.y = yif self.grid[self.x][self.y]== ' ○  ' or self.grid[self.x][self.y]== ' ●  ':  # 判断棋子是否重复print('\t\t\t棋子有重复')else:self.l = 0self.grid[self.x][self.y] = ' ●  'if self.x==7 or self.y==0 :self.grid[random.randint(self.x-2,self.x-1)][random.randint(self.y-2,self.y-1)] = ' ○  'else:self.grid[self.x][self.y] = ' ●  'self.grid[self.x + 1][ self.y + 1] =' ○  'self.si.append([self.x, self.y])for i in range(len(self.si)):if self.si[i-1][0] == self.si[i][0] or self.si[i-1][1] == self.si[i][1] or self.si[i][1]==self.si[i][0] and self.si[i-1][1]==self.si[i-1][0] and (self.grid[self.x-1][self.y] != ' □  ' or self.grid[self.x+1][self.y+1] != ' □  'or self.grid[self.x-1][self.y-1] != ' □  'or self.grid[self.x+1][self.y] != ' □  'or self.grid[self.x-1][self.y] != ' □  'or self.grid[self.x][self.y-1] != ' □  '                                                                                                                                               or self.grid[self.x][self.y+1] != ' □  'or self.grid[self.x][self.y-1] != ' □  '):  # 判断玩家是否排成一条线self.l += 1for j in range(8):print(''.join(self.grid[j])+'\n')  #''.join(grid[j]))def rulers(self):recode = []recode.append([self.x,self.y])print(self.si)for i in range(len(recode)):for j in range(len(recode[i])):if self.l==5:         # 标记,当为5时结束游戏print('游戏结束')print('玩家胜利')self.t = Falsereturn self.telif len(self.si)>6: # 判断平局,因为条件简单,所以不会出现电脑赢的情况print('游戏结束')print('平局')self.t = Falsereturn self.telse:self.t = Truereturn self.tplay = chess()
t = True
while t:       # 循环实现棋盘出现x,y = input("\t请输入x,y坐标用','分割:\n").split(',')play.getPos(int(x),int(y))t = play.rulers()

以上就是今天的项目了。
记得点赞哦+收藏。

更多推荐

C++扫雷,python五子棋

本文发布于:2024-02-12 02:03:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1685135.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:五子   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!