三子棋(井字棋),說沒玩過的都沒童年
阿新 • • 發佈:2018-11-10
這裡我建立了一個“三子棋”的專案,裡面有一個頭檔案game.h和兩個原始檔text.c 、game.c。
- "text.c":text.c原始檔放的是main函式,選單列印menu函式和一個遊戲game函式;
#include "game.h" void menu() { printf("**************************\n"); printf("*** 1.game ***\n"); printf("*** 0.exit ***\n"); printf("**************************\n"); } void game() { int ret = 0; char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); do { ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'P') { if (ret == 'O') { printf("電腦贏!\n"); } if (ret == 'X') { printf("玩家贏!\n"); } if (ret == 'Q') { printf("平局!\n"); } break; } PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'P') { if (ret == 'O') { printf("電腦贏!\n"); } if (ret == 'X') { printf("玩家贏!\n"); } if (ret == 'Q') { printf("平局!\n"); } break; } } while (1); } int main() { int input = 0; do { srand((unsigned int)time(NULL)); menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 0: printf("退出遊戲!\n"); break; case 1: game(); break; default: printf("輸入有誤,請重新輸入!\n"); break; } } while (input); system("pause"); return 0; }
- "game.c":game.c原始檔放的是game函式中用於實現功能的各種函式:
初始化棋盤InitBoard函式;
展示棋盤DisplayBoard函式;
電腦走棋ComputerMove函式;
玩家走棋PlayerMove函式;
判斷棋盤是否滿IsFull函式;
判斷遊戲結果IsWin函式;
#include"game.h"
//定義棋盤
void InitBoard(char board [ROW][COL], int row, int col)
{
//int i = 0;
//int j = 0;
//for (i = 0; i < row; i++)
//{
// for (j = 0; j < col; j++)
// {
// board[i][j] = ' ';
// }
//}
memset(&board[0][0], ' ', row*col * sizeof(board[0][0]));
}
//展示棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (col - 1 > j)
{
printf("┃");
}
}
printf("\n");
if (row - 1 > i)
{
for (j = 0; j < col; j++)
{
printf("━━━");
if (col - 1 > j)
{
printf("┃");
}
}
printf("\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦走:>\n");
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == ' ')
{
board[i][j] = 'O';
break;
}
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>\n");
while (1)
{
int x = 0;
int y = 0;
printf("請輸入座標:");
scanf("%d%d", &x, &y);
if (x < 1 || x > row || y < 1 || y > col)
{
printf("輸入座標錯誤,請重新輸入!\n");
}
else
{
if (board[x-1][y-1] == ' ')
{
board[x-1][y-1] = 'X';
break;
}
else
{
printf("輸入的座標應經被佔用,請重新輸入!\n");
}
}
}
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;//未滿
}
}
}
return 1;//滿
}
char IsWin(char board[ROW][COL], int row, int col)
{
//電腦贏 'O'
//玩家贏 'X'
//平局 'Q'
//遊戲繼續 'P'
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (j = 0; j < row; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[i][0];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
if (IsFull(board, ROW, COL) == 1)
{
return 'Q';
}
else
{
return 'P';
}
}
- "game.h":game.c原始檔放的是game函式中用於實現功能的各種函式;
//#pragma once
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void InitBoard(char board[ROW][COL], int row, int col);//初始化棋盤
void DisplayBoard(char board[ROW][COL], int row, int col);//展示棋盤
void ComputerMove(char board[ROW][COL], int row, int col);//電腦走棋
void PlayerMove(char board[ROW][COL], int row, int col);//玩家走棋
int IsFull(char board[ROW][COL], int row, int col);//棋盤是否滿(滿1,未滿0)
char IsWin(char board[ROW][COL], int row, int col);//判斷遊戲結果(//電腦贏 'O' //玩家贏 'X'
//平局 'Q' //遊戲繼續 'P')
#endif //__GAME_H__