按照五子棋规则,当一方的棋子,在横向,纵向或斜向连续五个均为同一用户的棋子时,代表胜利。
另外,胜利判断只需要在一个新子落子时判断,且仅需要判断新子所在的四条线上(纵横加两个斜线)是否满足条件即可。
所以,可以以新子坐标为基准点,判断四次。
比如横向的,需要判断左侧和右侧连续的同类棋子个数,如果左侧+右侧+1(自身)总数>=5,则为胜利。
参考代码如下:
static int map[100][100] // 全局变量棋盘。未下子时值为0,下子时值为1或2,区分下子人。int check_win(int m, int n)
{
int total = 1
int i
for(i = m-1 i >= 0 i --)//统计同行左侧连续同样棋子个数。
if(map[i][n] == map[m][n]) total++
else break
for(i = m+1 i < 100 i ++)//统计同行右侧连续同样棋子个数。
if(map[i][n] == map[m][n]) total++
else break
if(total>=5) return 1//胜利。
return 0 //没有胜利。
}
其它类似。
没有做输入上的防呆#include <stdio.h>
#include <stdlib.h>
int main(){
float x=0, money=0
char y
int z=0
printf("请输入加油量(千克):")
scanf("%f",&x)
printf("\n请输入汽油品种(a,b,c):")
scanf(" %c",&y)
printf("\n请输入服务类型(自己加请按1,协助加请按2):")
scanf("%d",&z)
switch(y){
case 'a':
if(z==1) money = x*3.25*0.95
else if(z==2) money = x*3.25*0.9
break
case 'b':
if(z==1) money = x*3*0.95
else if(z==2) money = x*3*0.9
break
case 'c':
if(z==1) money = x*2.75*0.95
else if(z==2) money = x*2.75*0.9
break
default:
printf("输入错误,无法计算\n")
system("pause")
return 0
}
printf("\n应付金额:%f\n",money)
system("pause")
return 0
}
我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围8个方向检查是否存在5子的情况,只需要一个判断方法,而且较为简单。void chooseONE()
{
printf("第一玩家请选择下棋位置\n")
printf("第几个直的\n")
scanf("%d",&co)
printf("第几个横的\n")
scanf("%d",&ro)
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n")
printf("第几个直的\n")
scanf("%d",&co)
printf("第几个横的\n")
scanf("%d",&ro)
}
arr[ro][co]=1
//这里加判断代码,建议用一个判断函数,我给你写个吧
}
//我这里这个方法写了个大概,你看一下和你的代码结合一下就可以了,我用i和j作为for循环的变量,你用来做最大的长宽值,这些你都要改一下。
flag作为判断是否胜利的标志,playerNum是玩家的标志,分1和2,这个函数只写了左和左上的判断,其他方向楼主仿照着写
int win(int row, int col, int playerNum){
int i = 0,j = 0
int flag = 1
if(row - 4 >= 0){
flag = 1
for(i = rowi >= 0i--){
if(arr[i][j] != playerNum){
flag = 0
break
}
}
if(flag == 1){
return 1
}
}
if(row - 4 >= 0 &&col - 4 >= 0){
flag = 1
for(i = row ,j = col i >= 0&&j>=0i--,j--){
if(arr[i][j] != playerNum){
flag = 0
break
}
}
if(flag == 1){
return 1
}
}
}