使用C语言及VC绘图库,在VC环境下,设计一个双人五子棋对战单机游戏,双方各执黑白一子,黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子,则该方就算获胜,游戏过程可以悔棋一步。要求友好的图形化界面、方便操作。
实训要做项目呐。天天坐在电脑面前累死了。最近题刷的少。大多数都挺水。就不挨个编辑发上来了。发发白天写的项目吧。可能好几天更一下。实训结束恢复正常。
这个游戏需要EasyX的图像库。有兴趣的可以下一个图像库运行一下玩玩~(虽然= =没LOL好玩2333333)
设计题目:双人五子棋对战单机游戏
使用C语言及VC绘图库,在VC环境下,设计一个双人五子棋对战单机游戏,双方各执黑白一子,黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子,则该方就算获胜,游戏过程可以悔棋一步。要求友好的图形化界面、方便操作。
功能设计要求
根据五子棋游戏规则,项目设计有以下几点要求:
- 输出游戏规则并由用户决定是否遵守并开局。
- 要求动态画出棋盘大小。
- 画棋子并确定其颜色。
- 提示下棋规则。
- 玩家轮流下棋。
- 判断谁先落棋。
- 允许且只允许悔棋一步。
- 判断每局游戏输赢,显示每局游戏的获胜者及分数。
- 判断是否进行下一局。
- 判最终赢家(三局两胜)。
1 #include<stdio.h>
2 #include<graphics.h>
3 #include<conio.h>
4 #define N 10
5 void gameover();
6 void MainFace();
7 int Game_Over1(int a[10][10],int chess_symbol )/* "-"形或者"|"形(事实上"-"与"|"关于"\"对称) */
8 {
9 int i,j,k,l,r;
10 for( i=0; i < N; i++ )
11 for( k=0; k < N-4; k++ )
12 {
13 l=r=0;
14 for( j=k; j < k+5; j++ )
15 {
16 if( a[i][j] == chess_symbol )/* "-"形*/
17 l++;
18 if( a[j][i] == chess_symbol )/* "|"形*/
19 r++;
20 }
21 if( l == 5 || r == 5 )/*连续的个棋子在一条直线上时,游戏结束*/
22 return 1; }
23 return 0;
24 }
25
26
27 int Game_Over2( int a[10][10] ,int chess_symbol )/* "\"形*/
28 {
29 int i,j,k,m,LeftDown,RightUp;
30 for( m=0; m < N-4; m++ )
31 for( k=0; k < N-4-m; k++ )
32 {
33 RightUp=LeftDown=0;
34 for( i=k ,j=k+m; i < k+5; i++ ,j++ )
35 {
36 if( a[i][j] == chess_symbol )/* 对角线"\"上及其右上方的"\"形*/
37 RightUp++;
38 if( a[j][i] == chess_symbol )/* 对角线"\"上及其左下方的"\"形*/
39 LeftDown++;
40 }
41 if( RightUp == 5 || LeftDown == 5 )
42 return 1;
43 }
44 return 0;
45 }
46 int Game_Over3( int a[10][10] ,int chess_symbol )/* "/"形*/
47 {
48 int i,j,k,m,LeftUp,RightDown;
49 for( m=N-1; m >= 4; m-- )
50 for( k=0; k < m + 1 - 4; k++ )
51 {
52 RightDown=LeftUp=0;
53 for( i=k ,j= m - k; i < k+5; i++ ,j-- )
54 {
55 if( a[i][j] == chess_symbol )/*对角线"/"上及其左上方的"/"形*/
56 LeftUp++;
57 if( a[N-1-j][N-1-i] == chess_symbol )/*对角线"/"上及其右下方的"/"形*/
58 RightDown++;
59 }
60 if( RightDown == 5 || LeftUp == 5 )
61 return 1;
62 }
63 return 0;
64 }
65
66 typedef struct
67 {
68 UINT uMsg;
69 int x;
70 int y;
71 }m;
72 void main()
73 {
74 char k;
75 printf("请遵守游戏规则\nYes or No");
76 printf("请选择'y'or'n'\n");
77 scanf("%c",&k);
78 if(k=='y'||k=='Y') MainFace();
79 if(k=='n'||k=='N') {printf("感谢您的使用\n");gameover();}
80 }
81 void gameover()
82 {
83 getch();
84 closegraph();
85 }
86
87 void MainFace()
88 {
89 int chess[N][N]={0};
90 int i,x,y,j,r,n=1;
91 int v[N];
92 char ch;
93 MOUSEMSG m;
94 initgraph(500,500);/*生成一个,区域*/
95 setbkcolor(LIGHTGRAY); cleardevice();/*背景设置为白色*/
96 setcolor(RED);/*画图颜色是红色*/
97 for(x=2;x<=502;x=x+50)/*画棋盘格*/
98 {
99 line(x,2,x,500);
100 line(2,x,500,x);
101 }
102 while(true)/*响应鼠标操作*/
103 {
104 m = GetMouseMsg();
105 if(m.uMsg==WM_LBUTTONDOWN)
106 {
107 x=m.x%50;if(x<=25)m.x=m.x-x;else m.x=m.x+(50-x);
108 y=m.y%50;if(y<=25)m.y=m.y-y;else m.y=m.y+(50-y);
109 i=m.x/50;j=m.y/50;
110 if (chess[i][j]!=0)/*防止在一个地方重复下棋子chess[i][j]==1 为白子 chess[i][j]==1 为黑子*/
111 continue;
112 if(n==1)/*判断该谁下棋*/
113 {
114 setcolor(WHITE);
115 setfillstyle(WHITE);
116 fillcircle(m.x,m.y,20);
117 /*fillellipse(m.x,m.y,10,10);*/
118 chess[i][j]=1;
119 if(Game_Over1(chess,1)==1||Game_Over2(chess,1)==1||Game_Over3(chess,1)==1)
120 {
121 setcolor(BLACK);outtextxy(200,200,"此局白子胜利");
122 v[0]++; if(v[0]==2)
123 { outtextxy(200,300,"3局胜,白子胜局,白子胜出"); break;}
124 outtextxy(250,250,"是否继续下棋:Y OR N");
125 ch= getch();
126 if(ch=='N') break;
127 else{
128 for(i=0;i<N;i++)
129 for(j=0;j<N;j++)
130 chess[i][j]=0;
131 setbkcolor(LIGHTGRAY); cleardevice();/*背景设置为白色*/
132 setcolor(RED);/*画图颜色是红色*/
133 for(x=2;x<=502;x=x+50)/*画棋盘格*/
134 { line(x,2,x,500);
135 line(2,x,500,x);
136 }
137 }
138 }
139 n=2;/*换方下子*/
140 }
141 else
142 {
143 chess[i][j]=2;
144 for(r=20;r>=0;r--)
145 {
146 setcolor(BLACK);
147 setfillstyle(BLACK);
148 fillcircle(m.x,m.y,r);
149 }
150 /*fillellipse(m.x,m.y,1,1); */
151 if(Game_Over1(chess,2)==1||Game_Over2(chess,2)==1||Game_Over3(chess,2)==1)
152 {
153 setcolor(BLACK);outtextxy(200,200,"此局黑子胜利"); v[1]++;
154 if(v[1]==2){ outtextxy(200,200,"3局胜,黑子胜局,黑子胜出"); break;}
155 outtextxy(250,250,"是否继续下棋:Y OR N");
156 ch= getch();
157 if(ch=='N') break;
158 else{
159 for(i=0;i<N;i++)
160 for(j=0;j<N;j++)
161 chess[i][j]=0;
162 setbkcolor(LIGHTGRAY); cleardevice();/*背景设置为白色*/
163 setcolor(RED);/*画图颜色是红色*/
164 for(x=2;x<=502;x=x+50)/*画棋盘格*/
165 { line(x,2,x,500);
166 line(2,x,500,x);
167 }
168 }
169 }
170 n=1;
171 }
172 }
173 if(m.uMsg==WM_RBUTTONUP) break;/*右键结束*/
174 }
175 getch();
176 closegraph();
177 }