吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 884|回复: 7
收起左侧

[求助] C语言如果没有学过指针,这个代码还能简化吗?

[复制链接]
guanguanjujiu 发表于 2021-1-23 17:51
[C] 纯文本查看 复制代码
#include <stdio.h>

int main(){
	int x,y;
	int xy[3][3]={
		{8,8,8},
		{8,8,8},
		{8,8,8},
	};
	int i=2;
	printf("  1 2 3\n\n1 %d|%d|%d\n  -----\n2 %d|%d|%d\n  -----\n3 %d|%d|%d\n",xy[0][0], xy[0][1], xy[0][2], xy[1][0], xy[1][1], xy[1][2], xy[2][0], xy[2][1], xy[2][2]);//排出井字棋
	while(i==2){
		const int SIZE = 3;
		int t,j;
		int hz,hf,lz,lf,zdjz,zdjf,fdjz,fdjf; //定义行,列,对角线的正反方计数变量 
		hz=hf=lz=lf=zdjz=zdjf=fdjz=fdjf=0;//初始化变量 
		
		//输入 
		
		do{
			printf("正方,请在8的区域输入:"); 
			scanf("%d,%d", &x, &y);
		} while(xy[x-1][y-1]!=8 || x>3 || x<1 || y>3 || y<1 );//检查
		
		xy[x-1][y-1]=1; //1为正方 
		printf("  1 2 3\n\n1 %d|%d|%d\n  -----\n2 %d|%d|%d\n  -----\n3 %d|%d|%d\n",xy[0][0], xy[0][1], xy[0][2], xy[1][0], xy[1][1], xy[1][2], xy[2][0], xy[2][1], xy[2][2]);//排出井字棋
		
		//循环判断 
		for(t=0; t<SIZE; t++){
			hz=lz=0;
			for(j=0; j<SIZE; j++){ 
				//检查行 
				if(xy[t][j]==1 && xy[t][j]!=8){
					hz++;
				}
				if(hz==3){
					i=1;
					goto out; 
				}
				//检查列 
				if(xy[j][t]==1 && xy[j][t]!=8){
					lz++;
				}
				if(lz==3){
					i=1;
					goto out; 
				}
			}
			//检查正对角线
			if(xy[t][t]==1 && xy[t][t]!=8){
			zdjz++;
			}
			if(zdjz==3){
				i=1;
				goto out; 
			}
			//检查反对角线 
			if(xy[t][SIZE-t-1]==1 && xy[t][SIZE-t-1]!=8){
				fdjz++;
			}
			if(fdjz==3){
				i=1;
				goto out; 
			}
		}
//		printf("hz:%d,lz:%d,zdjz:%d,fdjz:%d\n\n",hz,lz,zdjz,fdjz);
		do{
			printf("反方,请在8的区域输入:");
			scanf("%d,%d", &x, &y);
		} while(xy[x-1][y-1]!=8 || x>3 || x<1 || y>3 || y<1 );//检查 
		
		xy[x-1][y-1]=0;//0为反方 
		printf("  1 2 3\n\n1 %d|%d|%d\n  -----\n2 %d|%d|%d\n  -----\n3 %d|%d|%d\n",xy[0][0], xy[0][1], xy[0][2], xy[1][0], xy[1][1], xy[1][2], xy[2][0], xy[2][1], xy[2][2]);//排出井字棋 
		
		//循环判断 
		for(t=0; t<SIZE; t++){
			hf=lf=0;
			for(j=0; j<SIZE; j++){ 
				//检查行 
				if(xy[t][j]==0 && xy[t][j]!=8){
					hf++;
				}
				if(hf==3){
					i=0;
					goto out; 
				}
				//检查列 
				if(xy[j][t]==0 && xy[j][t]!=8){
					lf++;
				}
				if(lf==3){
					i=0;
					goto out; 
				}
			}
			//检查正对角线
			if(xy[t][t]==0 && xy[t][t]!=8){
			zdjf++;
			}
			if(zdjf==3){
				i=0;
				goto out; 
			}
			//检查反对角线 
			if(xy[t][SIZE-t-1]==0 && xy[t][SIZE-t-1]!=8){
				fdjf++;
			}
			if(fdjf==3){
				i=0;
				goto out; 
			}
		}
//		printf("hf:%d,lf:%d,zdjf:%d,fdjf:%d\n\n",hf,lf,zdjf,fdjf);

		
	}
out:
	if(i==1){
		printf("正方胜利"); 
	}else{
		printf("反方胜利");
	}
	
	
	return 0;
} 


学的翁恺的C语言入门,现在学到了第六周,第四节二维数组,这里讲到了井字棋,我觉得我可以用之前学过的东西写一个,所以我就写了一个,但是我觉得代码应该还可以用我学的知识进行简化,但是我不知道怎么简化了。。。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| guanguanjujiu 发表于 2021-1-23 17:53
我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。
nj001 发表于 2021-1-23 20:49
B4o 发表于 2021-1-23 21:50
LZ 你好。
其实你可以设置一个变量is_zheng 来判断当前是哪一方下棋,然后做一次操作后 is_zheng = ! is_zheng (或是 is_zheng ^= 1)就可以。
然后你就只需要设置一个while循环来保证游戏的运行即可。
具体可以这样写:
int main(){
    bool is_zheng = 1; // 当前正方下为1,反方为0
    bool is_end = 0; // 游戏是否结束
    while(! is_end){
        //下棋的代码,用is_zheng 来判断当前谁下,下完后取反即可
        //判断是否结束的代码,在其中改一行,若结束就设置 is_end = 1;
    }
        
    //结束输出谁赢的代码
    return 0;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
guanguanjujiu + 1 + 1 热心回复!

查看全部评分

古月不傲 发表于 2021-1-23 22:34
[C] 纯文本查看 复制代码
#include <stdio.h>

const int SIZE = 3;
const int ONE = 1;
const int ZERO = 0;

int x,y;
int xy[3][3]={
	{8,8,8},
	{8,8,8},
	{8,8,8},
};

int playGame(int flag){
	xy[x-1][y-1]=flag; //1为正方 
	printf("  1 2 3\n\n1 %d|%d|%d\n  -----\n2 %d|%d|%d\n  -----\n3 %d|%d|%d\n",xy[0][0], xy[0][1], xy[0][2], xy[1][0], xy[1][1], xy[1][2], xy[2][0], xy[2][1], xy[2][2]);//排出井字棋

	int t,j;
	int hz,hf,lz,lf,zdjz,zdjf,fdjz,fdjf; 
	hz=hf=lz=lf=zdjz=zdjf=fdjz=fdjf=0;
	//循环判断 
	for(t=0; t<SIZE; t++){
		hz=lz=0;
		for(j=0; j<SIZE; j++){ 
			//检查行 
			if(xy[t][j]==flag && xy[t][j]!=8){
				hz++;
			}
			if(hz==3){
				return flag;
			}
			//检查列 
			if(xy[j][t]==flag && xy[j][t]!=8){
				lz++;
			}
			if(lz==3){
				return flag;
			}
		}
		//检查正对角线
		if(xy[t][t]==flag && xy[t][t]!=8){
			zdjz++;
		}
		if(zdjz==3){
			return flag;
		}
		//检查反对角线 
		if(xy[t][SIZE-t-1]==flag && xy[t][SIZE-t-1]!=8){
			fdjz++;
		}
		if(fdjz==3){
			return flag;
		}
	}
	return -1;
}

int main(){
	printf("  1 2 3\n\n1 %d|%d|%d\n  -----\n2 %d|%d|%d\n  -----\n3 %d|%d|%d\n",
			xy[0][0], xy[0][1], xy[0][2], xy[1][0], xy[1][1], xy[1][2], xy[2][0], xy[2][1], xy[2][2]);//排出井字棋

	while(1){
		//输入 
		do
		{
			printf("正方,请在8的区域输入:"); 
			scanf("%d %d", &x, &y);
		} while(xy[x-1][y-1]!=8 || x>3 || x<1 || y>3 || y<1 );//检查
		if (playGame(ONE) == ONE){
			printf("正方胜利\n"); 
			break;
		}

		do{
			printf("反方,请在8的区域输入:");
			scanf("%d %d", &x, &y);
		} while(xy[x-1][y-1]!=8 || x>3 || x<1 || y>3 || y<1 );//检查 
		if (playGame(ZERO) == ZERO){
			printf("反方胜利\n");
			break;
		}
	}

	return 0;
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
guanguanjujiu + 1 + 1 我很赞同!

查看全部评分

古月不傲 发表于 2021-1-23 22:44
guanguanjujiu 发表于 2021-1-23 17:53
我觉得代码里重复的太多,想单独弄个子函数的,可是没学过指针,不知道怎么把整个数组的值传递给子函数。

不需要指针直接定义两个常量判断一下就行
 楼主| guanguanjujiu 发表于 2021-1-24 13:33
B4o 发表于 2021-1-23 21:50
LZ 你好。
其实你可以设置一个变量is_zheng 来判断当前是哪一方下棋,然后做一次操作后 is_zheng = ! is_z ...

谢谢您,您说的这个方法,确实用我所学的知识可以完美实现。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 07:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表