想要完成简易版三子棋预备知识有:分支与循环,函数,数组,vs等编译器的运用。
以下代码环境是vs2022。
准备好了嘛?好哒,接下来开始学写吧!
第一步:建立一个空项目后,建立一个头文件game.h,再建立两个源文件game.h 和test.h。
game.h是为了声明所有函数,test.c是为了测试及实现游戏,game.c是将所有函数存放在这里。分成三个文件易于修改,阅读。
第二步:在game.h中写出所需所有库函数和声明所用的函数。
#pragma once//防止宏名相同出错,具体可查csdn搜其作用
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//电脑下棋生成随机数时使用
#define HANG 3
#define LIE 3
void qipan(char b[HANG][LIE], int hang, int lie);//初始化二维数组(棋盘),使其每一个值都是空格
void xianshiqipan(char b[HANG][LIE], int hang, int lie);//显示落棋后的棋盘
void wanjiaxiaqi(char b[HANG][LIE], int hang, int lie);//玩家下棋
int meiman(char b[HANG][LIE], int hang, int lie);//判断棋盘没有满
void diannaoxiaqi(char b[HANG][LIE], int hang, int lie);//电脑下棋
char shifouying(char b[HANG][LIE], int hang, int lie);//判断是否有一方获胜
第三步:在test.c中写出框架。
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("**********************\n");
printf("*********1.play*******\n");
printf("*********0.exit*******\n");
printf("******玩家棋子“*”***\n");
printf("******电脑棋子“#”***\n");
}
void game()
{
char b[HANG][LIE] = { 0 };
qipan(b, HANG, LIE);
xianshiqipan(b, HANG, LIE);
while (shifouying(b, HANG, LIE)=='k')
{
wanjiaxiaqi(b, HANG, LIE);
printf("电脑下棋\n");
diannaoxiaqi(b, HANG, LIE);
}
if (shifouying(b, HANG, LIE) == '*')
{
printf("祝贺玩家胜利!\n");
}
else if (shifouying(b, HANG, LIE) == '#')
{
printf("电脑胜利!\n");
}
else
{
printf("平局!\n");
}
}
int main()
{
srand((unsigned int)time(NULL));//生产随机数使用
char b[HANG][LIE] = { 0 };
int n=0;
do
{
menu();
printf("请选择:");
scanf("%d", &n);
switch (n)
{
case 1:
game(); break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n"); break;
}
} while (n);
}
第四步:在game.c中逐个完成函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void qipan(char b[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
b[i][j] = ' ';
}
}
}
void xianshiqipan(char b[HANG][LIE], int hang, int lie)
{
int i=0;
for (i = 0; i < hang; i++)
{
int j = 0;
for (j = 0; j < lie; j++)
{
printf(" %c ", b[i][j]);
if (j < lie-1)
{
printf("|");
}
}
printf("\n");
if (i < hang-1)
{
int j = 0;
for (j = 0; j < lie; j++)
{
printf("---");
if (j < lie - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
int meiman(char b[HANG][LIE], int hang, int lie)
{
int i=0, j=0,flag=0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
if (b[i][j] == ' ')
{
flag = 1;
}
}
}
return flag;
}
void wanjiaxiaqi(char b[HANG][LIE], int hang, int lie)
{
int x, y;
printf("请输入落棋位置,例2 2:");
scanf("%d %d", &x, &y);
x--;
y--;
while (x >= 3 || y >= 3 || x<0||y<0)
{
printf("输入错误,请重新输入:");
scanf("%d %d", &x, &y);
x--;
y--;
}
if(x < 3 && y < 3)
{
while (b[x][y] != ' ')
{
printf("该位置已有棋子,请重新输入:\n");
scanf("%d %d", &x, &y);
x--;
y--;
}
if (b[x][y] == ' ')
{
b[x][y] = '*';
xianshiqipan(b, HANG, LIE);
}
}
}
void diannaoxiaqi(char b[HANG][LIE], int hang, int lie)
{
int i,j;
i = rand() % 2;
j = rand() % 2;
while(b[i][j] != ' ')
{
i = rand() % 2;//生成随机数
j = rand() % 2;
}
b[i][j] = '#';
xianshiqipan(b, HANG, LIE);
}
char shifouying(char b[HANG][LIE], int hang, int lie)
{
int i, j;
for (i = 0; i < hang; i++)//有一行相同
{
if (b[0][i] == b[1][i] && b[1][i] == b[2][i] && b[0][i] != ' ')
{
if (b[0][i] == '*')
return '*';
else
return '#';
}
}
for (i = 0; i < lie; i++)//有一列相同
{
if (b[i][1] == b[i][2] && b[i][0] == b[i][1] && b[i][0] != ' ')
{
if (b[i][0] == '*')
return '*';
else
return '#';
}
}
if (b[0][0] == b[1][1] && b[1][1] == b[2][2] && b[0][0] != ' ')
{
if (b[0][0] == '*')
return '*';
else
return '#';
}
if (b[0][2] == b[1][1] && b[1][1] == b[2][0] && b[1][1] != ' ')
{
if (b[1][1] == '*')
return '*';
else
return '#';
}
if (!meiman(b, HANG, LIE))//此时棋盘满了
{
return 'p';
}
return 'k';
}
第五步:调试,测试是否出现预期结果。
如果有什么建议或疑问可以私信我哦!也可以直接评论,我会尽量解答哒!一起加油!