(鲜花)万宁五子棋 v0.2

突然发现以前做的蛮有意思的一玩意

万宁五子棋

就一挺 naive 的东西,允许两个玩家在同一电脑上轮流下棋,W,A,S,D 移动棋子,Enter 下棋,会自动判定五子连珠,然后就没了。

后续可能会更新点人机什么的东西,看兴致

源码如下,欢迎大家各种形式 upd

汉化版(部分机型无法正常显示)
#include<bits/stdc++.h>
#include<conio.h>
#include<Windows.h>
using namespace std;
void move(int x,int y){
	HANDLE hout;
	COORD coord={x,y};
	hout=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout,coord);
}
char q[31][31];
struct st{
	int h,l;
}aa[20*20+1];
int a,b,c,wro,mq,pre;
char get1;
bool five;
void toprint(){
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			if(i==a&&j==b)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
			else if(q[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
			else if(q[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
			else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_INTENSITY);
			printf("%c ",q[i][j]);
		}
		printf("\n");
	}
}
int main(){
	label:system("cls");
	system("title 万宁五子棋v0.2");
	mq=0;wro=0;c=0;b=0;a=0;get1=0;five=0;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			q[i][j]='0'; 
		}
	}
	printf("_____________________________\n"); 
	printf("|                           |\n"); 
	printf("|    欢迎来到万宁五子棋!   |\n");
	printf("|                           |\n");
	printf("|    开始(S)    退出(Q)     |\n");
	printf("|                           |\n");
	printf("|        查看规则(R)        |\n"); 
	printf("|___________________________|\n"); 
	while(!kbhit())//不断检测键盘是否按下
	{
		get1=getch();//获取被按下的按键并赋给变量get
		if(get1=='s')break;
		else if(get1=='q')return 0;
		else if(get1=='r'){
			system("cls");
			printf("这是一个简单益智的小游戏。\n");
			printf("游戏由两名玩家组成。\n");
			printf("当轮到你的时候,\n");
			printf("你需要使用 W,A,S,D 移动你的光标,\n");
			printf("并按 Enter 下棋。\n");
			printf("首先将其五个棋子连成一串者胜利。\n");
			printf("\n你可以按 Enter 继续游玩。\n");
			while(!kbhit()){
				get1=getch();
				if(get1==VK_RETURN)
					goto label;
			}
		}
	}
	system("cls");
	a=10;b=10;c=0;
	while(1){
		move(0,0);
		toprint();
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
		five=0;
		for(int i=1;i<=20;i++){
			for(int j=1;j<=20;j++){
				if(q[i][j]!='0'){
					if(q[i+1][j]==q[i][j]&&q[i+2][j]==q[i][j]&&q[i+3][j]==q[i][j]&&q[i+4][j]==q[i][j]){five=true;break;}
					else if(q[i][j+1]==q[i][j]&&q[i][j+2]==q[i][j]&&q[i][j+3]==q[i][j]&&q[i][j+4]==q[i][j]){five=true;break;}
					else if(q[i+1][j+1]==q[i][j]&&q[i+2][j+2]==q[i][j]&&q[i+3][j+3]==q[i][j]&&q[i+4][j+4]==q[i][j]){five=true;break;}
					else if(i>=5&&j>=5&&q[i+1][j-1]==q[i][j]&&q[i+2][j-2]==q[i][j]&&q[i+3][j-3]==q[i][j]&&q[i+4][j-4]==q[i][j]){five=true;break;}
				}
			}
			if(five==true)break;
		}
		if(five==true){
			system("cls");
			toprint();
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
			if(c)printf("玩家1胜利!\n按R重来,按Q退出\n");
			else printf("玩家2胜利!\n按R重来,按Q退出\n");
			while(1){
				if(kbhit()){
					get1=getch();
					if(get1=='q'){
						return 0;
					}
					else if(get1=='r'){
						main();
						return 0;
					}
				}
			}
		}
		if(pre!=wro){
			system("cls");
			toprint();
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
		}
		if(wro==1)printf("无法在已有的棋子上下棋\n");
		else if(wro==2)printf("没有棋子可以悔棋\n");
		else if(c)printf("玩家2下棋\n");
		else printf("玩家1下棋\n");
		printf("投降请按Q,悔棋请按H\n");
		pre=wro;wro=0;
		while(1)
		{
			if(kbhit()){
				get1=getch();
				if(get1=='w'||get1==VK_UP){
					if(a>1)a--;
					break;
				}
				else if(get1=='a'||get1==VK_LEFT){
					if(b>1)b--;
					break;
				}
				else if(get1=='s'||get1==VK_DOWN){
					if(a<20)a++;
					break;
				}
				else if(get1=='d'||get1==VK_RIGHT){
					if(b<20)b++;
					break;
				}
				else if(get1==VK_RETURN){
					if(q[a][b]=='0'){
						if(c==0){q[a][b]='1';mq++;aa[mq].h=a;aa[mq].l=b;c=1;} 
						else {q[a][b]='2';mq++;aa[mq].h=a;aa[mq].l=b;c=0;} 
					}
					else wro=1;
					break;
				}
				else if(get1=='q'){
					system("cls");
					toprint();
					SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
					if(c)printf("玩家1胜利!\n按R重来,按Q退出\n");
					else printf("玩家2胜利!\n按R重来,按Q退出\n");
					while(1){
						if(kbhit()){
							get1=getch();
							if(get1=='q'){
								return 0;
							}
							else if(get1=='r'){
								main();
								return 0;
							}
						}
					}
				}
				else if(get1=='h'){
					if(mq>0){
						q[aa[mq].h][aa[mq].l]='0';
						mq--;
						if(c==1)c=0;
						else c=1; 
					}
					else wro=2;
					break;
				}
			}
		}
	}
	return 0;
}
原版
#include<bits/stdc++.h>
#include<conio.h>
#include<Windows.h>
using namespace std;
void move(int x,int y){
	HANDLE hout;
	COORD coord={x,y};
	hout=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hout,coord);
}
char q[31][31];
struct st{
	int h,l;
}aa[20*20+1];
int a,b,c,wro,mq,pre;
char get1;
bool five;
void toprint(){
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			if(i==a&&j==b)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
			else if(q[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
			else if(q[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
			else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_INTENSITY);
			printf("%c ",q[i][j]);
		}
		printf("\n");
	}
}
int main(){
	label:system("cls");
	system("title WANNING FIVE-IN-A-ROW v0.2");
	mq=0;wro=0;c=0;b=0;a=0;get1=0;five=0;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			q[i][j]='0'; 
		}
	}
	printf("_______________________________________\n"); 
	printf("|                                     |\n"); 
	printf("|  Welcome to WANNING FIVE-IN-A-ROW!  |\n");
	printf("|                                     |\n");
	printf("|         START(S)    QUIT(Q)         |\n");
	printf("|                                     |\n");
	printf("|              RULES(R)               |\n"); 
	printf("|_____________________________________|\n"); 
	while(!kbhit())//不断检测键盘是否按下
	{
		get1=getch();//获取被按下的按键并赋给变量get
		if(get1=='s')break;
		else if(get1=='q')return 0;
		else if(get1=='r'){
			system("cls");
			printf("This is a simple chess game to learn.\n");
			printf("There are two players in the game.\n");
			printf("When it is your turn,\n");
			printf("All you need to do is press W,A,S,D on the keyboard to move your cursor,\n");
			printf("and Enter to lay down your chess.\n");
			printf("The one player who first get his five pieces in a row wins.\n");
			printf("\nYou may now press Enter to continue playing.\n");
			while(!kbhit()){
				get1=getch();
				if(get1==VK_RETURN)
					goto label;
			}
		}
	}
	system("cls");
	a=10;b=10;c=0;
	while(1){
		move(0,0);
		toprint();
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
		five=0;
		for(int i=1;i<=20;i++){
			for(int j=1;j<=20;j++){
				if(q[i][j]!='0'){
					if(q[i+1][j]==q[i][j]&&q[i+2][j]==q[i][j]&&q[i+3][j]==q[i][j]&&q[i+4][j]==q[i][j]){five=true;break;}
					else if(q[i][j+1]==q[i][j]&&q[i][j+2]==q[i][j]&&q[i][j+3]==q[i][j]&&q[i][j+4]==q[i][j]){five=true;break;}
					else if(q[i+1][j+1]==q[i][j]&&q[i+2][j+2]==q[i][j]&&q[i+3][j+3]==q[i][j]&&q[i+4][j+4]==q[i][j]){five=true;break;}
					else if(i>=5&&j>=5&&q[i+1][j-1]==q[i][j]&&q[i+2][j-2]==q[i][j]&&q[i+3][j-3]==q[i][j]&&q[i+4][j-4]==q[i][j]){five=true;break;}
				}
			}
			if(five==true)break;
		}
		if(five==true){
			system("cls");
			toprint();
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
			if(c)printf("Player1's Victory!\nPress R for restart and Q for quit.\n");
			else printf("Player2's Victory!\nPress R for restart and Q for quit.\n");
			while(1){
				if(kbhit()){
					get1=getch();
					if(get1=='q'){
						return 0;
					}
					else if(get1=='r'){
						main();
						return 0;
					}
				}
			}
		}
		if(pre!=wro){
			system("cls");
			toprint();
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
		}
		if(wro==1)printf("Unable to cover those already covered grids.\n");
		else if(wro==2)printf("No moves to take back.\n");
		else if(c)printf("Player2's turn\n");
		else printf("Player1's turn\n");
		printf("Press Q to surrender or H to take back a move.\n");
		pre=wro;wro=0;
		while(1)
		{
			if(kbhit()){
				get1=getch();
				if(get1=='w'||get1==VK_UP){
					if(a>1)a--;
					break;
				}
				else if(get1=='a'||get1==VK_LEFT){
					if(b>1)b--;
					break;
				}
				else if(get1=='s'||get1==VK_DOWN){
					if(a<20)a++;
					break;
				}
				else if(get1=='d'||get1==VK_RIGHT){
					if(b<20)b++;
					break;
				}
				else if(get1==VK_RETURN){
					if(q[a][b]=='0'){
						if(c==0){q[a][b]='1';mq++;aa[mq].h=a;aa[mq].l=b;c=1;} 
						else {q[a][b]='2';mq++;aa[mq].h=a;aa[mq].l=b;c=0;} 
					}
					else wro=1;
					break;
				}
				else if(get1=='q'){
					system("cls");
					toprint();
					SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
					if(c)printf("Player1's Victory!\nPress R for restart and Q for quit.\n");
					else printf("Player2's Victory!\nPress R for restart and Q for quit.\n");
					while(1){
						if(kbhit()){
							get1=getch();
							if(get1=='q'){
								return 0;
							}
							else if(get1=='r'){
								main();
								return 0;
							}
						}
					}
				}
				else if(get1=='h'){
					if(mq>0){
						q[aa[mq].h][aa[mq].l]='0';
						mq--;
						if(c==1)c=0;
						else c=1; 
					}
					else wro=2;
					break;
				}
			}
		}
	}
	return 0;
}
posted @ 2025-11-07 19:44  TBSF_0207  阅读(3)  评论(0)    收藏  举报