/************************************************************************************
Copyright(c),
FileName: 前 井字棋
Author:某學員 Version 1.0Date:XXX
Description:C語言簡單程序
Version:2.0
Function List:
History:
<Author><time><version>
浪子2015-12-15Ver 1.0
***********************************************************************************
//思路:進入程序先選擇人機 還是人人
//進入後開始畫棋盤,用小鍵盤确定下子位置
//判斷下子情況 開始對戰
//AI編寫
//變顔色永遠是重點
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include "nanhu.h"
//定義變量
int P_RowMax = 10;
int P_ColMax = 16;
int Games[3][3];//棋盤
int iPlayer;//當前 0 1 2 3 11 12 13//人人和局6,人機和局7
int GameType;//0人機先手,1人機後手,2人人,
void TitleTop3Line();//遊戲标題
void ShowFirstView();//顯示選擇目錄
void DrawTable();//畫表格
void DrawTableCell(int);//畫單元格
BOOL is_PressOk(int, int AndP = 1);//判斷當前選擇是否可以
int is_Over(int);//判斷遊戲是否結束
void CleanGame();//清空棋盤
void EasyAI();
void main()
{
int iKeyWord;//獲得的按鍵數字
int iKeyError = 10;//允許10次出錯
int iPlayFirst = 1;//1,3 電腦或者玩家1
srand((unsigned)time(NULL));
STEP1://狀态進入目錄
//進入界面,選擇對戰目錄
ShowFirstView();//選擇目錄
scanf("%d", &GameType);//獲取
if (GameType == 2)
{
iPlayFirst = 1;//選擇玩家1先手
}
else if (GameType == 1)
{
iPlayFirst = 3;//選擇電腦AI先手
}
else
{
iPlayFirst = 1;//選擇玩家1先手
}
//開始對戰
//畫棋盤,提示下子
//initTableAndGames();
STEP2://狀态開始遊戲
CleanGame();//清空
iPlayer = iPlayFirst;//默認玩家1開始
while (1)//死循環
{
STEP3://狀态運行中
DrawTable();//畫棋盤
if (iPlayer == 1 || iPlayer == 2)//玩家
{
scanf("%d", &iKeyWord);//獲取輸入數字
if (!is_PressOk(iKeyWord))//無效位置
{
iKeyError--;
if (iKeyError > 0)
goto STEP3;//正常出錯
else
{//超負荷出錯
iKeyError = 10;
goto STEP8;
}
}
}
else if (iPlayer == 3)//電腦
{
EasyAI();
}
if (!is_Over(iPlayer))//如果未結束
{
if (iPlayer == 1)
{
iPlayer = 2;
if (GameType != 2)
{
iPlayer = 3;
}
}
else
{
iPlayer = 1;
}
}
else
{
iPlayer = is_Over(iPlayer);
DrawTable();
goto STEP10;
}
printf("");
}STEP8://輸入連續錯誤,就不玩
my_RED;
printf("\n");
printf("多次輸入出錯,遊戲結束\n");
printf("\n");
my_WHITE;
goto STEPEND;
STEP10://感謝語
my_YELLOW;
printf("\n");
printf("遊戲結束,謝謝參與.\n");
printf("\n");
my_WHITE;
STEPTRY://回味區域
printf("1.再來一局.\n");
printf("2.回到菜單.\n");
my_SKYBLUE;
printf("請選擇:");
int iTry;
scanf("%d", &iTry);
if (iTry == 1)
{
goto STEP2;
}
if (iTry == 2)
{
goto STEP1;
}
my_WHITE;
STEPEND://我還會回來的!
system("pause");
}
//---------------------------------------------------------------------------
//函數名稱:TitleTop3Line
//作用:輸出标題
//輸入:暫無
//輸出:暫無
//---------------------------------------------------------------------------
void TitleTop3Line()
{
my_WHITE;
printf("┏━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ ");
my_YELLOW;
printf("井字棋(圈叉棋)");
my_WHITE;
printf(" ┃\n");
printf("┣━━━━━━━━━━━━━━━━━━━━━━┫\n");
}
//---------------------------------------------------------------------------
//函數名稱:ShowFirstView
//作用:顯示目錄頁
//輸入:暫無
//輸出:暫無
//---------------------------------------------------------------------------
void ShowFirstView()
{
system("cls");
my_WHITE;
TitleTop3Line();
printf("┃ ┃\n");
printf("┃ ┃\n");
printf("┃ 請選擇遊戲模式: ┃\n");
printf("┃ ┃\n");
printf("┃ ");
MAGENTA;
printf("0. 選擇人機先手.");
my_WHITE;
printf(" ┃\n");
printf("┃ ┃\n");
printf("┃ ");
my_BLUE;
printf("1. 選擇人機後手.");
my_WHITE;
printf(" ┃\n");
printf("┃ ┃\n");
printf("┃ ");
my_GREEN;
printf("2. 選擇人人對戰.");
my_WHITE;
printf(" ┃\n");
printf("┃ ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━┛\n");
my_SKYBLUE;
printf("請選擇: ");
my_WHITE;
}
//---------------------------------------------------------------------------
//函數名稱:DrawTable
//作用:刷新棋盤
//輸入:暫無
//輸出:暫無
//---------------------------------------------------------------------------
void DrawTable()
{
system("cls");
my_WHITE;
TitleTop3Line();
printf("┃ ┃\n");
printf("┃ ┃\n");
printf("┃ ");
DrawTableCell(Games[0][0]);//這裡輸入第1個[0][0]
printf("┃");
DrawTableCell(Games[0][1]);//這裡輸入第2個[0][1]
printf("┃");
DrawTableCell(Games[0][2]);//這裡輸入第3個[0][2]
printf(" 7 8 9 ┃\n");
printf("┃ ━╋━╋━ ┃\n");
printf("┃ ");
DrawTableCell(Games[1][0]);//這裡輸入第1個[1][0]
printf("┃");
DrawTableCell(Games[1][1]);//這裡輸入第2個[1][1]
printf("┃");
DrawTableCell(Games[1][2]);//這裡輸入第3個[1][2]
printf(" 4 5 6 ┃\n");
printf("┃ ━╋━╋━ ┃\n");
printf("┃ ");
DrawTableCell(Games[2][0]);//這裡輸入第1個[2][0]
printf("┃");
DrawTableCell(Games[2][1]);//這裡輸入第2個[2][1]
printf("┃");
DrawTableCell(Games[2][2]);//這裡輸入第3個[2][2]
printf(" 1 2 3 ┃\n");
printf("┃ ┃\n");
printf("┃ ┃\n");
printf("┃ ");
if (iPlayer >= 11 && iPlayer <= 12)
{
printf("恭喜 ");
DrawTableCell(iPlayer -10);
printf("玩家%d 獲得勝利! ┃\n", iPlayer-10);
}
else if(iPlayer >= 1 && iPlayer <= 2)
{
printf("現在由 ");
DrawTableCell(iPlayer);
printf("玩家%d 下子 ┃\n",iPlayer);
}
else if (iPlayer == 13)
{
printf("抱歉,您輸了,請繼續努力。 ┃\n");
}
else if (iPlayer == 6)
{
printf("和局了,握握手好朋友,請繼續努力。 ┃\n");
}
else if (iPlayer == 7)
{
printf("恭喜恭喜,您平局了AI,請繼續努力。 ┃\n");
}
printf("");
//printf(" ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━┛\n");
my_SKYBLUE;
printf("請選擇: 對應的位置開始下棋: ");
my_WHITE;
}
//---------------------------------------------------------------------------
//函數名稱:DrawTableCell
//作用:畫棋子
//輸入:int iCell
//輸出:暫無
//---------------------------------------------------------------------------
void DrawTableCell(int iCell)
{
switch (iCell)
{
case 0:
{
printf(" ");
}break;
case 1:
{
my_RED;
printf("〇");
my_WHITE;
}break;
case 2:
case 3:
{
my_SKYBLUE;
printf("Ⅹ");
my_WHITE;
}
}
}
//---------------------------------------------------------------------------
//函數名稱:is_PressOk
//作用:判斷當前選擇是否可以
//輸入:int iPress,int AndP
//輸出:可以就true 否則false
//---------------------------------------------------------------------------
BOOL is_PressOk(int iPress,int AndP )
{
if (iPress >= 1 && iPress <= 9)
{
if (Games[2 - (iPress - 1 ) / 3][(iPress - 1) % 3 ] == 0)//0為 未占用
{
if (AndP)//如果參數下子 就下
{
Games[2 - (iPress - 1) / 3][(iPress - 1) % 3 ] = iPlayer;
}
return true;
}
}
return false;
}
//---------------------------------------------------------------------------
//函數名稱:is_Over
//作用:判斷是否結束
//輸入:int iPlay
//輸出:int 赢家
//---------------------------------------------------------------------------
int is_Over(int iPlay)
{
int iReturn;
//行相同 //列相同
for (int i = 0; i < 3;i )
{
//行相同 //列相同
if ((Games[i][0] == iPlay && Games[i][1] == iPlay && Games[i][2] == iPlay)
|| (Games[0][i] == iPlay && Games[1][i] == iPlay && Games[2][i] == iPlay))
{
iReturn = iPlay 10;//勝負已分
return iReturn;
}
}
if ((Games[0][0] == iPlay && Games[1][1] == iPlay && Games[2][2] == iPlay)
|| (Games[0][2] == iPlay && Games[1][1] == iPlay && Games[2][0] == iPlay))
{
iReturn = iPlay 10;//勝負已分
return iReturn;
}
//放滿了 和局
int iFull = 0;
for (int i = 0; i < 9; i )
{
if(*(&Games[0][0] i) != 0)
iFull ;
}
if (iFull == 9)
{
if (GameType == 2)
{
iReturn = 6;
return iReturn;
}
else
{
iReturn = 7;
return iReturn;
}
}
return 0;
}
//---------------------------------------------------------------------------
//函數名稱:CleanGame
//作用:清空棋盤
//輸入:暫無
//輸出:暫無
//---------------------------------------------------------------------------
void CleanGame()
{
//int *p = &Games[0][0];
for (int i = 0; i < 9; i )
{
*(&Games[0][0] i) = 0;
}
}
//---------------------------------------------------------------------------
//函數名稱:EasyAI
//作用:簡單人工智能
//輸入:暫無
//輸出:暫無
//---------------------------------------------------------------------------
void EasyAI()
{
//搶勝
for (int i = 0; i < 9; i )
{
if (*(&Games[0][0] i) == 0)
{
*(&Games[0][0] i) = 3;
if (is_Over(3) != 13)
{
*(&Games[0][0] i) = 0;
}
else
{
return;
}
}
}
//搶救
for (int i = 0; i < 9; i )
{
if (*(&Games[0][0] i) == 0)
{
*(&Games[0][0] i) = 1;
if (is_Over(1) != 11)
{
*(&Games[0][0] i) = 0;
}
else
{
*(&Games[0][0] i) = 3;
return;
}
}
}
//搶中心
if (Games[1][1] == 0)
{
Games[1][1] = 3;
return;
}
//搶四角
int Tmp[4] = { 0, 2, 6, 8 };
int Tmp2[4];
int iCount = 0;
for (int i = 0; i < 4; i )
{
if (*(&Games[0][0] Tmp[i]) == 0)
{
Tmp2[iCount ] = Tmp[i];
}
}
if (iCount)
{
iCount = rand() % iCount;
*(&Games[0][0] Tmp2[iCount]) = 3;
return;
}
//随便丢
int Tmp3[4] = { 1, 3, 5, 7 };
memcpy(Tmp, Tmp3, 9 * sizeof(int));
iCount = 0;
for (int i = 0; i < 4; i )
{
if (*(&Games[0][0] Tmp[i]) == 0)
{
Tmp2[iCount ] = Tmp[i];
}
}
if (iCount)
{
iCount = rand() % iCount;
*(&Games[0][0] Tmp2[iCount]) = 3;
return;
}
}
趕緊關注來報名更多小項目實戰吧
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!