(鲜花)万宁五子棋 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;
}

浙公网安备 33010602011771号