欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]C语言写五子棋。

[原创]C语言写五子棋。

过程:
昨天下午开始看c入门经典,数组那一章课后题是写个验证3线直连的小游戏。跟五子棋的游戏差不多只不过是3x3的。然后开始入手,觉得直接写个五子棋。
下午到晚上下班还有点问题,今天早上解决了几个bug,但是还有一个bug一直不知道怎么解决。
比如让用户输入数字如5,但是用户输入的不是数字的字符,如果下面代码有循环就会直接运行循环了,这个问题很郁闷。
自己第一次写这么多代码,棋局的构建和判断五子棋连线的方法也是自己研究出来的,每个棋子验证八个方向, 左上,右上,左下,右下,左横,右横,上竖,下竖。然后各种想办法利用c语言的数组来存储用户输入。当然中间遇到了很多问题。
感悟:
编写下来 真的发现,自己原来也可以写出来这样的代码,很多事情光想想不去做永远就想把,更何况是编程了。在自己动手的过程中遇到太多的问题了,自己都独立解决了,也没有百度Google。
其实这个程序也不完善,以后学了界面,再写一个完善的。有选择难度,选择棋子形状,重新开局。
当时想加入重新开局的功能,除了清空user数组外,还要重建c数组,自己想了很多办法,最后都不能实现,实现了user数组清空,但是c字符数组还是没办法实现完美的还原棋局。 还是等以后学了界面再好好搞一个完善的。
重中之重:
如果写代码量大一点的话,变量命名,必要的注释和代码规范的确万分重要再重要再万分重要啊。
要不然到最后自己都看晕了。更何况别人了。
看到论坛上的大牛每天讨论的都是汇编,r0,hook, 我只能看看。默默的努力吧。
现在自学c,想着C ,以后的目标 C++  数据结构  Win32  Hook >>>>汇编 逆向  破解 >>>>驱动开发  Rootkit >>>MAKE Money而立之年>>>>告老还乡。
虽然很多只是听说,但慢慢积累,打好基础,向以后的那些知识拼搏。
欢迎吐槽。。。。。

/*

c语言编写五子棋,暂时没有加入难度控制和重新开局功能。

*/

#include <stdio.h>

#include <Windows.h>//使用system("cls");

int main(void)

{

	int user[9][9]={0};//判断玩家1玩家2数组

	int line=9;//棋盘大小

	int count=0;//玩家轮流循环下棋次数

	int a=0,b=0;//构建棋局计数

	int d=0,e=0;//加载数组棋局计数

	int num1=0,num2=0;//用户输入棋盘如 5 5

	int hang_zong=2*line;//构建棋局行总数

	int lie_zong=hang_zong*2+1;//构建棋局列总数

	char c[19][39]={' '};//hang_zong+1,lie_zong+3   18  37棋局字符数组

	char gamestart=0;//接受用户是否开始游戏字符

	c[18][2]='1';//为了cls后有1,2,3,4,5。,。。 当然这样写比较尴尬。

	c[18][6]='2';

	c[18][10]='3';

	c[18][14]='4';

	c[18][18]='5';

	c[18][22]='6';

	c[18][26]='7';

	c[18][30]='8';

	c[18][34]='9';

	c[0][38]='1';

	c[2][38]='2';

	c[4][38]='3';

	c[6][38]='4';

	c[8][38]='5';

	c[10][38]='6';

	c[12][38]='7';

	c[14][38]='8';

	c[16][38]='9';

    system("color 70");

	for(a=0;a<hang_zong;a++)//构建棋局,赋值数组。

	{

		if ( a%2 ==0 ){//a等于偶数,字符为|   奇数__| 同时赋值c字符数组

			for(b=0;b<lie_zong;b++){

				if(b%4==0 ){//b等于0和4的倍数,字符为|  否则为空格‘ ’ 同时赋值c字符数组

					printf("|");

				   c[a][b]='|';

				}

				else {

					printf(" ");

				    c[a][b]=' ';

				}

			}

			printf("%2d\n",a/2+1);//行计数

		 }

		else{

			for(b=0;b<lie_zong;b++){

				if(b%4==0){

					printf("|");

					c[a][b]='|';

				}

			   else {

					printf("_");

					c[a][b]='_';

				}

			 }

		  printf("\n");

		}

	}

	for(a=0;a<lie_zong-1;a++)//列计数输出1,2,3,4,。。。。。

	{

		if(a%4==0)

			printf(" %2d ",a/4+1);

	}

	printf("\n五子棋游戏玩法:\n输入2 9回车代表在第2行第9个框里下棋\t输入5 5回车代表在第5行第5个框里下棋。\n\n玩家1用\"X\"表示\t\t玩家2用\"#\"表示\t\t每次输入后更换选手进行下棋。\nLet's GO!!!!");

game:

	printf("\t\t\t按Y键开始游戏。");

	scanf("%c",&gamestart);

if(gamestart=='y' || gamestart == 'Y')

{

  // 开始游戏

  while(count<=line*line)//进行81次交换输入

  {

	  system("cls");

	  for(d=0;d<hang_zong+1;d++)//加载c字符数组

	  {

		  for(e=0;e<lie_zong+2;e++)

			  printf("%c",c[d][e]);

		  printf("\n");

	  }

	  printf("\n玩家1 X 请下棋:");

     agine1:

	  scanf("%d %d",&num1,&num2);

		  if (user [num1-1][num2-1] ==0)

	  {

		  c[2*num1-2][4*num2-3]='X';

		  user[num1-1][num2-1]=1;

		  system("cls");//当用户输入实时加载当前棋盘

		  for(d=0;d<hang_zong+1;d++)

		  {

			  for(e=0;e<lie_zong+2;e++)

				  printf("%c",c[d][e]);

			  printf("\n");

		  }

	  }

	  else{

		  printf("\nERROR:输入的位置已经有棋子\n玩家1 X 请重新输入:");

	      goto agine1;

	  }

////////////////////////////////////////////////

	  //下面为核心计算是否形成5子。  左上,右上,左下,右下,左横,右横,上竖,下竖。 有点迷,慢慢看。

	  //////////////GO GO!!!!!!!

		  if(num1<=(line/2+1) && user[num1][num2]==1)//检查是否超出数组范围,然后检测右下是否形成5子

		  {

			  if( user[num1+1][num2+1]==1 )

			  {

				  if ( user[num1+2][num2+2]==1 )

				  {

					  if ( user[num1+3][num2+3] ==1)

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if( num1>=(line/2+1) && user[num1-2][num2-2]==1 ) //检查是否超出数组范围,然后检测左上是否形成5子

		  {

			  if( user[num1-3][num2-3]==1 )

			  {

				  if ( user[num1-4][num2-4]==1 )

				  {

					  if ( user[num1-5][num2-5]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if(num2>=(line/2+1) && user[num1][num2-2] ==1)//检查是否超出数组范围,然后检测左下是否形成5子

		  {

			  if( user[num1+1][num2-3]==1 )

			  {

				  if ( user[num1+2][num2-4]==1 )

				  {

					  if ( user[num1+3][num2-5] ==1)

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if( num2<=(line/2+1) && user[num1-2][num2]==1 ) //检查是否超出数组范围,然后检测右上是否形成5子

		  {

			  if( user[num1-3][num2+1]==1 )

			  {

				  if ( user[num1-4][num2+2]==1 )

				  {

					  if ( user[num1-5][num2+3]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if(num2<=(line/2+1) && user[num1-1][num2]==1 )//检查是否超出数组范围,然后检测右横是否形成5子

		  {

			  if( user[num1-1][++num2+1]==1 )

			  {

				  if ( user[num1-1][num2+2]==1 )

				  {

					  if ( user[num1-1][num2+3]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if( num2>=(line/2+1) && user[num1-1][num2-2]==1 ) //检查是否超出数组范围,然后检测左横是否形成5子

		  {

			  if( user[num1-1][num2-3]==1 )

			  {

				  if ( user[num1-1][num2-4] ==1)

				  {

					  if ( user[num1-1][num2-5]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

			  if(num1>=(line/2+1) && user[num1-2][num2-1]==1 )//检查是否超出数组范围,然后检测上竖是否形成5子

		  {

			  if( user[num1-3][num2]-1==1 )

			  {

				  if ( user[num1-4][num2-1]==1 )

				  {

					  if ( user[num1-5][num2-1]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

		  if( num2<=(line/2+1) && user[num1][num2-1]==1 ) //检查是否超出数组范围,然后检测下竖是否形成5子

		  {

			  if( user[num1+1][num2-1] ==1)

			  {

				  if ( user[num1+2][num2-1] ==1)

				  {

					  if ( user[num1+3][num2-1]==1 )

					  {

						  printf("恭喜玩家1X取得胜利!!!!\n按回车键结束");

						  getchar();

						  getchar();

						  return 0;

					  }

				  }

			  }

		  }

//玩家2

		  printf("\n玩家2#请下棋:");

agine2:

		  scanf("%d %d",&num1,&num2);

		  if (user [num1-1][num2-1] ==0)

		  {

			  c[2*num1-2][4*num2-3]='#';

			  user[num1-1][num2-1]=2;

			  system("cls");

			  for(d=0;d<hang_zong+1;d++)//加载c字符数组

			  {

				  for(e=0;e<lie_zong+2;e++)

					  printf("%c",c[d][e]);

				  printf("\n");

			  }

		  }

		  else{

			  printf("\nERROR:输入的位置已经有棋子\n玩家2#请重新输入:");

			  getchar();

		      goto agine2;

		  }

			  if(num1<=(line/2+1) && user[num1][num2]==2 )//检查是否超出数组范围,然后检测右下是否形成5子

			  {

				  if( user[num1+1][num2+1]==2 )

				  {

					  if ( user[num1+2][num2+2] ==2)

					  {

						  if ( user[num1+3][num2+3]==2 )

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

			  if( num1>=(line/2+1) && user[num1-2][num2-2]==2 ) //检查是否超出数组范围,然后检测左上是否形成5子

			  {

				  if( user[num1-3][num2-3] ==2)

				  {

					  if ( user[num1-4][num2-4]==2 )

					  {

						  if ( user[num1-5][num2-5] ==2)

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

			  if(num2>=(line/2+1) && user[num1][num2-2]==2 )//检查是否超出数组范围,然后检测左下是否形成5子1111111111111111111111111111111111111111111111111111111111

			  {

				  if( user[num1+1][num2-3]==2 )

				  {

					  if ( user[num1+2][num2-4]==2 )

					  {

						  if ( user[num1+3][num2-5]==2 )

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

		    if( num2<=(line/2+1) && user[num1-2][num2] ==2 ) //检查是否超出数组范围,然后检测右上是否形成5子

			  {

				  if( user[num1-3][num2+1]==2 )

				  {

					  if ( user[num1-4][num2+2] ==2)

					  {

						  if ( user[num1-5][num2+3]==2 )

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

			  ///////////////////////////////////

			  if(num2<=(line/2+1) && user[num1-1][num2]==2 )//检查是否超出数组范围,然后检测右横是否形成5子

			  {

				  if( user[num1-1][++num2+1]==2 )

				  {

					  if ( user[num1-1][num2+2]==2 )

					  {

						  if ( user[num1-1][num2+3]==2 )

							 {

								 printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

								 getchar();

								 getchar();

								 return 0;

						  }

					  }

				  }

			  }

			  if( num2>=(line/2+1) && user[num1-1][num2-2]==2 ) //检查是否超出数组范围,然后检测左横是否形成5子

			  {

				  if( user[num1-1][num2-3] ==2)

				  {

					  if ( user[num1-1][num2-4]==2 )

					  {

						  if ( user[num1-1][num2-5]==2 )

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

			  if(num1>=(line/2+1) && user[num1-2][num2-1]==2 )//检查是否超出数组范围,然后检测上竖是否形成5子

			  {

				  if( user[num1-3][num2-1]==2 )

				  {

					  if ( user[num1-4][num2-1]==2 )

					  {

						  if ( user[num1-5][num2-1]==2 )

							 {

								 printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

								 getchar();

								 getchar();

								 return 0;

						  }

					  }

				  }

			  }

			  if( num2<=(line/2+1) && user[num1][num2-1]==2 ) //检查是否超出数组范围,然后检测下竖是否形成5子

			  {

				  if( user[num1+1][num2-1]==2 )

				  {

					  if ( user[num1+2][num2-1]==2 )

					  {

						  if ( user[num1+3][num2-1]==2 )

						  {

							  printf("恭喜玩家2#取得胜利!!!!\n按回车键结束");

							  getchar();

							  getchar();

							  return 0;

						  }

					  }

				  }

			  }

			  count++;

    }

  }

  else 

  {

	  printf("ERROR,请重新输入。\n");

	  getchar();

	  goto game;

}

    getchar();

	getchar();

	return 0;

}


[图片:1415427203x-1425050556.png]
[图片:1415427939x-1425050556.png]

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功