小项目:五子棋 ? ? 需要的数据: ? ? ? ? 1、定义字符数组棋盘 15*15 ? ? ? ? 2、定义变量用于记录落子的位置 ? ? ? ? 3、定义一个变量记录棋子角色 ?黑棋 '@' 白棋 '$' ? ? 业务逻辑: ? ? ? ? 定义需要数据 ? ? ? ? 是否需要对数据进行初始化 ? ? ? ? for(;;) ? ? ? ? { ? ? ? ? ? ? 1、清理屏幕、显示棋盘 ? ? ? ? ? ? 2、落子 ? ? ? ? ? ? ? ? 坐标要合法、该位置不能有棋子 ? ? ? ? ? ? ? ? 否则继续重新落子 ? ? ? ? ? ? 3、检查是否五子连珠 ? ? ? ? ? ? ? ? 是,结束游戏 ? ? ? ? ? ? 4、交换角色 ? ? ? ? }
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//棋盘数组
char board[15][15]={};
//棋子坐标
int man_x=0,man_y=0;
//棋子 黑“@” 白“$”
int man='@';
//初始化棋盘
void initialize(void);
//显示棋盘
void print_board(void);
//落子
void drop(void);
//检查是否五子连珠
bool is_win(void);
int is_win_count(int num1,int num2);
int main(int argc,const char* argv[])
{
initialize();
for(int i=0;i<225;i++)
{
print_board();
drop();
if(is_win())
{
print_board();
printf("%c赢,游戏结束",board[man_x-1][man_y-1]);
return 0;
}
//交换角色
man = '@'==man?'$':'@';
}
}
void initialize(void) //初始化棋盘
{
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
board[i][j]='*';
}
}
}
void print_board(void) //显示棋盘
{
system("clear");
printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
for(int i=0;i<15;i++)
{
printf("%-2d ",i+1);
for(int j=0;j<15;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
void drop(void) //落子
{
printf("请%c输入棋子的位置:",man);
scanf("%d%d",&man_x,&man_y);
for(;;)
{
//检验坐标是否合法
if(man_x>15 || man_x<1 || man_y>15 || man_x<1)
{
printf("该坐标不合法,请重新输入%c的位置:",man);
scanf("%d%d",&man_x,&man_y);
}
//检查是否有棋子
else if(board[man_x-1][man_y-1] != '*')
{
printf("该做标已经被占据,请重新输入%c的位置:",man);
scanf("%d%d",&man_x,&man_y);
}
else
{
board[man_x-1][man_y-1]=man;
break;
}
}
}
bool is_win(void) //检查是否五子连珠
{
if(is_win_count(1,0)+is_win_count(-1,0)>=4)
return true;
if(is_win_count(0,1)+is_win_count(0,-1)>=4)
return true;
if(is_win_count(1,1)+is_win_count(-1,-1)>=4)
return true;
if(is_win_count(-1,1)+is_win_count(1,-1)>=4)
return true;
return false;
}
int is_win_count(int num1,int num2)
{
int count=0;
int x=num1;
int y=num2;
for(;;)
{
if(man_x-1+x<0 ||man_x-1+x>=15||man_y-1+y<0||man_y-1+y>=15)
{
break;
}
if(board[man_x-1+x][man_y-1+y]==board[man_x-1][man_y-1])
{
count++;
x=x+num1;
y=y+num2;
}
else
{
break;
}
}
return count;
优化:引入了光标
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdbool.h>
4 #include <getch.h>
5
6 //棋盘数组
7 char board[15][15]={};
8 //棋子坐标
9 int man_x=7,man_y=7;
10 //棋子 黑“@” 白“$”
11 int man='@';
12
13 //初始化棋盘
14 void initialize(void);
15
16 //显示棋盘
17 void print_board(void);
18
19 //落子
20 void drop(void);
21
22 //检查是否五子连珠
23 bool is_win(void);
24 int is_win_count(int num1,int num2);
25
26 int main(int argc,const char* argv[])
27 {
28 initialize();
29 for(int i=0;i<225;i++)
30 {
31 print_board();
32 drop();
33 if(is_win())
34 {
35 print_board();
36 printf("%c赢,游戏结束",board[man_x][man_y]);
37 return 0;
38 }
39 //交换角色
40 man = '@'==man?'$':'@';
41 }
42 }
43
44 void initialize(void) //初始化棋盘
45 {
46 for(int i=0;i<15;i++)
47 {
48 for(int j=0;j<15;j++)
49 {
50 board[i][j]='*';
51 }
52
53 }
54
55 void print_board(void) //显示棋盘
56 {
57 system("clear");
58 for(int i=0;i<15;i++)
59 {
60 for(int j=0;j<15;j++)
61 {
62 printf(" %c",board[i][j]);
63 }
64 printf("\n");
65 }
66 }
67
68 void drop(void) //落子
69 {
70 printf("请%c落子",man);
71 for(;;)
72 {
73 printf("\33[%d;%dH",man_x+1,(man_y+1)*2);
74 switch(getch())
75 {
76 case 183: man_x>0 && man_x--; break;
77 case 184: man_x<14 && man_x++; break;
78 case 186: man_y>0 && man_y--; break;
79 case 185: man_y<14 && man_y++; break;
80 case 10:
81 if(board[man_x][man_y]=='*')
82 {
83 board[man_x][man_y]=man;
84 return;
85 }
86 break;
87 }
88 }
89 }
90
91
92 bool is_win(void) //检查是否五子连珠
93 {
94 if(is_win_count(1,0)+is_win_count(-1,0)>=4)
95 return true;
96 if(is_win_count(0,1)+is_win_count(0,-1)>=4)
97 return true;
98 if(is_win_count(1,1)+is_win_count(-1,-1)>=4)
99 return true;
100 if(is_win_count(-1,1)+is_win_count(1,-1)>=4)
101 return true;
102 return false;
103 }
104
105 int is_win_count(int num1,int num2)
106 {
107 int count=0;
108 int x=num1;
109 int y=num2;
110 for(;;)
111 {
112 if(man_x+x<0 ||man_x+x>=15||man_y+y<0||man_y+y>=15)
113 {
114 break;
115 }
116 if(board[man_x+x][man_y+y]==board[man_x][man_y])
117 {
118 count++;
119 x=x+num1;
120 y=y+num2;
121 }
122 else
123 {
124 break;
125 }
126 }
127 return count;
128 }
?
?
|