前言
最近学会做三子棋了,从中学到了不少东西。现在把代码分享出来,如果有不足之处,希望指正。
思路
主要的模块有:
玩家下棋
电脑下棋
打印棋盘
判断玩家下棋位置是否合法
判断游戏是否结束
程序运行的一些提示语的处理
我总共分为了三个文件:
头文件
主函数文件
自定义函数文件
遇到的问题
全局变量不能在头文件中定义,这方面了解太少了
判断输赢考虑不周全
对程序的运行没有清晰的逻辑
代码
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 3
#define col 3
void menu();
void game();
void start();
void show();
void playerplay();
void playercheck(int *x, int *y);
void computerplay();
char check();
主函数文件
#include"game.h"
int main() {
srand((unsigned int)time(NULL));
int a = 0;
do {
menu();
printf("请选择:");
scanf("%d", &a);
switch (a) {
case 1:
game();
break;
case 0:break;
default:
printf("请输入正确的选项!");
break;
}
} while (a);
}
自定义函数文件
#include"game.h"
char board[row][col];
void menu() {
printf("******************\n");
printf("******1.plat******\n");
printf("******0.exit******\n");
printf("******************\n");
}
int chance;
void game() {
chance = 9;
start();
show();
while (1) {
playerplay();
show();
if (check() != 'y')
{
if (check() == '*') {
printf("恭喜你赢了!\n");
break;
}
if (check() == '#') {
printf("电脑获胜\n");
break;
}
if (check() == 'e') {
printf("平局\n");
break;
}
}
computerplay();
show();
if (check() != 'y')
{
if (check() == '*') {
printf("恭喜你赢了!\n");
break;
}
if (check() == '#') {
printf("电脑获胜\n");
break;
}
if (check() == 'e') {
printf("平局\n");
break;
}
}
}
}
void start()
{
for(int i=0;i<3;i++)
{
for (int j = 0; j < 3; j++) {
board[i][j] = ' ';
}
}
}
//显示棋盘
void show() {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if(j<col-1)printf("|");
}
printf("\n");
if (i < row - 1) {
for (int j = 0; j < col; j++) {
printf("----");
}
}
printf("\n");
}
}
void playerplay() {
int x, y;
printf("你的回合:\n请输入你要下的坐标:");
scanf("%d %d", &x, &y);
playercheck(x, y);
chance--;
}
void playercheck(int x, int y) {
if (x < 0 || y < 0 || x>row || y>col) {
printf("坐标超出范围!\n");
printf("请重新输入坐标:");
scanf("%d %d", &x, &y);
playercheck(x, y);
}
else if(board[x-1][y-1]=='*'|| board[x - 1][y - 1] == '#')
{
printf("改位置已经被占用!");
printf("请重新输入坐标:");
scanf("%d %d", &x, &y);
playercheck(x, y);
}
else { board[x - 1][y - 1] = '*'; }
}
void computerplay() {
int x, y;
printf("电脑的回合:\n");
do {
x = rand() % 3;
y = rand() % 3;
} while (board[x][y] == '*' || board[x][y] == '#');
board[x][y] = '#';
chance--;
}
char check() {
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1]&& board[i][1] == board[i][2]&& board[i][2] == '#')
return board[i][0];
else if (board[i][0] == board[i][1]&& board[i][1] == board[i][2]&& board[i][2] == '*')
return board[i][0];
else if (board[0][i] == board[1][i]&& board[1][i] == board[2][i]&& board[2][i] == '#')
return board[0][i];
else if (board[0][i] == board[1][i]&& board[1][i] == board[2][i]&& board[2][i] == '*')
return board[0][i];
else if (board[0][0] == board[1][1]&& board[1][1] == board[2][2]&& board[2][2] == '*')
return board[0][0];
else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == '#')
return board[0][0];
else if (board[2][0] == board[1][1]&& board[1][1] == board[0][2]&& board[0][2] == '#')
return board[2][0];
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] == '*')
return board[2][0];
}
if (chance == 0)return'e';
else return 'y';
}