【C语言---Chess】超级无敌简易的三子棋

刚学习C语言时的代码,相当粗糙,代码风格也差,函数命名不规范

4.30日对排版进行重新编辑:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//使用时间戳时要加头文件

菜单界面:

//创建命令行版本的菜单
int Menu()
{
	 printf("=================\n");
	 printf("1.开始游戏\n");
	 printf("0.结束游戏\n");
	 printf("=================\n");
	 printf("请输入您的选择:\n");
	 int choice = 0;
	 scanf("%d", &choice);
	 return choice;
}

//用宏定义的好处在于便于以后修改
#define maxhang 3

#define maxlie 3

char qipan[maxhang][maxlie];

初始化函数:


void init()
{
	 for (int hang = 0; hang <maxhang; ++hang)
	 {
		  for (int lie = 0; lie < maxlie; ++lie)
		  {
			   qipan[hang][lie] = ' ';
		  }
	 }
	 //设置随机数种子
	 srand((unsigned int) time(0));//unsigned int 要括起来,整体性
}

打印棋盘:

void print()
{
	 for (int hang = 0; hang < maxhang; ++hang)
	 {
		  printf("| %c | %c | %c |\n", qipan[maxhang][0],
		  qipan[maxhang][1], qipan[maxhang][2]);
		  if (hang != maxhang-1)//最后一行,不打印---
		  {
			   printf("|---|---|---|\n");
		  }
	 }
}

玩家行动:


void wanjiaxingdong()
{
	 while (1)
	 {
		  printf("请玩家落子(hang lie):");
		  int hang = 0;
		  int  lie = 0;
		  scanf("%d %d", &hang, &lie);
		  //检查用户输入的坐标是否合法
		  //尽量把每种异常情况都考虑到
		  //最大行列为3,下标最大为2,等于3也是非法
		  if (hang < 0 || hang >= maxhang || lie < 0 || lie >= maxlie)
		  {
			   printf("您输入的坐标非法!请重新输入~\n");
			   continue;//跳过此步,重新循环
		  }
		  if (qipan[hang][lie] != ' ')
		  {
			   printf("此位置已被占用!请重新输入~");
			   continue;
		  }
		  //如果玩家的输入合法,那么棋盘的' '变为'x'
		  qipan[hang][lie] = 'x';
		  break;//玩家落子成功,则循环结束
	 }
	 printf("玩家落子完毕!~\n");
}

电脑行动:

void diannaoxingdong()
{
	 printf("电脑落子!\n");
	 while (1)
	 {
		  int hang = rand() % 3;//生成0-2的随机数
		  int  lie = rand() % 3;
		  if (qipan[hang][lie] != ' ')
		  {
			   continue;//如果电脑落子的位置被占用,重生成随机数
		  }
		  qipan[hang][lie] = 'o'; //如果电脑落子位置没被占用, 修改状态为'o';
		  break;
	 }
	 printf("电脑落子完毕!\n");
}

检测是否平局:

//胜利的条件是行或列或对角线连成一条线
//判断是'x' 还是'o'
//平局是'h' 未分胜负是' '

int pingju()//棋盘已满,未分胜负为平局
{
	 //查看棋盘是否已满,用数组遍历
	 for (int hang = 0; hang < maxhang; ++hang)
	 {
		  for (int lie = 0; lie < maxlie; ++lie)
		  {
			   if (qipan[hang][lie]==' ')
			   {
				    return 0;//棋盘未满
			   }
		  }
	 }
	 return 1;//两重循环结束没有找到空格,返回1
}

检测是否胜利:

char shifoushengli()
{
	 for (int hang = 0; hang < maxhang; ++hang)
	 {
		  if (qipan[hang][0] == qipan[hang][1] &&
		   qipan[hang][0] == qipan[hang][2])
		  {
			   return qipan[hang][0];//通过返回的值是'x' 还是'o' 判断哪方获胜
		  }
	 }
	 for (int lie = 0; lie < maxlie; ++lie)
	 {
		  if (qipan[0][lie] == qipan[1][lie] &&
		   qipan[0][lie] == qipan[2][lie])
		  {
			   return qipan[0][lie];
		  }
	 }
	 //两条对角线0.0 1.1 2.2 / 0.2 1.1 2.0
	 if (qipan[0][0] == qipan[1][1] && qipan[0][0] == qipan[2][2])
	 {
		  return qipan[0][0];
	 }
	 if (qipan[0][2] == qipan[1][1] && qipan[0][2] == qipan[2][0])
	 {
		  return qipan[0][2];
	 }
	 if (pingju())
	 {
		  return 'h';//棋盘满胜负未分,表示平局
	 }
	 return ' ';//棋盘未满胜负未分,接着下
}

游戏执行:

void Game()
{
	 //1.初始化棋盘
	 init();
	 char huosheng = ' ';
	 while (1)
	 {   //打印棋盘
		  print();
 	     //2.玩家落子
		  wanjiaxingdong();
	     //3.检测胜负
		  huosheng = shifoushengli();
		  if (huosheng != ' ')//等于' ' 说明胜负未分,继续执行
		  {
			   break;//不等于' ' 说明胜负已分,跳出循环
		  }
	     //4.电脑落子
		  diannaoxingdong();
	     //5.检测胜负
		  huosheng = shifoushengli();
		  if (huosheng != ' ')
		  {
			   break;
		  }
	 }
	 print();
	 if (huosheng == 'x')
	 {
		  printf("恭喜您获胜!\n");
	 }
	 else if (huosheng == 'o')
	 {
		  printf("很遗憾,您输了!\n");
	 }
	 else if (huosheng == 'h')
	 {
		  printf("平局!\n");
	 }
}

主函数:

int main()
{
	 while (1)
	 {
		  int choice = Menu();
		  if (choice == 1)
		  {
			   Game();
		  }
		  else if (choice == 0)
		  {
			   printf("GoodBye!\n");
		  }
		  else printf("您的输入有误!\n");
	 }
	system("pause");
	return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构习题:已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编写程序读入某一时刻下棋的状态,并判断是否有人即将获胜,即:同一颜色的棋子在同一条横行、纵列或斜线上连成4个棋子,且该4个棋子的两端至少有一端为空位置。 输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵列或斜线上连成的棋子个数不会超过4个,并且最多有一人连成线的棋子个数为4。 【输入形式】 从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。 【输出形式】 若有人即将获胜,则先输出即将获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成4个棋子连线的起始位置(棋盘横行自上往下、纵列自左往右从1开始计数,横行最小的棋子在棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋子位置作为起始位置,两数字之间以一个英文逗号,作为分隔符)。 若没有人获胜,则输出英文字符串:No。 无论输出什么结果,最后都要有回车换行符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值