写一个三子棋小游戏的感悟

在写之前,我已经把函数的结构设计出来,主要由以下几个函数实现;

1:初始化棋框

2:玩家下棋

3:电脑下棋

4:判断胜负

5:更新棋框

6:主函数

在写的过程中碰到了不能将玩家下的位置放入棋框中,原因是在函数定义过程中没有将二维数组引入,

导致棋框更新不正确,在函数中引用二维数组时,因为c语言编译系统不检查第一维的大小,只要第二维大小相同,形参数组第一维可以与实参不同,因此在函数定义时只需要写int qk(arr[][i]),i为常数,在主函数调用时只需要写qk(arr)即可,因为数组名本身就是地址,所以就相当于将arr[0][0]的地址传给函数,所以在函数中可以直接改变数组的内容。源码如下:

//三子棋

#define _CRT_SECURE_NO_WORNINGS 1

#include<stdio.h>

#include<stdlib.h>

void qk(int i, int j,char arr[][3])

{

for (i = 0; i < 3; i++)

{

for (j = 0; j < 3; j++)

{

arr[i][j] = ' ';

}

}

for (i = 0; i < 3; i++)

{

printf(" %c| %c| %c", arr[i][0], arr[i][1], arr[i][2]);

if (i < 2)

{

printf("\n__|__|__\n");

}


}

printf("\n****************************\n");

}

void print(int i, int j, char arr[][3])

{

for (i = 0; i < 3; i++)

{

printf(" %c| %c| %c", arr[i][0], arr[i][1], arr[i][2]);

if (i < 2)

{

printf("\n__|__|__\n");

}


}

printf("\n***************************\n");

}

void  play(int i,int j,char arr[][3])

{

     printf("请输入棋子坐标");

while (1)

{

       int m = 0, n = 0;

       scanf_s("%d%d", &m, &n);

i = m - 1;

j = n - 1;

if ((arr[i][j] != 'o')&&(arr[i][j] != 'x'))

{

arr[i][j] = 'o';

break;

}

else

printf("请重新输入");

}

}

 int  comp(int i,int j,char arr[][3])

{

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

if (arr[i][j] != 'o'&&arr[i][j] != 'x')

{

arr[i][j] = 'x';

return 0;

}

}

printf("************************");

}

return 1;

}

 int judge(int i, int j,char arr[][3])

 {

  for (i = 0; i < 3; i++)

  {

  if (arr[i][0] == 'o'&&arr[i][1] == 'o' && arr[i][2] == 'o')

  {

  printf("您赢了\n");

  return 0;

  }

  if (arr[i][0] == 'x'&&arr[i][1] == 'x' && arr[i][2] == 'x')

  {

  printf("您输了\n");

  return 0;

  }

  if (arr[0][i] == 'o'&&arr[1][i] == 'o' && arr[2][i] == 'o')

  {

  printf("您赢了\n");

  return 0;

  }

  if (arr[0][i] == 'x'&&arr[1][i] == 'x' && arr[2][i] == 'x')

  {

  printf("您输了\n");

  return 0;

  }

 

  }

  if ((arr[0][0] == 'o'&&arr[1][1] == 'o' && arr[2][2] == 'o') || (arr[0][2] == 'o'&&arr[1][1] && arr[2][0]))

  {

  printf("您赢了\n");

  return 0;

  }

  if ((arr[0][0] == 'x'&&arr[1][1] == 'x' && arr[2][2] == 'x') || (arr[0][2] == 'x'&&arr[1][1]=='x' && arr[2][0]=='x'))

  {

  printf("您输了\n");

  return 0;

  }

  return 1;

 }

int main()

{

char arr[3][3];

int i = 3, j = 3;

int ret;

qk(i, j, arr);//初始化棋框

while (1)

{

play(i, j, arr);

print(i, j, arr);

ret=judge(i, j, arr);

if (ret == 0)

{

printf("游戏结束");

break;

}

comp(i, j, arr);

print(i, j, arr);

ret=judge(i, j, arr);

if (ret == 0)

{

printf("游戏结束");

break;

}

}

system("pause");

return 0;

}

过几天继续写,今天的水平有限,希望大神提出问题。。

本文出自 “qin-wang” 博客,请务必保留此出处http://10810196.blog.51cto.com/10800196/1709661

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值